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

只要enemies[0]首先被杀死,此代码就可以正常工作。如果enemies[1]先被杀死,则将两者拼接起来。我怎样才能改变这一点,以便只有生命值为 0 的特定敌人被拼接?

4

3 回答 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
    }
}
于 2013-04-25T15:51:04.950 回答
1

在您正在修改的数组上循环总是很危险的。我认为最简单的方法是:

var aliveEnemies:Array = [];
for each(var e:Enemy in enemies)
{
    if(e.getHealth() > 0)
    {
        aliveEnemies.push(e);
    }
}
enemies = aliveEnemies;
于 2013-04-25T15:43:05.890 回答
0

这将查看并删除任何死去的敌人。请注意使用 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.
    }
}
于 2013-04-25T15:45:02.357 回答