2

我是 Flash Actionscript 3.0 编程的初学者。我正在尝试为游戏中的玩家移动创建流畅的键盘控制。

我目前正在使用 addEventListener(KeyboardEvent.KEY_DOWN) 监听键盘按键,然后在处理程序函数中通过将数字添加到其 .x 或 .y 属性来移动图形。

这在开始时会产生缓慢,迟缓的混蛋。我知道有一种更流畅、更灵敏的方式来做到这一点,但不知道从哪里开始。任何帮助,将不胜感激!

4

3 回答 3

2

对于平滑键,我建议使用 Timer 或 onEnterFrame 经常轮询键以获得平滑控制。它会完成工作,但要付出一定的代价。如果您的其余逻辑都很好,那么这应该可以:

var key:int = NaN;

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress,false,0,true);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease,false,0,true);
this.addEventListener(Event.ENTER_FRAME,update,false,0,true);

function onKeyPress(event:KeyboardEvent):void {
    key = event.keyCode;
    event.stopPropagation();
}
function onKeyRelease(event:KeyboardEvent):void {
    key = NaN;
    event.stopPropagation();
}
function update(event:Event):void{
    if(key) trace(key);
}

我通过阻止它的传播来确保事件不会冒泡,并且它设置在应该是最顶层的舞台上,事件明智。此外,我只使用键,否则我在 enterFrame 处理程序中忽略它。

HTH,乔治

于 2010-02-12T22:32:29.767 回答
0

你把听众放在哪里?它是在应用程序中,还是在应该移动的精灵中?按键时精灵是否有焦点?

另外,在添加事件侦听器时,您是否使用捕获?也就是说,您是否将第三个参数设置为 true,如

addEventListener(KeyboardEvent.KEY_DOWN, yourHandler, true)

如果您使用捕获,如果应用程序本身正在侦听事件,您必须这样做,那么您将获得一定的延迟,并且接口越复杂,这种延迟会越大。如果这些事件必须在一个巨大的层次结构中上升,这可能会很明显。如果有很多精灵,这可能会加剧问题。

您可以做的是让具有焦点的精灵分派一个自定义事件,控制器类为每个精灵侦听该事件。控制器类将有一个处理程序来移动 event.currentTarget 但是您计划完成它。

另请阅读有关自定义事件以及如何使用 SystemManager 动态添加和删除侦听器的信息:http: //livedocs.adobe.com/flex/3/langref/index.html

于 2010-02-12T22:05:42.643 回答
0

最简单的例子就是这个。
在这里,您有一个可控的 Ship 类(Ship.as)。

import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.events.Event;

public class Ship extends MovieClip {

    private var speedX;
    private var speedY;

    public function Ship() {
        //constructor
        stage.addEventListener(KeyboardEvent.KEY_DOWN ,keyDown);
        stage.addEventListener(KeyboardEvent.KEY_UP ,keyUp);
        stage.addEventListener(Event.ENTER_FRAME, update);
    }

    public function keyDown(e:KeyboardEvent) {
        if(e.keyCode == 37) {
            speedX = -5;
        }
        if(e.keyCode == 38) {
            speedY = -5;
        }
        if(e.keyCode == 39) {
            speedX = 5;
        }
        if(e.keyCode == 40) {
            speedY = 5;
        }
    }

    public function keyUp(e:KeyboardEvent) {
        if(e.keyCode == 37 || e.keyCode == 39) {
            speedX = 0;
        }
        if(e.keyCode == 38 || e.keyCode == 40) {
            speedY = 0;
        }
    }

    public function update(e:Event) {
        x += speedX;
        y += speedY;
    }

}
于 2015-09-06T12:51:02.563 回答