删除Child和AS3 2025错误

时间:2015-01-18 23:25:18

标签: actionscript-3 runtime-error removechild

尝试从数组中删除子弹并且似乎无法摆脱此错误。

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


    }

2 个答案:

答案 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是否实际包含要删除的元素。