ArgumentError:错误#2025:提供的DisplayObject必须是调用者的子级。

时间:2013-09-03 17:04:03

标签: actionscript-3 flash

拜托,我需要帮助尝试从舞台上移除子弹和敌人。我是编程新手。谢谢。

我收到以下错误消息:

  

ArgumentError:错误#2025:提供的DisplayObject必须是子级   来电者。在flash.display :: DisplayObjectContainer / removeChild()     在Main / fl_EnterFrameHandler()处   flash.utils :: Timer / _timerDispatch()在flash.utils :: Timer / tick()

调试发送给我的代码。

package 
{

import flash.display.MovieClip;
import flash.events.Event;
import flash.utils.Timer;

public class Main extends MovieClip
{

    var enemyShipTimer:Timer;
    var coinTimer:Timer;
    var playerscore:Number = 0;
    var enemies:Array;
    var bullets:Array;

    public function Main()
    {
        enemyShipTimer = new Timer(1000);
        enemyShipTimer.addEventListener("timer", fl_EnterFrameHandler);
        enemyShipTimer.start();
        coinTimer = new Timer(1000);
        coinTimer.start();
        enemies = new Array ();
        bullets = new Array ();

    }

    function fl_EnterFrameHandler(event:Event):void
    {
        var enemyinstance = new enemy_ks();
        stage.addChild(enemyinstance);
        enemies.push(enemyinstance);
        trace(enemies.length);

        for (var count=0; count<enemies.length; count++)
        {

            for (var bcount=0; bcount<bullets.length; bcount++)
            {
                if (enemies[count].hitTestObject(bullets[bcount]))
                {
                    removeChild(enemies[count]);
                    enemies.splice(count, 1);
                    removeChild(bullets[bcount]);
                    bullets.splice(bcount, 1);
                }
            }
            score_ks.text = " " + playerscore;
        }


    }

}
}

1 个答案:

答案 0 :(得分:0)

编辑:重新阅读您的代码并注意到真正的错误实际上是您正在添加到舞台但是从主精灵中删除。你需要匹配那些。如果父对象实际上不是该对象的子对象,则无法从父对象中删除该对象。

以下几点仍需要解决,否则您可能会遇到其他错误。


您的问题与您的循环有关。在循环中,您可以在每次成功命中测试时调整数组长度,但不会调整循环计数。

所以想想就好了。

您从:

开始
count = 0;
length = 10;

现在说你为count < length运行一个循环,然后你在count == 4count == 7拼接。在您当前的方案中,您只会点击以下对象(使用原始索引)

0 1 2 3 4 6 7 9

请注意,您没有点击索引5或8.当您修改这样的数组并且不修改计数时,您最终会跳过某些项目。在拼接索引4之后,原始索引5移动到4并且其他一切也移回一个。因此,当您移动到索引5时,您实际上正在阅读原始索引6.

非常简单的解决方法是在拼接时调整计数。

if (enemies[count].hitTestObject(bullets[bcount]))
{
    removeChild(enemies[count]);
    enemies.splice(count, 1);
    count--; //subtract 1 from the count
    removeChild(bullets[bcount]);
    bullets.splice(bcount, 1);
    bcount--; //subtract 1 from the bcount
}

这将确保您的计数实际上击中每个对象。您也可以使用for each循环来处理这个问题,尽管这种类型的循环比循环标准慢,具体取决于应用程序。

此外,如果DisplayObject实际上是该容器的子级,则DisplayObjectContainer只能从this中删除。如果不是,则会出错。所以我相信你也可能遇到一个问题,你的数组没有与舞台上的内容完全对齐,而你试图删除一个实际上不存在作为父类子元素的对象

作为一个未成年人,你应该避免直接将孩子添加到舞台上,除非你有真正的理由这样做。而是使用addChild()关键字将其直接添加到应用程序对象的显示列表,或者只是{{1}}。