0

我这里有个问题。每五秒 spawnEnemies 被触发一次。它创建一个movieclip,设置它的位置并将它添加到舞台和一个数组中。在函数 checkBullet 中,我检查子弹是否击中了一个敌人。如果是这样,则将子弹和敌人从舞台上移除,并将敌人从阵列中拼接起来。但是一旦我击中敌人就会抛出一个错误:

TypeError:错误#1010:术语未定义且没有属性。

如果我注释掉 arrayEnemies.splice(i,1) 行,它可以正常工作,但不会从数组中删除。这本身不是问题,但我自然不喜欢在我的数组中保留不必要的数据。对此有什么帮助吗?

function checkBullet(event:Event) {
    if(stage.contains(mcBullet)) {
        for(var i:int = 0; i < arrayEnemies.length; i++) {
            if(arrayEnemies[i].hitTestPoint(mcBullet.x, mcBullet.y, true)) {
                stage.removeChild(mcBullet);
                this.removeChild(arrayEnemies[i]);
                arrayEnemies.splice(i,1);
                bulletOnStage = false;
            }
        }
        if(mcBullet.x > 800) {
            stage.removeChild(mcBullet);
            bulletOnStage = false;
        }
    }
}


function spawnEnemies(event:TimerEvent) {
    var enemie:MovieClip = new box_mc();
    enemie.name = "mcBox" + event.currentTarget.currentCount;
    enemie.x = 850;
    enemie.y = Math.floor(Math.random()*(1+155)+255);
    addChild(enemie);
    arrayEnemies.push(enemie);
}

function moveEnemies(event:Event) {
    for(var i:int = 0; i < arrayEnemies.length; i++) {
        arrayEnemies[i].x -= 5;
    }
}
4

3 回答 3

0

这将是由处理您正在交互的数组引起的,您应该对要删除的内容持有一个引用,然后在循环后执行它。

于 2012-05-15T12:22:55.230 回答
0

您的问题是,如果子弹击中两个敌人,您会尝试将其从舞台上移开两次。这将引发 ArgumentError。

如果您需要针对所有敌人进行测试(假设多个敌人可以被同一颗子弹击中),当您从敌人数组中移除一个元素时,您还需要减少 i。

function checkBullet(event:Event) {
    if(stage.contains(mcBullet)) {
        if(mcBullet.x > 800) {
            stage.removeChild(mcBullet);
            bulletOnStage = false;
        }
        for(var i:int = 0; i < arrayEnemies.length; i++) {
            if(arrayEnemies[i].hitTestPoint(mcBullet.x, mcBullet.y, true)) {
                if(stage.contains(mcBullet)){
                    stage.removeChild(mcBullet);
                }
                this.removeChild(arrayEnemies[i]);
                arrayEnemies.splice(i,1);
                bulletOnStage = false;
                i--;
            }
        }
    }
}
于 2012-05-15T14:12:07.367 回答
0

有点老的问题,但我想我也会为可能最终出现在这里的任何人提供我的答案。
就像 Neil 说的那样,编辑您正在迭代的数组(在本例中为 arrayEnemies)可能会导致并发更新问题。

我首选的解决方案是使用单独的 toRemove 数组并在更新后将其删除,例如:

var enemies:Array();
//Lets assume at some point this is populated with Enemy objects

function update():void
{
    var toRemove:Array = new Array();
    //May want to keep and clear an array instead to avoid creating a new one each update

    foreach(var enemy:Enemy in enemies)
    {
        enemy.update();
        if(enemy.markedForRemoval())
            toRemove.push(enemy);
    }

    foreach(var enemy:Enemy in toRemove)
        enemies.splice(enemies.indexOf(enemy), 1);
}
于 2012-07-30T15:02:11.160 回答