在我的程序中,我有一个显示对象的结构,代表屏幕上的敌方单位,如下所示:
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
答案 0 :(得分:1)
Array.splice()
对您要开始拼接的位置采用整数,然后取出要删除的项目数。所以你需要使用
enemyList.splice(enemyList.indexOf(tempEnemy), 1);
而不是传递Enemy
实例。当订单没有改变时,它似乎可以正常工作,因为将tempEnemy
强制转换为int
(splice()
将自动完成)会产生零,所以在{{1它实际上只是每次删除列表中的第一项。