尝试从数组中删除子弹并且似乎无法摆脱此错误。
ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
at flash.display::DisplayObjectContainer/removeChild()
at Template/gameLoop()
我试图从阵列中删除子弹,如果它被击中或者超过某个x value
。
for (var oo:int=0;oo<bArray2.length;oo++)
{
bullet2=bArray2[oo];
if(bullet2.x<500 && bullet2!=null && bArray2[oo]!=null)
{
bullet2.x += 3;
}
else
{
removeChild(bullet2);
bArray2.splice(oo, 1);
}
if(boss.hitTestObject(bArray2[oo])&& bArray2[oo]!=null && boss!=null)
{
removeChild(bArray2[oo]);
bLives-=1;
bArray2[oo]=null;
bArray2.splice(oo, 1);
}//end if
}
答案 0 :(得分:1)
查看removeChild()
的定义:
从DisplayObjectContainer实例的子列表中删除指定的子DisplayObject实例。
为了使该函数成功执行,它应该在我们将删除的子(DisplayObjectContainer
)的父DisplayObject
父项上执行,但如果我们在这个父项之外,编译器将采取当前DisplayObjectContainer
作为父级,请举例说明:
trace(this); // gives : [object MainTimeline]
var parent_1:MovieClip = new MovieClip()
addChild(parent_1);
// add the parent_1 to the MainTimeline
var child_1:MovieClip = new MovieClip()
addChild(child_1);
// add the child_1 to the MainTimeline
var child_2:MovieClip = new MovieClip()
parent_1.addChild(child_2);
// add the child_2 to parent_1 which is a child of the MainTimeline
removeChild(child_1);
// remove child_1 from the MainTimeline : OK
try {
removeChild(child_2);
// remove child_2 from the MainTimeline : ERROR
} catch(e:*){
trace(e);
// gives : ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
}
我们知道child_2
不是MainTimeline
的孩子,这就是我们收到错误#2025的原因,因为提供的DisplayObject(child_2)不是调用者的子节点(MainTimeline)。
所以要删除child_2
MovieClip,我们必须从removeChild()
的父母那里拨打parent_1
:
parent_1.removeChild(child_2); // OK
为了简化或者如果我们不了解它的父母,你可以写下来:
child_2.parent.removeChild(child_2);
希望可以提供帮助。
答案 1 :(得分:0)
试试这个
for (var index:int= bArray2.length - 1; index >= 0; --index) {
bullet2 = bArray2[index];
// you don't even need this check
// if you are not setting elements to null in the array
if (!bullet2) {
bArray2.splice(index, 1);
continue;
}
// move the bullet
if (bullet2.x < 500) {
bullet2.x += 3;
}
// if the bullet hit the boss or is out of screen remove it
if((boss && boss.hitTestObject(bullet2)) || bullet2.x > 500) {
if (this.contains(bullet2)) {
removeChild(bullet2);
}
bLives -= 1;
bArray2.splice(index, 1);
}
}
从前到后迭代数组并删除元素会缩小数组,在下一次迭代中,您将跳过元素。最好从后向前迭代并删除。
最好在调用removeChild之前检查DisplayObjectContainer是否实际包含要删除的元素。