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

4

1 に答える 1

1

私は実際の問題がここにあることを発見しました。仕事から家に帰ると、私のゲームは現在のコードで完全に正常に動作し、今日仕事に戻ると、私のゲームは正常に動作しませんでした. 問題は特に私のキーボードにあることが判明しました。USB コンバーターに接続された Ps/2 ケーブルで古いキーボードを使用しています。キーボードを USB キーボードに交換したところ、問題はありませんでした。この種の問題を無視したくないので、私の Ps/2 ケーブル キーボードでこの問題を回避する方法を見つける予定です。

于 2013-06-18T16:21:52.780 に答える