AS3:如何在没有错误1009溢出的情况下正确删除movieclip?

时间:2012-12-05 13:31:31

标签: actionscript-3 flash

我有一个类Catcher,可以让你控制游戏中的动画片段。我正在尝试对游戏进行编程以使其完成并且您可以重新启动。所以我需要删除所有内容并返回菜单。应该是一个简单的事情要解决,但我似乎无法找到如何。

到目前为止,我只有myCatcher.parent.removeChild(ourCatcher);从舞台上删除我的movieclip。还有一个if语句来阻止将某些东西丢到舞台上的一个函数。 SoundMixer.stopAll();停止音乐。然后我就进入第3帧,即游戏画面。

它看起来很好,但我在错误控制台中出现了不断的1009错误,当我重新启动游戏时,它超级慢。看起来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游戏。非常感谢任何帮助,因为这几乎是完成我的游戏的最后一步。

2 个答案:

答案 0 :(得分:0)

而不仅仅是通过引用其父项来删除子项(我必须进行测试以确保它确实有效)。在创建/实例化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);
}

答案 1 :(得分:0)

if (ourCatcher.parent) ourCatcher.parent.removeChild(ourCatcher);
else trace("Catcher without a parent still plays! DEBUG THIS!");

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