我正在尝试使用 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 启动,他就开始朝正确的方向奔跑。我能做些什么呢?如果您需要进一步说明或更多代码,请告诉我。