0

拜托,我需要帮助来清除舞台上的子弹和敌人。我对编程很陌生。谢谢你。

我收到以下错误消息:

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;
        }


    }

}
}
4

1 回答 1

0

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

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


你的问题是你的循环。在您的循环中,您在每次成功的命中测试中调整数组长度,但您从不调整循环的计数。

所以这样想。

你开始:

count = 0;
length = 10;

现在假设您运行一个循环 for并在andcount < length处拼接。在您当前的方案中,您只会命中以下对象(使用原始索引)count == 4count == 7

0 1 2 3 4 6 7 9

请注意,您没有达到索引 5 或 8。当您像这样修改数组并且不修改计数时,您最终会跳过某些项目。拼接索引 4 后,原始索引 5 移动到 4,其他所有内容也向后移动 1。所以当你移动到索引 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循环来处理这个问题,尽管这种类型的循环比标准 for 循环慢,具体取决于应用程序。

此外,只有当它实际上是该容器的子容器时,DisplayObject才能从 a 中删除它。DisplayObjectContainer如果不是,则会出错。因此,我相信您可能还会遇到一个问题,即您的数组与舞台上的内容不完全一致,并且您试图删除一个实际上并不作为父级子级存在的对象

作为未成年人,除非您有真正的理由,否则您应该避免将孩子直接添加到舞台上。相反,使用this关键字直接将其添加到应用程序对象的显示列表中,或者干脆addChild().

于 2013-09-03T18:27:44.857 回答