簡體   English   中英

AS3鍵盤控制字符-多次按鍵動畫問題

[英]AS3 Keyboard Controlled Character - Animation problems with multiple key presses

我在一個游戲中有鍵盤控制的角色,當沒有
按下鍵,並為上下左右方向選擇四個不同的動畫
(無對角線運動)。

因此,當按下左鍵時,_character在屏幕上向左移動並播放左動畫。 釋放鍵/向上鍵時,靜止幀會在角色靜止的地方播放。

這可以在緩慢的速度下正常工作,但是當按下多個鍵來圍繞障礙物等進行操作時,角色通常會停留在固定位置,並且僅在延遲后才能播放動畫。 使用速度可以使Movieclip的運動很好,但是動畫會受到影響。

這肯定與加鎖處理程序有關。 我是一個初學者,所以我確定我只是無法理解一些簡單的邏輯,但是我無法弄清楚! 請幫幫我。 無論我以多快的速度敲擊按鍵,我都需要播放動畫,並且只有當什么都沒有按下時,我才能看到靜止的圖像。

具有速度變量的同級角色。

package
{
    import flash.display.MovieClip;
    import flash.display.DisplayObject

        [Embed(source="../swfs/characterRes.swf", symbol="Character")]
        public class Character extends MovieClip
        {
            //Public properties
            public var vx:int = 0;
            public var vy:int = 0;

            public function Character()
            {
            }
        }   
}

添加了Keydown和KeyUp偵聽器。

_stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
            _stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler); 

在enterFrame中,字符X和Y的位置與速度相關

private function enterFrameHandler(event:Event):void
        {   
            //Move the game character and check its stage boundaries
            _character.x += _character.vx; 
            _character.y += _character.vy;
        }

摳像處理程序使用箭頭和WASD控制速度並向特定幀播放該方向(帶有嵌入式動畫)

private function keyDownHandler(event:KeyboardEvent):void
        {
            if (event.keyCode == Keyboard.LEFT || event.keyCode == 65 )
            {
                _character.vx = -4;
                _character.gotoAndStop(4);
            }
            else if (event.keyCode == Keyboard.RIGHT || event.keyCode == 68)
            {
                _character.vx = 4;
                _character.gotoAndStop(5);
            }
            else if (event.keyCode == Keyboard.UP || event.keyCode == 87 )
            {
                _character.vy = -4;
                _character.gotoAndStop(2);
            }
            else if (event.keyCode == Keyboard.DOWN || event.keyCode == 83)
            {
                _character.vy = 4;
                _character.gotoAndStop(3);
            }   
        }

鍵控處理器停止速度並播放第一幀,即靜止圖像。

private function keyUpHandler(event:KeyboardEvent):void
        {
            if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT 
                || event.keyCode == 65 || event.keyCode == 68)
            {
                _character.vx = 0;
                _character.gotoAndStop(1);
            } 
            else if (event.keyCode == Keyboard.DOWN || event.keyCode == Keyboard.UP 
                || event.keyCode == 87 || event.keyCode == 83 )
            {
                _character.vy = 0;
                _character.gotoAndStop(1);
            }
        }

我還將靜止圖像變成鮮紅色,以使我更容易發現,一旦我開始朝不同方向移動角色,我就會看到紅色! (從字面上和比喻!)

更新資料

Vesper的答案很好地解決了動畫狀態問題,但是這個新的控制系統似乎想沿對角線行駛,從而在不需要的路徑上發送角色。

我的舞台是一個50像素正方形的網格。 角色是50px和50px的盒子(帶有碰撞檢測),周圍有50px的邊框,因此角色可以在舞台上操縱。

如果我按下/保持一個方向,則角色移動沒有問題(從左到右,也可以從上到下也可以。),但是如果我向左走,然后向下或從上到右,依次類推,則角色將沿該方向移動,然后繼續沿該方向移動那些盒子。 當我在沒有盒子的情況下進行測試時,角色會沿該方向對角線繼續。

因此,如果我想順時針旋轉一個框(從框的左下角開始),我將按向上,然后按向右,如果我不迅速向下按,則角色將再次向上和向右移動,朝頂部移動在舞台的右邊。 (如果釋放鍵,字符會停止。)

因此,如果我從相對的updown或leftright變量中按下兩個鍵,則它想沿對角線移動。 任何想法如何解決這個問題?

最終更新

Vesper的答案解決了我原來的動畫問題。 我將提出新的問題來處理其余的查詢。

實際上,您實際上有四個事實上的獨立鍵狀態:按下/釋放的向上鍵,向下鍵,向左鍵,向右鍵。 從技術上講,一次可以按下兩個相對的鍵可以執行特殊的操作,在您的情況下不需要,但是仍然值得一提。 因此,您需要分別處理所有這些字符,然后才選擇角色的臉部位置。

    var bDown:Boolean=false;
    var bUp:Boolean=false;
    var bLeft:Boolean=false;
    var bRight:Boolean=false;
    // declare vars to store key states. You can use an array if you want

    private function keyDownHandler(event:KeyboardEvent):void
    {
        if (event.keyCode == Keyboard.LEFT || event.keyCode == 65 )
        {
            bLeft=true;
            // now, instead of directly attaching the movement, just set flag
        }
        else if (event.keyCode == Keyboard.RIGHT || event.keyCode == 68)
        {
            bRight=true;
        }
        else if (event.keyCode == Keyboard.UP || event.keyCode == 87 )
        {
            bUp=true;
        }
        else if (event.keyCode == Keyboard.DOWN || event.keyCode == 83)
        {
            bDown=true;
        }   
    }

與鍵處理程序相同,將值設置為false。 現在,根據按下的鍵來解析實際角色的動作。 最好的地方是Enter框架處理程序-很好的事情是您已經將其放置在適當的位置。

    private function enterFrameHandler(event:Event):void
    {   
        var updown:Boolean=Boolean(!(bUp==bDown)); 
        // if both are true or both are false, this is false. If this is true, 
        // we are moving upwards or downwards
        var leftright:Boolean=Boolean(!(bLeft==bRight));
        // same here
        if (!updown && !leftright) {
            // not moving anywhere
            _character.gotoAndStop(1);
            _character.vy=0;
            _character.vx=0; 
            // other mechanics might be in place in case you decide to implement inertia, for example
        } else {
            if (bUp) {
                _character.vy=-4; // hardcoding this might get you issues later
                // will still do for today's task
                _character.gotoAndStop(2);
            } else if (bDown) {
                _character.vy=4;
                _character.gotoAndStop(3);
            } 
            // one side parsed. Note, with this sequence the leftwards or rightwards
            //animation supersedes up/down. But, we don't have diagonals, so there should be superseded animation
            if (bLeft) {
                _character.vx=-4;
                _character.gotoAndStop(4);
            } else if (bRight) {
                _character.vx=4;
                _character.gotoAndStop(5);
            } 
        }
        // Okay, now velocity and facing is set, proceed with move
        //Move the game character and check its stage boundaries
        _character.x += _character.vx; 
        _character.y += _character.vy;
    }

暫無
暫無

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

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