在Flash Actionscript 3.0中,如何为播放器移动创建平滑的键盘控件?

时间:2010-02-12 21:05:24

标签: actionscript-3 flash-cs3

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

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

这会在开始时产生缓慢,缓慢的混蛋。我知道这样做更顺畅,响应更快,但不知道从哪里开始。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

对于平滑键,我建议使用Timer或onEnterFrame来经常轮询键以获得平滑控件。它将完成工作,但需要付出一定的代价。如果你已经完成其余的逻辑,那么这应该适合ok:

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, 乔治

答案 1 :(得分:0)

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

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

addEventListener(KeyboardEvent.KEY_DOWN, yourHandler, true)

如果您使用捕获,如果应用程序本身正在侦听事件,则必须执行此操作,然后您将获得一定的延迟,并且接口越复杂,此延迟将越大。如果这些事件必须在一个巨大的层次结构中发挥作用,这可能是显而易见的。如果有很多精灵,这可能会加剧这个问题。

你可以做的是让焦点调度的sprite成为控制器类为每个sprite监听的自定义事件。控制器类将有一个移动event.currentTarget的处理程序,但是您计划完成它。

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

答案 2 :(得分: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;
    }

}