0

开发一个 Flash 游戏,在之前的游戏中,我让敌人通过使用阵列进入,当他们被杀死或离开舞台时,我会将它们从阵列中移除。出于某种原因,当我在这个游戏中使用完全相同的代码时,当我尝试删除数组对象时会抛出 1009: 错误,基本上是说那里什么都没有。. . 这很奇怪。

这是代码:

public function addZombie()
{
    var zom:Zombie = new Zombie();
    zom.y = 20;
    zom.x = Math.floor(Math.random()*(1 + 500 - 30)) + 30;
    addChild(zom);
    zombies.push(zom);
    numZombies++;
}

那就是添加它的函数,zombies 是数组,它在这个函数中被推入数组。这是我试图删除它的代码:

for (var i:int = 0; i < zombies.length; i++)
{
    if (zombies[i].y + zombies[i].height / 2 > 400) {
        removeChild(zombies[i]);
        zombies.splice(i,1);
        numZombies--;
        addZombie();
    }
}

removeChild(僵尸[i]); <-- 这是尝试删除错误时引发错误的部分。它奇怪地删除了其中一些,但不是全部。

4

2 回答 2

0

我不相信循环正在做你所期望的。当你以这种方式从数组中移除一个元素时,被移除元素之后的所有元素都会被向下移动。所以,如果你有这样的代码:

var testArr:Array = new Array();
testArr.push('First');
testArr.push('Second');
testArr.push('Third');
testArr.push('Fourth');

for (var i:int = 0; i < testArr.length; i++) {
    testArr.splice(i,1);
}

循环的结果将是:

i=0, testArr = ['Second', 'Third', 'Fourth']
i=1, testArr = ['Second', 'Fourth']
i=2 END OF LOOP

使用 while 循环可能会更好,仅在未删除元素时才增加索引(因为删除元素会将新元素移动到该索引位置)。

我不明白为什么你得到空对象引用,但这会导致其他问题(为什么有些被删除但不是全部)。

于 2013-04-05T00:01:46.540 回答
0

Bill Turner 的解释是正确的,但由于它似乎无法帮助您解决问题,您可能想试试这个:

var zombieCount:int = zombies.length;

for (var i:int = 0; i < zombies.length; i++)
{
    var zombie = zombies[i];
    if (zombie.y + (zombie.height / 2) > 400) {
        removeChild(zombie);
        zombies.splice(i,1);
        i--; // So that the loop will pass with the same value next time
        numZombies--;
    }
}

for (var j:int = zombies.length; j < zombieCount; j++)
{
    addZombie();
}
于 2013-04-05T01:13:56.643 回答