2013-02-18 3 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; 
    } 
} 

FYI: «parado» - это моя простая анимация, а «andando» - моя анимация.

ответ

3

Это не останавливается в кадре 1, его просто отправляют обратно в кадр 1 все время. Рассмотрим, что происходит, когда вы держите нажатой кнопку в течение нескольких секунд:

  • rightKeyDown начинается как ложь. Никакой код в этой ветке не выполняется.

  • Пользователь держит стрелку вправо, rightKeyDown становится истинным

  • moverChar проверки rightKeyDown, видит, что это правда, и посылает символ «andando».

  • moveChar снова запускается, видит rightKeyDown, но символ все еще находится на рамке «andando», поэтому он ничего не делает.

  • Персонаж переходит в рамку после "andando".

  • moverChar работает,по-прежнему верен, но рамка больше не находится на «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

Смежные вопросы