【问题标题】:"The supplied DisplayObject must be a child of the caller" error“提供的 DisplayObject 必须是调用者的子对象”错误
【发布时间】:2012-04-15 09:10:58
【问题描述】:

在多个项目中一直在努力解决这个问题。我尝试在 Flash 游戏中生成敌人并通过移除超出范围的敌人来执行清理。

方法如下:

enemyArray 包含对生成的敌人对象的引用。 enemyLayer 是包含生成的敌人的影片剪辑。

  public function spawnEnemy():void
  {

    var mc:MovieClip = new Enemy();
    enemyLayer.addChild(mc);
    enemyArray.push(mc);


     for (var i:int = 0; i<=enemyArray.length-1;i++)
     {
        enemyArray[i].z-=30; //Moves the enemies

        if (enemyArray[i].z <=-400) //performs cleanup
        {

                    enemyLayer.removeChild(enemyArray[i]);
        }

     }

   }

但我得到了这个错误

提供的 DisplayObject 必须是调用者的子对象

我做错了什么?

我也试过了:removeChild(enemyArray[i]) ,删除了enemyLayer 引用,但得到了同样的错误。

【问题讨论】:

  • 向我们展示您创建enemyLayer 和enemyArray 对象的方式和位置。

标签: actionscript-3 flash removechild


【解决方案1】:

确保在将项目从显示列表中删除后从数组中删除它们

    if (enemyArray[i].z <=-400) //performs cleanup
    {

                enemyLayer.removeChild(enemyArray[i]);
                enemyArray.splice(i, 1);//removing enemyArray[i] from the manager array
    }

【讨论】:

    【解决方案2】:

    这不会解决他的问题工程师,因为如果“不知何故”要删除的影片剪辑存在但在不同的容器中,它不会被删除。 我建议这样做:

    enemyArray[i].parent.removeChild(enemyArray[i]);
    

    虽然这不是最好的方法,而且是非常糟糕的代码,但每次遇到这样的问题时它都会帮助我。

    编辑:问题是你没有修改你的数组对象。你只是添加你永远不会删除它们的敌人。这就是为什么你会得到那个错误。数组包含一个已从显示列表中删除的敌人。

    【讨论】:

    • 我认为你是对的,但你不必因此而投反对票:)
    • 这真的很奇怪。尝试此代码时:enemyArray[i].parent.removeChild(enemyArray[i]);我得到一个空对象错误。但是,tracing (enemyArray[i].parent) 将返回“Object MovieClip”。
    • 看看我在编辑段落中的回答。这是因为您没有从阵列中删除 MC-s。它有时会返回 null。如果enemyArray[i] 已经从显示列表中删除但它存在于数组中。您必须从数组本身中删除引用。
    • @Engineer 效率低下,因为如果游戏继续进行,那么数组将变得非常大,并且会消耗大量 RAM。仅仅暂停错误并不意味着这是一个好方法。
    猜你喜欢
    • 1970-01-01
    • 2013-04-18
    • 2013-09-07
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多