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 をトレースすると、A を押しただけなのに、D と A の両方が同時に解放されたと表示され、解放されませんでした。これにより、保持されているキーの辞書から D と A の両方が削除され、プレイヤーは一瞬停止し、handleKeyDown が作動するとすぐに正しい方向に走り始めます。これについて何ができますか?さらに明確にする必要がある場合や、より多くのコードが必要な場合はお知らせください。