3

我有一个类 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 游戏。非常感谢任何帮助,因为这几乎是完成我的游戏的最后一步。

4

2 回答 2

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

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

于 2012-12-05T15:05:10.150 回答
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);
}
于 2012-12-05T14:08:12.143 回答