【问题标题】:illogical remove child error when looking through DisplayObjects, flash AS3查看 DisplayObjects 时不合逻辑的删除子错误,flash AS3
【发布时间】:2023-04-10 05:04:01
【问题描述】:

参数错误 #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等实例。每个实例都有一个皮肤电影剪辑已附加。

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

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

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

运行时,如果所有敌人都按照创建的顺序到达终点,则没有问题,但是如果一个例如移动得更快,并且先到达终点,则会出现错误#2025(The提供的 DisplayObject 不是调用者的子对象)被抛出。

我已将其范围缩小到程序试图移除敌人两次的事实,原因我无法辨别。它循环并移除所需的敌人,然后尝试再次移除它,即使它是从数组中拼接的(这发生正确,并且第一次尝试 removeChild 总是成功的)

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

[框架上的代码] pastebin.com/vcXzQpr9

[敌人.as] pastebin.com/RNXgK8Ex

[EnemyHandler.as] pastebin.com/6fytxbMW

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

[Utils.as] pastebin.com/PQ2LPV0v

[traceDl.as] {调试显示列表} pastebin.com/9vQGKcYP

【问题讨论】:

    标签: actionscript-3 flash removechild displayobject


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,现在完美运行.. 我猜这可能很简单,我假设 arrayOfDisplayObjects.splice("displayObject",1) - "displayObject" 作为起始索引可能具有相同的功能as arrayOfDisplayObjects.splice(arrayOfDisplayObjects.indexOf("displayObject").. Flash 非常有用的 Array.splice(paramaters..) 工具提示派上用场了 x
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    相关资源
    最近更新 更多