从数组拼接后出现错误#1010

时间:2012-05-15 11:51:30

标签: actionscript-3 flash actionscript

我有一个问题。每五秒钟就会激发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;
    }
}

3 个答案:

答案 0 :(得分:0)

这是因为处理你正在迭代的数组引起的,你应该对你要删除的东西进行引用,然后在循环之后再进行。

答案 1 :(得分:0)

你的问题是,如果子弹击中两个敌人,你试图将它从舞台上移除两次。这将抛出ArgumentError。

如果你需要对所有敌人进行测试(假设同一个子弹可以击中多个敌人),你还需要在从敌人阵列中移除一个元素时减少我。

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--;
            }
        }
    }
}

答案 2 :(得分: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);
}