AS3键盘控制

| 我有一个as3函数,可使用键盘控制影片剪辑: 包 {
import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.events.Event;

public class Main_Character_Two extends MovieClip
{
    var vx:int;
    var vy:int;

    public function Main_Character_Two()
    {
        init();
    }
    function init():void
    {
        //initialize variables
        vx = 0;
        vy = 0;

        //Add event listeners
        stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
        stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
        addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }
    function onKeyDown(event:KeyboardEvent):void
    {
        if (event.keyCode == Keyboard.LEFT)
        {
            vx = -5;
        }
        else if (event.keyCode == Keyboard.RIGHT)
        {
            vx = 5;
        }
        else if (event.keyCode == Keyboard.UP)
        {
            vy = -5;
        }
        else if (event.keyCode == Keyboard.DOWN)
        {
            vy = 5;
        }
    }
    function onKeyUp(event:KeyboardEvent):void
    {
        if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT)
        {
            vx = 0;
        }
        else if (event.keyCode == Keyboard.DOWN || event.keyCode == Keyboard.UP)
        {
            vy = 0;
        }
    }
    function onEnterFrame(event:Event):void
    {
        //Move the player
        player.x += vx;
        player.y += vy;
    }
}
} 可以,但是主要的问题是,当您按向右键(并按住不放)然后按向左键时,字符将向左移动,但是当您释放向左键时(仍然按住向右键)角色就停止了。我该如何做才能使角色在这种情况下再次开始向右移动(如果在Ive释放左键之后Im仍然按住右键) 谢谢     
已邀请:
您可以将\'player \'定位代码放入
Event.ENTER_FRAME
循环中,并使用
KeyboardEvent.KEY_DOWN
KeyboardEvent.KEY_UP
设置布尔值并将播放器定位在循环中,如下所示: var leftIsPressed:Boolean = false; var rightIsPressed:Boolean = false; var upIsPressed:Boolean = false; var downIsPressed:Boolean = false; var speed:Number = 5; var vx:Number = 0; var vy:Number = 0; stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler); stage.addEventListener(KeyboardEvent.KEY_UP,keyUpHandler); stage.addEventListener(Event.ENTER_FRAME,enterFrameHandler); 函数keyDownHandler(e:KeyboardEvent):void {     开关(e.keyCode){         case Keyboard.LEFT:leftIsPressed = true;打破;         case Keyboard.RIGHT:rightIsPressed = true;打破;         case Keyboard.UP:upIsPressed = true;打破;         case Keyboard.DOWN:downIsPressed = true;打破;     } } 函数keyUpHandler(e:KeyboardEvent):void {     开关(e.keyCode){         case Keyboard.LEFT:leftIsPressed = false;打破;         case Keyboard.RIGHT:rightIsPressed = false;打破;         case Keyboard.UP:upIsPressed = false;打破;         case Keyboard.DOWN:downIsPressed = false;打破;     } } 函数enterFrameHandler(e:Event):void {     vx = -int(leftIsPressed)* speed + int(rightIsPressed)* speed;     vy = -int(upIsPressed)* speed + int(downIsPressed)* speed;     player.x + = vx;     player.y + = vy; } [编辑]添加了更详细的示例。 当然,在这种情况下,如果同时按下左右键,将导致
0
偏移。     
您可以聆听
KeyboardEvent.KEY_UP
来确定何时释放琴键,这样您就可以追踪哪些琴键被按住。     
仅当按键从“向上”状态变为“向下”状态时才触发
KeyboardEvent.KEY_DOWN
事件,因此您的角色在您将手指从LEFT键上抬起后便会停止,因为没有新的
KEY_DOWN
事件被触发会导致角色移动。 您可能可以通过添加一个ѭ3checks事件来完成操作,该事件检查事件触发时是否查看是否按住了其他箭头键,但是您可能需要将当前代码重构为避免重复自己。     
要了解此现象,需要对事件模型有基本的了解,该事件是键盘输入所基于的。它在AS3中的工作方式与在AS2中不同。 当您按下一个键时,将触发一个事件以调用一个函数-但是,仅在按下该键时才触发一次。事件处理程序不检查键是否已按下。 (尝试在onKeyDown函数中将对象的x / y值加5而不是vx;您会发现角色仅在按下某个键时移动,而在按住该键时不移动。) 同样,释放键时,会触发一个事件以调用函数-但在主动释放键时,该事件仅触发一次。当钥匙正坐在那里时,不会触发任何事件。 在此基础上...您能找到当前问题的根源吗?
function onKeyUp(event:KeyboardEvent):void
{
    if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT)
    {
        vx = 0;
    }
    else if (event.keyCode == Keyboard.DOWN || event.keyCode == Keyboard.UP)
    {
        vy = 0;
    }
}
如果找不到,就是这个方块。
    if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT)
    {
        vx = 0;
    }
该语句告诉您的程序,如果按下向右或向左键,则将速度设置为零。但是,由于Flash仅在您首次按下按键时才检查按键按下,因此按住某个按键不会触发onKeyDown函数。因此,如果同时按住左右两个不放,则将速度设置为零。 Corey在这里有一个合理的解决方案,还有其他一些原因,您可能想要使用切换的布尔值来检查键盘输入(主要原因是您不会得到任何重复延迟)。 我希望这个答案对您有所帮助-一点点知识就能带来美好的事物。祝好运。     

要回复问题请先登录注册