2014-01-25 76 views
0

我有一個鍵盤控制字符在遊戲中有一個固定的框架,當沒有
鍵被按下,四個不同的動畫的上,下,左,右方向
(無對角線移動)。AS3鍵盤控制角色 - 動畫問題與多個按鍵

所以當左鍵被按下時,_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; 
     } 

在KeyDown處理程序使用箭頭和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的回答已經解決了動畫狀態問題精闢但是這個新的控制系統似乎想斜向地行進,它發送不需要的路徑上的字符。

我的舞臺是一個50px的方格。角色是50px和50px boxess(帶有碰撞檢測)周圍有50px的邊框,所以角色可以在舞臺上進行操控。

如果我按住一個方向,角色移動沒有問題(從左到右,也可以從上往下),但是如果我向左走然後向下或向上然後右等,角色將朝那個方向行進,然後繼續圍繞這些方框。當我測試沒有箱子時,角色沿着那個方向對角地繼續。

所以如果我想圍繞一個盒子順時針轉動(從左下方開始),我會按下,然後右鍵,如果我不很快按下,角色會向上移動並再次右鍵,朝着舞臺的右上方。 (如果鍵被釋放,字符會停止。)

所以,如果我從對立的updown或leftright變量中按下兩個鍵,它想要對角線移動。任何想法如何解決這個問題?

最後更新

的Vesper的回答解決了我的原創動漫的問題。我會提出新的問題來處理剩下的問題。

回答

0

實際上,您實際上有四個事實上獨立的按鍵狀態,上按鍵按下/釋放,下按鍵,左鍵,右鍵。從技術上講,可以在一次按下兩個相反的按鍵的情況下執行特殊操作,在您的情況下不需要,但仍然值得一提。所以,你分開處理所有的人,然後才選擇你的角色應該在哪裏面對。

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也是如此。現在按照按鍵解析實際角色的移動。最好的地方是輸入框架處理程序 - 你已經擁有它的好東西。

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

傻了,我把updown和leftright變量放在程序的開頭,而不是在輸入框中。現在它運行得非常好,播放適當的動畫並在關閉時停止。然而,這些控件有點失控,角色會圍繞障礙選擇自己的方向。那是因爲機構處理器每秒發出六十次指令嗎?任何想法如何解決這個問題? – Rookie

+0

這不太可能是因爲速度的原因,但您可以考慮將幀速率降低到30,例如最有可能您的遊戲最終會過大而無法保持60fps。但的確如此,如果新框架是相同的,你可以從字符中收集'currentFrame'屬性來不調用'gotoAndStop()'。你描述的其他行爲對我來說還不清楚。 – Vesper

+0

嗨,抱歉建議速度/機架是問題,它與此無關。我的問題不再是動畫,而是實際的動畫片段對象的移動。我在主要問題部分添加了更新。如果你能再次看看並幫助,我會很感激。 – Rookie