for each(var e:Enemy in enemies)
{
if(e.getHealth() == 0)
{
enemies.splice(e,1);
}
}
enemies[0]
このコードは、最初に kill されている限り正常に機能します。がenemies[1]
最初に殺されると、両方を接合します。これを変更して、ヘルスが 0 になった特定の敵だけが接合されるようにするにはどうすればよいですか?
for each(var e:Enemy in enemies)
{
if(e.getHealth() == 0)
{
enemies.splice(e,1);
}
}
enemies[0]
このコードは、最初に kill されている限り正常に機能します。がenemies[1]
最初に殺されると、両方を接合します。これを変更して、ヘルスが 0 になった特定の敵だけが接合されるようにするにはどうすればよいですか?
最善の方法は、後方にトラバースしながら接合することです。ブレントには良い考えがありますが、2 つの隣接する敵を配列から接合する必要がある場合は失敗する可能性があります。これは、前方にある敵のインデックスが左にシフトされるためです。したがって、カウンターがインクリメントすると、その要素のすぐ隣にある要素が接続されていません。
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
}
}
変更中の配列をループすることは常に危険です。私の意見では、最も簡単な方法は次のとおりです。
var aliveEnemies:Array = [];
for each(var e:Enemy in enemies)
{
if(e.getHealth() > 0)
{
aliveEnemies.push(e);
}
}
enemies = aliveEnemies;
これにより、死んだ敵を調べて削除します。i 変数を使用した for ループに注意してください。これは、開始したと仮定した場所です。AS3 の foreach ループからインデックスを取得する方法がわかりませんでした。
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.
}
}