0

参数错误 #2025:

提供的 DisplayObject 不是调用者的子对象

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

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

文档类包含一个EnemyHandler实例,它包含多个Enemy1Enemy2等实例。每个实例都附加了一个皮肤 MovieClip。

当 Enemy 到达某个点时,Enemy 类(Enemy1/2/3 等继承自它)包含一个属性expired ,该属性在 Enemy 类 (enemy.update) 中设置为 true。

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

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 显示列表} pastebin.com/9vQGKcYP

4

1 回答 1

1

Array.splice()为要开始拼接的位置取一个整数,然后是要删除的项目数。所以你需要使用

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

而不是传递Enemy实例。当订单没有改变时,它可能看起来工作正常,因为强制tempEnemyint(这splice()将自动完成)会产生一个零,所以在你的destroyEnemy函数中它实际上只是每次都删除列表中的第一项。

于 2013-02-20T01:08:23.433 回答