簡體   English   中英

當我快速切換按鍵時,為什么我剛剛按下的按鍵會觸發KEY_UP事件?

[英]Why is my KEY_UP event firing for the key I just pressed when I quickly switch keys?

我正在嘗試使用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踢入,他便開始朝正確的方向奔跑。 我該怎么辦? 如果您需要進一步說明或更多代碼,請告訴我。

我發現我的實際問題在這里。 下班回家后,我的游戲在當前代碼的基礎上運行良好,今天恢復正常工作,但我的游戲運行不正常。 原來問題出在我的鍵盤上。 我使用的是Ps / 2電纜連接到USB轉換器的老式鍵盤。 當我用USB鍵盤替換鍵盤時,沒有問題。 我仍然計划為我的Ps / 2電纜鍵盤找到解決此問題的方法,因為我不想忽略這種問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM