2013-11-06 4 views
0

У меня есть пара утверждений if в функции таймера, проверяя, является ли hp врага 0. Враги добавляются в массив. Когда один враг hp достигает 0, они берутся из массива и удаляются. Когда длина массива равна 0, игра переходит на следующий уровень. По какой-то причине, когда hp первого врага достигает 0, он автоматически переходит на следующий уровень, даже не проверяя hp другого врага. Он работал на первом уровне, где у меня было только 1 враг, но на втором уровне у меня есть два врага. Я должен был бы победить второго врага, а затем первым, чтобы он перешел на следующий уровень. Я думаю, что это может иметь какое-то отношение к тому, что первый враг является первым в массиве. Любые идеи о том, как я могу изменить код, чтобы игнорировать порядок поражения противника?Проблема с порядком массива

public var enemy:Enemy = new Enemy(); 
public var enemy2:Enemy = new Enemy(); 
public var enemyArray:Array = []; 

Level Timer (Таймер, который устанавливает уровень, выполняется один раз):

if (level.levelNumber == 1) 
    { 
      enemyArray.push(enemy); 
      addChild(player); 
      addChild(enemy) 

      enemy.enemyMoveTimer.start(); 
      enemy.enemyAttackTimer.start(); 
      onGameTimer.start(); 
    } 
    if (level.levelNumber == 2) 
    { 

     enemyArray.push(enemy, enemy2); 
     addChild(player); 

     addChild(enemy) 
     addChild(enemy2) 

     enemy.enemyMoveTimer.start(); 
     enemy.enemyAttackTimer.start(); 

     enemy2.enemyMoveTimer.start(); 
     enemy2.enemyAttackTimer.start(); 
     onGameTimer.start(); 
    } 

таймер игры (таймер, который проверяет вражеские жизни, продолжает работать):

if (enemyArray.length == 0) 
{ 
    trace("NEXT LEVEL"); 
    removeChild(player);//remove player from the current level 
    onLevelTimer.removeEventListener(TimerEvent.TIMER, timerLevel); 
    levelNumber += 1; 

    onLevelTimer.addEventListener(TimerEvent.TIMER, timerLevel); 


    onGameTimer.stop(); 
} 
if (enemy.enemyHP <= 0) 
{ 
    enemy.enemyHP = 0; 
    enemy.enemyMoveTimer.stop(); 
    enemy.enemyAttackTimer.stop(); 
    trace("DEAD"); 
    enemyArray.splice(0,1); 
    try 
    { 
      removeChild(enemy) 
    } 
    catch (e:ArgumentError){ 

    } 
} 
if (enemy2.enemyHP <= 0) 
{ 
    enemy2.enemyHP = 0; 
    enemy2.enemyMoveTimer.stop(); 
    enemy2.enemyAttackTimer.stop(); 
    trace("DEAD"); 
    enemyArray.splice(1,1); 
    try 
    { 
     removeChild(enemy2) 
    } 
    catch (e:ArgumentError) { 

    } 
} 
+0

Это еще проблема, или проблема решена? – Atriace

ответ

1

Там в больше кода там, что может быть причиной проблемы, поэтому я просто предполагаю, что это похоже на то, что я написал ниже. Он также обходится с несколькими if statements, в пользу просто повторения по вашему enemyArray, проверяя каждый, как вы хотели (вот сила петель!).

var enemyMoveTimer:Timer = new Timer(1000, 0); 
enemyMoveTimer.addEventListener(TimerEvent.TIMER, enemyTimerListener); 
enemyMoveTimer.start(); 

var enemyArray:Array = [new Enemy("enemy1"), new Enemy("enemy2")]; 

function enemyTimerListener(e:Event):void { 
    for (var i:String in enemyArray) { 
     var enemy:Enemy = enemyArray[int(i)]; 

     if (enemy.enemyHP <= 0) { 
      enemy.enemyMoveTimer.stop(); 
      enemy.enemyAttackTimer.stop(); 
      trace("DEAD"); 
      enemyArray.splice(int(i),1); 
      if (enemy.parent != null) { 
       removeChild(enemy); 
      } 
     } 
    } 
} 

Что не показано, так это то, как вы обнаруживаете и продвигаетесь на «следующий уровень». Как эти враги добавляются в массив? Так как кажется, что вы перекатили свой собственный класс Enemy, как выглядит этот класс? Почему вы используете try ... catch?

В любом случае, если вышеуказанное работает, весело; в противном случае нам понадобится больше кода, чтобы знать, что происходит.

+0

Спасибо! Я попытался добавить противников на основе массивов, но это вызвало некоторые другие проблемы, не связанные с этим. Я отредактировал свой вопрос, чтобы вы могли видеть, как я это сделал (это далеко не профессионал). Класс противника в основном имеет переменные для своего HP, таймер говорит ему двигаться и атаковать. Я использовал try и catch, потому что таймер всегда проверяет, является ли hp = 0. Поэтому, когда это произойдет, он будет продолжать извергать аргументную ошибку об RemoveChild. Я вижу, что вы создали блестящую инструкцию if, проверяющую, является ли это null, чтобы заменить это. Я это проверю. –

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