簡體   English   中英

AS3碰撞檢測或鍵盤控制更改播放器的MovieClip路徑

[英]AS3 Collision detection or Keyboard Control altering my player MovieClip path

我正在制作一個迷宮般的游戲,其中玩家使用箭頭或WASD控制舞台周圍的動畫片段(_character)並在一定時間內收集東西。 MovieClip有五個不同的幀,每個幀都有各自的狀態動畫,分別向左,向右,向上,向下和固定移動。

在舞台上有帶有碰撞檢測功能的方塊/盒子,我需要能夠在所有不同方向上圍繞它們進行操縱。

我的問題是我不能似乎得到了MovieClip本身在同一時間工作的影片剪輯正確的運動里面的動畫。

我當前的控件可以在巨大的障礙物周圍滑動,在不按任何鍵時停止並播放相關的_character動畫,但是當按下兩個對角線方向鍵時,即使我松開其中一個鍵,MovieClip也會沿對角線移動。

例如,如果舞台上有一個正方形/盒子,我想順時針移動它(從頂部開始),那么我應該能夠再次向右,向下,向左,向上,然后向右按下以返回到原始位置。

但是,使用我當前的代碼,我將向右,向下(在我可以按向左移動框之前)按一下,我的Movieclip將移動到舞台的右下角(向下+向右)。

即使我將手指從DOWN(下)鍵上移開,然后按RIGHT(向右),它也不會自行校正並向右移動,它停留在對角線位置!

該圖像給出了按下LEFT,然后在游戲開始時按下DOWN的示例。

游戲動作

當我從舞台上移走所有盒子以測試空白區域中的運動時,如果按下兩個按鈕,movieclip對象仍會固定在對角線方向,沒有盒子可以移動,只是移動到舞台的一角它是針對的。

防止這是我的問題,我不能只禁用多個按鍵,因為那樣在迷宮中移動變得太困難了(_character必須准確地排成一行)

當前代碼:

方向變量

private var _bUp:Boolean = false;
private var _bDown:Boolean = false;
private var _bLeft:Boolean = false;
private var _bRight:Boolean = false;

在KeyDown處理程序中為true的變量。

private function keyDownHandler(event:KeyboardEvent):void
        {


            if (event.keyCode == Keyboard.LEFT || event.keyCode == 65 )
            {
                _bLeft=true;

            }
            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;

            }

在KeyUp中為False。

private function keyUpHandler(event:KeyboardEvent):void
    {
                    if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT 
                    || event.keyCode == 65 || event.keyCode == 68)
            {
                    _bLeft=false;
                    _bRight=false;

            } 
            else if (event.keyCode == Keyboard.DOWN || event.keyCode == Keyboard.UP 
                    || event.keyCode == 87 || event.keyCode == 83 )
            {
                _bUp=false;
                _bDown=false;

            }

在enterFrameHandler _character中,將移動速度並播放動畫。 如果未按任何鍵,則力度為0,_character保持不變。 然后角色movieclip獲得要移動的速度值,我們檢查舞台邊界,然后與框碰撞。

private function enterFrameHandler(event:Event):void
        {   

                            var _updown:Boolean=Boolean(!(_bUp==_bDown)); 
                            var _leftright:Boolean=Boolean(!(_bLeft==_bRight));

                        if (!_updown && !_leftright) 
                        {
                            // not moving anywhere
                            _character.gotoAndStop(1);
                            _character.vy=0;
                            _character.vx=0; 

                        } 
                        else
                        {
                            if (_bUp) 
                            {
                                _character.vy=-4;
                                _character.gotoAndStop(2);
                            } 
                            else if (_bDown)
                            {
                                _character.vy=4;
                                _character.gotoAndStop(3);
                            } 

                            if (_bLeft)
                            {
                                _character.vx=-4;
                                _character.gotoAndStop(4);
                            } 
                            else if (_bRight)
                            {
                                _character.vx=4;
                                _character.gotoAndStop(5);
                            } 
                        }

                    _character.x += _character.vx; 
                    _character.y += _character.vy;
                    checkStageBoundaries(_character);
                    //Collisions
                    Collision.block(_character,_box1);
                        Collision.block(_character,_box2);

與盒子發生碰撞。^^^

附帶說明

不確定它的重要性,但是我的老式鍵盤方法僅使用enterFrame Handler將速度鏈接到角色對象,而KeyDown Handler移動了chacters速度。 這使用了相同的碰撞檢測盒,但是移動動畫片段對象沒有問題

該代碼是:

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);
                }   
            }

// Key up handler stops velocity and plays first frame which is the stationary image.

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);
                }
            }  

這種移動技術可以使MovieClip完美地在舞台上移動,沒有奇怪的路線, 但是通過多次按鍵操作動畫無法正確播放,因此我切換到布爾變量和enterFrame控件。

結論

我不知道是否應該將碰撞檢測或鍵盤控件歸咎於我,但我只想能夠在盒子周圍快速操縱播放器Movieclip並播放適當的狀態動畫。

我已經看過前面提到的基於圖塊的設計,但是通過上面的兩種不同的鍵盤嘗試,我可以得到想要的。 當然,我可以在不將整個設計重新設計為瓷磚的情況下獲得兩全其美的感覺嗎? 請幫幫我!

得到它了。 我沒有告訴您_character的速度應該在解析當前運動之前清除。 抱歉。 因此,您添加以下內容:

_character.vx=0;
_character.vy=0;

進入函數enterFrameHandler的開頭,這應該使您的char正確運行。

暫無
暫無

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

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