0

场景:在 Main 中,Bullet 类的实例被生成并添加到舞台,而到数组 bltarray 中,Enemy 类的实例被生成,添加到舞台并添加到 nmearray。这工作正常。

问题似乎是偶然出现的,即它可以工作,然后很快就突然不起作用,当它不起作用时,我收到输出错误的垃圾邮件并且分数显示不断上升,注意它是子弹和敌人的同一个实例。

Bullet instance98 hit Enemy instance45
ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
at flash.display::DisplayObjectContainer/removeChild()
at Main/everyframe()
Bullet instance98 hit Enemy instance45
ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
at flash.display::DisplayObjectContainer/removeChild()
at Main/everyframe()

我不明白的是,

我正在使用的代码如下(也在主代码中)

for (var j=0;j<bltarray.length;j++){
    if (bltarray[j].hitTestObject(nmearray[i])){
        trace("Bullet "+bltarray[j].name+" hit Enemy "+nmearray[i].name);
            score += 1;
            scorevalue.text = score.toString();
            // Remove dead objects from stage
            stage.removeChild(nmearray[i]);
            stage.removeChild(bltarray[j]);
            // Remove reference to objects from array
            nmearray.splice(i,1);
            bltarray.splice(j,1);
            trace('nmearray length:'+nmearray.length)
    }
}

子弹和敌人类都有自己的 REMOVED_FROM_STAGE 事件侦听器来删除其他事件侦听器。

当我这样做时,这个错误也会偶尔弹出。

TypeError: Error #2007: Parameter hitTestObject must be non-null.
at flash.display::DisplayObject/_hitTest()
at flash.display::DisplayObject/hitTestObject()
at Main/everyframe()
4

1 回答 1

0

在 for 循环期间进行拼接时,您可能会遇到一个常见问题。基本上,当你从一个数组中拼接一个元素时,下一个元素会立即被推到那个位置,导致你的 for 循环实际上并没有检查每个元素。

尝试将您的 for 循环切换到反向 for 循环,看看会发生什么:

for (var j=bltarray.length-1;j >= 0;j--){
//do stuff
}

编辑:将 for 循环固定为 length-1

于 2012-04-03T22:31:34.327 回答