查看DisplayObjects,flash AS3时,不合逻辑的删除子错误

时间:2013-02-20 00:41:25

标签: actionscript-3 flash removechild displayobject

参数错误#2025:

提供的DisplayObject不是调用者的子项

在我的程序中,我有一个显示对象的结构,代表屏幕上的敌方单位,如下所示:

0: "enemy handler" ➔ [object EnemyHandler]
  0: "enemy" ➔ [object Enemy1]
    0: "enemy's skin"(MovieClip) ➔ [object EnemySkin1]
      0: "skin image" ➔ [object Shape]

文档类包含 EnemyHandler 的一个实例,它包含 Enemy1 Enemy2 等的多个实例。每个实例都有一个skin MovieClip附带。

Enemy类(Enemy1 / 2/3 ect继承)在Enemy类(enemy.update)中包含一个属性 expired ,设置为true,当Enemy有达到了一定程度。

在敌人处理程序类中是一个函数,并且是问题所在的位置,循环遍历所有Enememy显示对象的数组,更新位置然后,

if(tempEnemy.expired)
{
    tempEnemy.destroy();            // removeChild(skin)
    enemyList.splice(tempEnemy);
    removeChild(tempEnemy)
}

运行时,如果所有敌人按照创建顺序到达终点,则没有问题,但是如果一个例如旅行速度更快,并且之前到达终点,则会出现错误#2025(提供的DisplayObject不是调用者的子节点。

我已将其缩小到程序试图移除敌人 两次 的事实,原因是我无法辨别。它循环并移除所需的敌人,然后尝试再次移除它,即使它是从阵列拼接而来(这是正确的,并且第一次尝试removeChild是完全成功的)

这对我来说可能相当简单,所以请原谅我,但感谢任何帮助。这是文件;

[框架代码] pastebin.com/vcXzQpr9

[Enemy.as] pastebin.com/RNXgK8Ex

[EnemyHandler.as] pastebin.com/6fytxbMW

[Enemy0.as]& [Enemy1.as] pastebin.com/5bW3Aa0H

[Utils.as] pastebin.com/PQ2LPV0v

[traceDl.as] {debuggnig the display list} pastebin.com/9vQGKcYP

1 个答案:

答案 0 :(得分:1)

Array.splice()对您要开始拼接的位置采用整数,然后取出要删除的项目数。所以你需要使用

enemyList.splice(enemyList.indexOf(tempEnemy), 1);

而不是传递Enemy实例。当订单没有改变时,它似乎可以正常工作,因为将tempEnemy强制转换为intsplice()将自动完成)会产生零,所以在{{1它实际上只是每次删除列表中的第一项。