【问题标题】:AS3 : How to remove movieclip properly without Error 1009 overflow?AS3:如何正确删除影片剪辑而不会出现错误 1009 溢出?
【发布时间】:2026-02-20 12:50:02
【问题描述】:

我有一个 Catcher 类,可以让你在游戏中控制影片剪辑。我正在尝试对游戏进行编程,以便它完成并且您可以重新启动。所以我需要删除所有内容并返回菜单。应该是一件很容易解决的事情,但我似乎不知道如何解决。

到目前为止,我只有 ourCatcher.parent.removeChild(ourCatcher);从舞台上删除我的电影剪辑。还有一个 if 语句来停止将东西放到舞台上的功能之一。 SoundMixer.stopAll();停止音乐。然后我让它进入第 3 帧,即游戏结束屏幕。

看起来不错,但我在错误控制台中不断出现 1009 错误,并且当我重新启动游戏时,它超级慢。 Catcher 中的移动功能似乎仍在运行并产生错误,因为 Catcher 已从舞台上移除并且现在为空。

我知道我需要取消引用与 Catcher 相关的所有内容,但在我的情况下我无法在网上找到任何文档来执行此操作。每个人似乎都有不同的方法,我尝试过但不起作用。

我用来移动角色的 Catcher 类中的两个函数:

public function Catcher(stageRef:Stage) 
    {
        stop();
        this.stageRef = stageRef;
        key = new KeyObject(stageRef);


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

    //movement
    public function loop(e:Event):void
    {           
        if (key.isDown(Keyboard.A))
                vx -= walkSpeed;

        else if (key.isDown(Keyboard.D))
                vx += walkSpeed;

        else
                vx *= friction;

        //update position
        x += vx;

        //speed adjustment
        if (vx > maxspeed)
            vx = maxspeed;
        else if (vx < -maxspeed)
            vx = -maxspeed;

        //stay inside screen
        if (x > stageRef.stageWidth)
        {
            x = stageRef.stageWidth;
            vx = -vx
        }

        else if (x < 0)

        {
            x = 0;
            vx = -vx;
        }


        if (key.isDown(Keyboard.A))
        {
            scaleX = -1;
        }

        else if (key.isDown(Keyboard.D))
        {
            scaleX = 1;
        }

        movement();

        // Jumping
        jump += gravity;

        if (y > stage.stageHeight /1.5)
        { 
            jump = 0;
            canJump = true;
        }

        if (key.isDown(Keyboard.SPACE) && canJump)
        {
            jump = -10;
            canJump = false;
        }

        y += jump;


    }

我要从舞台上移除东西的另一个类称为 CatchingGame,它有一个丢弃对象的函数,我将游戏代码放在那里以供当 playerlives == 0 时使用。

if (playerLives == 0 )
                {
                stop();
                ourCatcher.parent.removeChild(ourCatcher);
                SoundMixer.stopAll();
                gotoAndStop(3);
                }

我可能犯了一个基本错误,因为这是我的第一个 Flash 游戏。非常感谢任何帮助,因为这几乎是完成我的游戏的最后一步。

【问题讨论】:

    标签: actionscript-3 flash


    【解决方案1】:

    而不是仅仅通过引用其父级来删除子级来删除自己(我必须进行测试以确保这确实有效)。在您创建/实例化 Catcher 的同一位置创建一个函数,该函数首先删除 eventListener ENTER_FRAME,然后删除 Catcher。

    if (playerLives == 0 ) {
      stop();
      removeCatcher();
      SoundMixer.stopAll();
      gotoAndStop(3);
    }
    
    // new location in the main code where the catcher is created
    function removeCatcher():void {
      ourCatcher.cleanUp();
      removeChild(ourCatcher);
    }
    
    // in the Catcher class
    function cleanUp():void {
      removeEventListener(Event.ENTER_FRAME, loop);
    }
    

    【讨论】:

    • 您好,感谢您的快速响应。这确实消除了 1009 错误,但现在我收到了 2025 错误。 ArgumentError:错误 #2025:提供的 DisplayObject 必须是调用者的子对象。我想我可能把事情搞错了。在 flash.display::DisplayObjectContainer/removeChild() 在 CatchingGame/removeCatcher() 在 CatchingGame/moveObjects()
    • 您正在将孩子移到它存在的地方之外的某个地方。确保 removeCatcher 位于您创建它的同一帧中
    • 并且它在创建它的父级中,如果父级也是一个类。
    • 我想问题归结为,我的 playerlives 变量在 CatchingGame 类中,我必须在它自己的类中删除我的 Catcher。但是我只能在 playerlives == 0 时删除捕手。我是否只是将 playerlives 设置为 public static,然后使用 get 和 set 函数来传输要在 Catcher 类中访问的变量?或者在这种情况下是否有另一种方法可以访问另一个类中的变量。
    • 为所有玩家数据创建一个模型类并不是一个坏主意,这样它对所有代码都可用,但驻留在一个地方。
    【解决方案2】:
    if (ourCatcher.parent) ourCatcher.parent.removeChild(ourCatcher);
    else trace("Catcher without a parent still plays! DEBUG THIS!");
    

    基本上,您很可能会失去对捕手的控制,也就是说,它似乎两次试图将自己从舞台上移开。在它第一次自行移除后,它的parent 变为空,因此为 1009。而且,当你达到 2028 时,同样的原因适用,你的捕手不再是任何地方的孩子。

    【讨论】:

    • 是的,你是对的,这似乎正在发生。我应该如何正确删除它?
    • 好吧,至少在您从舞台上移除捕手时移除事件监听器。其他任何事情,您需要提供更多代码让我们向您展示需要修复的内容。
    最近更新 更多