2013-09-20 4 views
0

Я создаю флеш-игру. Вот 3 разных атак с различными анимациями (клавиатура bind z, x, c).Action Script 3. Продолжайте анимацию до последнего кадра без прерывания

Проблема № 1

Например Если я использую attack1 (нажав «Z») Это показывает анимацию с ~ 100 кадров, но если во время анимации я нажав attack2 (х) Это отменяет attack1 анимацию и начало играя attack2 анимация. Мне нужно сделать это, когда во время анимации его нельзя прервать, используя другую анимацию.

Проблема № 2

Если я использую attack1 (нажав "Z") и удерживайте "Z" анимации замерзает до кнопки "Z" Я отпускаю. Мне нужно сделать это. Если я нажму кнопку любой атаки, сразу начну воспроизводить анимацию, и ее нельзя прервать/приостановить, нажав ту же кнопку.

В каждой атаке MovieClip в последнем фрейме я добавил код MovieClip(this.parent).gotoAndStop("stay");, что после анимированной анимации играл. Он начал воспроизводить анимацию «Stay» (эта часть работает).

Key_Down функция:

private function key_down(event:KeyboardEvent) 
{ 
    if (event.keyCode == 90) 
    { 
     attack1 = true; 
    } 
    if (event.keyCode == 88) 
    { 
     attack2 = true; 
    } 
    if (event.keyCode == 67) 
    { 
     attack3 = true; 
    } 

} 

Key_Up функция: функция

private function key_up(event:KeyboardEvent) 
{ 

    if (event.keyCode == 90) 
    { 
     attack1 = false; 
    } 
    if (event.keyCode == 88) 
    { 
     attack2 = false; 
    } 
    if (event.keyCode == 67) 
    { 
     attack3 = false; 
    } 
} 

startAttack()

private function startAttack() { 

      if (attack1) 
      { 
       Hero.gotoAndStop("attack1"); 
      } 
      if (attack2) 
      { 
       Hero.gotoAndStop("attack2"); 
      } 
      if (attack3) 
      { 
       Hero.gotoAndStop("attack3"); 
      } 
} 

ответ

0

В startAttack вы можете проверить, если некоторые атаки в действии. Вы можете использовать состояние или проверить фреймы, чтобы определить, может ли начать новую атаку.

1

В вашем коде Герой может атаковать тремя способами одновременно, но, насколько я понимаю, вы не хотите этого. Итак, почему вы сделали три отдельные переменные. Сделайте это и назовите его «атакой». Его значением будет количество типов атаки. Вы также можете создать массив, который отображает количество Нападения на клавиатурный:

var codes:Array = new Array(0, 90, 88, 67); 
var attack:Number = 0; 

и использовать его в Key_Up и Key_Down функций. Теперь вы можете добавлять новые атаки без создания дополнительных функций ifs.

Key_Down:

if(attack > 0) return; // don't interrupt other attack 
for(var c in codes) { 
    if(codes[c] == event.keyCode) { 
     attack = c; 
     Hero.gotoAndStop("attack" + attack); 
    } 
} 

Key_Up:

for(var c in codes) { 
    if(codes[c] == event.keyCode) { 
     if(c == attack) attack = 0; 
    } 
} 

startAttack() является излишним.

+0

Спасибо за ответ, но я получаю ошибки: 3 ошибки, где 'code [1] = 9; ....': '1120: доступ к неопределенному коду свойств .' и другие' 1120: доступ к неопределенным кодам свойств . 'в этой строке' for (var c in codes) {' –

+0

У меня нет Flash прямо здесь, поэтому я пишу код с моей головы. Теперь это должно быть лучше. – tomwesolowski

+0

Спасибо, это сработало для вопроса №2 сейчас. Его нельзя прервать, нажав одну и ту же кнопку, но если во время анимации attack1 все еще прерывается с помощью анимации attack2. Как это исправить? –

0

Лучший способ не прерваться - это иметь идентификатор, если атака находится в движении. В этом случае лучше иметь Boolean inAttackMode (или что-нибудь еще) для тестирования и посмотреть, есть ли это. Это основано на youe примере

private function key_down(event:KeyboardEvent) 
{ 
    if (event.keyCode == 90) 
    { 
     attack1 = true; 
     inAttackMode = true; 
    } 
    if (event.keyCode == 88) 
    { 
     attack2 = true; 
     inAttackMode = true; 
    } 
    if (event.keyCode == 67) 
    { 
     attack3 = true; 
     inAttackMode = true; 
    } 

} 


private function startAttack() { 
       if(!inAttackMode){ 
       if (attack1) 
       { 
        Hero.gotoAndStop("attack1"); 
       } 
       if (attack2) 
       { 
        Hero.gotoAndStop("attack2"); 
       } 
       if (attack3) 
       { 
        Hero.gotoAndStop("attack3"); 
       }} 
    } 

затем положить

MovieClip(this.parent).gotoAndStop("stay"); 
    inAttackMode = false; 

или еще лучше назначать идентификаторы для каждой атаки, как inAttackMode1 истинно, то другое нападение не может быть воспроизведен еще.

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