2013-02-18 92 views
0

我真的是AS3的新手,我曾經在AS2編碼,但是一年多的時間我不使用Flash或ActionScript。 我的問題是,當我按左或右箭頭,將左右角色左右移動時,動畫就停在第一幀。空閒的動畫可以正常工作,但每次按下按鈕時,步行動畫就會在第1幀中開始和停止。AS3動畫在第1幀停止

vector.gotoAndPlay("parado"); 

var leftKeyDown:Boolean = false; 
var rightKeyDown:Boolean = false; 
var mainSpeed:Number = 7; 

vector.addEventListener(Event.ENTER_FRAME, moveChar); 
function moveChar(event:Event):void{ 

    if(leftKeyDown){ 
     if(vector.currentLabel!="andando"){ 
      vector.x -= mainSpeed; 
      vector.scaleX=-1; 
      vector.gotoAndPlay("andando"); 
     } 
    } else { 
     if(rightKeyDown){ 
      if(vector.currentLabel!="andando") { 
       vector.x += mainSpeed; 
       vector.scaleX=1; 
       vector.gotoAndPlay("andando"); 
      } 
     } 
    } 
} 

stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKeysDown); 
function checkKeysDown(event:KeyboardEvent):void{ 

    if(event.keyCode == 37){ 
     leftKeyDown = true; 
    } 

    if(event.keyCode == 39){ 
     rightKeyDown = true; 
    } 
    } 
    stage.addEventListener(KeyboardEvent.KEY_UP, checkKeysUp); 
    function checkKeysUp(event:KeyboardEvent):void{ 

    if(event.keyCode == 37){ 
     leftKeyDown = false; 
    } 
    if(event.keyCode == 39){ 
     rightKeyDown = false; 
    } 
} 

僅供參考:「parado」是我的空閒動畫,「andando」是我的步行動畫。

回答

3

它不停在第1幀,它只是一直髮送回第1幀。考慮按住按鈕幾秒後會發生什麼情況:

  • rightKeyDown開始爲假。該分支中沒有代碼被執行。

  • 用戶持有的右箭頭,rightKeyDown成爲真正

  • moverChar檢查rightKeyDown,認爲它是真實的,併發送字符「andando」。

  • moveCharmoveChar再次運行,看到rightKeyDown是真的,但角色仍然在「andando」框架,所以它什麼也沒有。

  • 字符在「andando」之後進入幀。

  • moverChar運行,rightKeyDown仍然如此,但框架不再處於「andando」狀態,所以它重新回到它。

,並在用戶按住該鍵的所有時間重複,所以它似乎被卡住框1和2個

幾個備選方案來解決這個問題:


僅當用戶按下或釋放按鈕時才更改關鍵幀,而不是每個幀之間。

function moveChar(event:Event):void{ 

    if(leftKeyDown){ 
     vector.x -= mainSpeed; 
     // No frame checks or frame changes here. 
    } 
    [...] 

function checkKeysDown(event:KeyboardEvent):void{ 
    if(event.keyCode == 37){ 
     leftKeyDown = true; 
     vector.scaleX=-1; 
     vector.gotoAndPlay("andando"); 
     // Send the character to the correct frame when the user presses the key. 
    } 
    [...] 

function checkKeysUp(event:KeyboardEvent):void{ 
    if(event.keyCode == 37){ 
     leftKeyDown = false; 
     vector.gotoAndPlay("parado"); 
     // Send it back to idle when the user releases the key. 
    } 
    [...] 

另一種選擇是每個動畫存儲本身就是一個影片剪輯,並把它們放在一個容器影片剪輯。所以角色符號中只有兩個框架,一個用於空閒動畫,另一個用於步行動畫。在你的代碼中,你使用gotoAndStop而不是gotoAndPlay,所以每幀調用它並不重要。


編輯:也嘗試分組您的條件。

} else { 
    if(rightKeyDown){ 
     if(vector.currentLabel!="andando") { 
      vector.x += mainSpeed; 
      vector.scaleX=1; 
      vector.gotoAndPlay("andando"); 
     } 
    } 
} 

可以改寫爲

} else if (rightKeyDown && vector.currentLabel != "andando"){ 
    vector.x += mainSpeed; 
    vector.scaleX=1; 
    vector.gotoAndPlay("andando"); 
} 
+0

謝謝,夥計。現在工作正常,我真的被困在這個問題上。但是你救了我,謝謝你! – CptAwesome 2013-02-18 18:04:04