首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AS3 ArgumentError #2025

AS3 ArgumentError #2025
EN

Stack Overflow用户
提问于 2014-01-10 20:20:13
回答 2查看 71关注 0票数 0

我正在为学校做一个游戏项目,最近在as3中遇到了一些小问题。我正在做一个游戏,你可以操纵飞船避开小行星,并且刚刚添加了一个功能,当你撞到小行星时,你的飞船会通过stage.removeChild从舞台上移走。一切都很好,直到你真正点击了一些东西,然后这个错误就出现了(我的意思是很多,就像它在游戏开始的时候一直在重复):

代码语言:javascript
复制
ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
at flash.display::DisplayObjectContainer/removeChild()
at Function/com.asgamer.basics1:Engine/private:loop/com.asgamer.basics1:krash()[C:\Users\nti\Desktop\Ship game\com\asgamer\basics1\Engine.as:54]

以下是代码(我标出了第54行):

代码语言:javascript
复制
 package com.asgamer.basics1
{
    import flash.display.MovieClip;
    import flash.display.Stage;
    import flash.events.Event; 

    public class Engine extends MovieClip
    {


    private var numStars:int = 80;

    private var enemyList:Array = new Array();

    private var ourShip:Ship;

    public function Engine() : void
    {

        ourShip = new Ship(stage);
        stage.addChild(ourShip);

        ourShip.x = stage.stageWidth / 2;
        ourShip.y = stage.stageHeight / 2;

        for (var i:int = 0; i < numStars; i++)
        {
            stage.addChildAt(new Star(stage), stage.getChildIndex(ourShip));
        }


        addEventListener(Event.ENTER_FRAME, loop, false, 0, true);


    }


    private function loop(e:Event) : void
    {

        if (Math.floor(Math.random() * 14) == 5)
        {

            var enemy:Asteroid = new Asteroid(stage);

            enemy.addEventListener(Event.REMOVED_FROM_STAGE, removeEnemy, false, 0, true);

            enemyList.push(enemy);

            stage.addChild(enemy);

            stage.addEventListener(Event.ENTER_FRAME, krash);
            function krash(e:Event):void{
                if (enemy.hitTestObject(ourShip)==true){
                    stage.removeChild(ourShip); <-------------------------- LINE 54

                }
            }

        }
    }


    private function removeEnemy(e:Event)
    {
        enemyList.splice(enemyList.indexOf(e.currentTarget), 1);
    }




}

}

请记住,我在某种程度上是编码的初学者,这将解释代码中其他可能的“错误”。:)

EN

回答 2

Stack Overflow用户

发布于 2014-01-10 21:03:32

问题是,正如前面提到的,在从stage中实际删除ourShip之后,您并没有清理它。看,一旦你调用stage.removeChild(),船就不再在舞台上了,但碰撞检查仍然继续,因为你没有删除enter frame侦听器。应将remove listener语句添加到移除ship的代码分支。

代码语言:javascript
复制
        stage.addEventListener(Event.ENTER_FRAME, krash);
        ... // other code
        function krash(e:Event):void{
            for each (var enemy in enemyList)
              if (enemy.hitTestObject(ourShip)==true){
                stage.removeChild(ourShip); 
                stage.removeEventListener(Event.ENTER_FRAME, krash); // THIS line
            }
        }

编辑:首先,将addEventListener(Event.ENTER_FRAME, krash)行移动到添加loop侦听器的位置,因为您不希望有多个侦听器;其次,为hitTestObjectenemyList创建一个完整的循环。上面的代码已更新。

注意:一些有效性检查可能需要出现在侦听器代码中,例如,如果ourShip已经被删除,您可以直接从事件侦听器函数中执行return,或者跳过命中测试检查。一旦你开始使用单一的主输入帧监听器,这也会对你有所帮助--让一个函数作为事件监听器通常比使用多个函数作为同一个事件的监听器更快,而且还可以帮助你在一个地方整合你想要执行的响应特定事件的每一段代码,而不是搜索你把出错的语句放在哪里了。这也有助于避免定期添加/删除侦听器,尽管有时使用侦听器可以做得更好。

票数 1
EN

Stack Overflow用户

发布于 2014-01-10 20:26:27

问题是因为您多次尝试从stage中删除ourShip。更准确地说是在每个Event.ENTER_FRAME事件上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21044257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档