2013-04-25 2 views
2
for each(var e:Enemy in enemies) 
{ 
    if(e.getHealth() == 0) 
    { 
     enemies.splice(e,1); 
    } 
} 

Этот код работает нормально, пока enemies[0] в первую очередь убивается. Если enemies[1] убит первым, он сращивает оба. Как я могу изменить это, так что только конкретный враг, чье здоровье достигает 0, сплавляется?Проблема с сращиванием массива в ActionScript 3

ответ

4

Лучшим способом было бы сращивание при прохождении назад. У Brent есть хорошая идея, но он может потерпеть неудачу, если два соседних врага должны быть срастаны из массива, потому что те, которые находятся вперед, индексируют свои сдвиги влево, поэтому, когда счетчик увеличивает, элемент, который находится рядом с тем, который получил сплайсинг.

for (var i:int=enemies.length-1; i >=0 ; i--) 
{ 
    if(enemies[i].getHealth() == 0) 
    { 
     enemies.splice(i,1); 
    } 
} 

С for each также возможно, хотя поведение может отличаться.

for each(var e:Enemy in enemies) 
{ 
    if(e.getHealth() == 0) 
    { 
     enemies.splice(enemies.indexOf(e),1); // splice() wants an index 
    } 
} 
+0

Почему я не думал об этом, чтобы избежать повторной индексации ошибок? – Brent

+0

@Brent Я знаком с общими ошибками. Скажем, Альфа Центавра имеет это, если город был разрушен из-за строительства колонии, следующий в списке не производит/не потребляет вещь (ака, пропущенную из основного цикла), из-за этой ошибки. – Vesper

+0

Время переписать некоторый код уничтожения зомби. Это второе, что я узнал по этой теме. – Brent

1

Всегда опасно перебирать массив, который вы изменяете. Самый простой способ, на мой взгляд, был бы следующим:

var aliveEnemies:Array = []; 
for each(var e:Enemy in enemies) 
{ 
    if(e.getHealth() > 0) 
    { 
     aliveEnemies.push(e); 
    } 
} 
enemies = aliveEnemies; 
+1

Это похоже на потерю памяти по сравнению с сращиванием. Я предполагаю, что это будет зависеть от сборки мусора AS3, которая, как я предполагаю, ужасна и количество удаленных элементов. – Brent

+0

Array сохраняет свои элементы только по ссылке. Когда вы перезаписываете врагов, ссылки мертвых врагов теряются, и если вы удалите их из списка отображения и списка событий, они будут собраны. И поскольку «враги = живые существа», aliveEnemies использует то же пространство памяти, что и враги. – Kodiak

+0

Причина, по которой я не люблю использовать «i--» и обратные циклы, состоит в том, что она не легко читаема и поддерживается, хотя интеллектуально удовлетворяет. – Kodiak

0

Это будет просматривать и уничтожать мертвых врагов. Обратите внимание на цикл for, используя переменную i, где я предполагаю, что вы начали. Я не был уверен, как получить индекс из цикла foreach в AS3.

for (var i:int=0; i < enemies.length; i++) 
{ 
    if(enemies[i] && enemies[i].getHealth() == 0) 
    { 
     enemies.splice(i,1); 
     i--;//index is re-stacked, next element is current element. 
    } 
} 
Смежные вопросы