2

我正在尝试使用 AIR 获得一个标准的键盘控制游戏来接受我的按键操作。本游戏要求能够向一个方向奔跑,并迅速转身向另一个方向奔跑;但是,当我连续从键“A”快速切换到“D”时,我的角色会停在原地片刻,然后继续,就好像我在 ON_KEY_DOWN 事件中移动我的角色一样。我了解如何使用 ENTER_FRAME 使用布尔值移动角色,并且我查看了其他人的教程(我注意到他们的教程中也有这个确切的问题)。

这是 Player.as 类的一个片段:

private function OnEnterFrame( e:Event = null ):void
{
    if ( Input.kd("W") )
    {
        this.y -= runSpeed;
        SetAnimation( RUNUP );
    }
    else if ( Input.kd("S") )
    {
        this.y += runSpeed;
        SetAnimation( RUNDOWN );
    }
    else if ( Input.kd("A" ) )
    {
        this.x -= runSpeed;
        SetAnimation( RUNLEFT );
    }
    else if ( Input.kd("D") )
    {
        this.x += runSpeed;
        SetAnimation( RUNRIGHT );
    }
    else
        SetAnimation( IDLE );
}

这是 Input 类的一个片段(它是从 Matthew Bush 那里借来的,试图研究这个奇怪的问题)

    public static function initialize(s:Stage, autoClear:Boolean = true):void {
        if(initialized) {
            return;
        }
        initialized = true;
        if(autoClear) {
            s.addEventListener(Event.ENTER_FRAME, handleEnterFrame, false, -1000, true); /// Very low priority.
        }
        s.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown, false, 0, true);
        s.addEventListener(KeyboardEvent.KEY_UP, handleKeyUp, false, 0, true);
        s.addEventListener(MouseEvent.MOUSE_UP, handleMouseUp, false, 0, true);
        s.addEventListener(MouseEvent.MOUSE_DOWN, handleMouseDown, false, 0, true);
        s.addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove, false, 0, true);
        s.addEventListener(Event.MOUSE_LEAVE, handleMouseLeave, false, 0, true);
        s.addEventListener(Event.DEACTIVATE, handleDeactivate, false, 0, true);
        stage = s;
    }

    /**
     * Record a key down, and count it as a key press if the key isn't down already.
     */
    public static function handleKeyDown(e:KeyboardEvent):void { 
        if(!keysDown[e.keyCode]) {
            keysPressed[e.keyCode] = true;
            keysDown[e.keyCode] = true;
        }
    }

    /**
     * Record a key up.
     */
    public static function handleKeyUp(e:KeyboardEvent):void {
        keysUp[e.keyCode] = true;
        delete keysDown[e.keyCode];
    }

这是输出:

Key Down: 68 //Holding D
Key Down: 65 //Let go of D and pressed A
Key Up: 68 //D KeyUp fires
Key Up: 65 //A KeyUp fires, but I only just pressed A and didn't let it go

现在,进一步澄清一个场景:假设我按住 D 使角色向右运行,此时一切都很好;我迅速放开D,然后按A转向另一个方向,这就是问题发生的地方。在追踪handleKeyUp时,它说D和A同时被释放,即使我只是按下A,它也从未被释放。这会将 D 和 A 从我的持有键字典中删除,导致玩家暂停片刻,然后一旦 handleKeyDown 启动,他就开始朝正确的方向奔跑。我能做些什么呢?如果您需要进一步说明或更多代码,请告诉我。

4

1 回答 1

1

我发现我的实际问题在这里。下班回家后,我的游戏在我当前的代码下运行得非常好,今天回来工作,我的游戏运行不正常。原来问题出在我的键盘上。我正在使用带有连接到 USB 转换器的 Ps/2 电缆的旧键盘。当我用USB键盘替换键盘时,没有问题。我仍然计划为我的 Ps/2 有线键盘找到解决此问题的方法,因为我不想忽略这类问题。

于 2013-06-18T16:21:52.780 回答