gotoAndPlay到来自不同AS3类

时间:2016-07-24 10:42:47

标签: actionscript-3 flash air

我正在使用以下场景开发adobe air AS3游戏结构:
- 介绍
- 游戏
- GameOver
我没有在时间轴中编写任何代码,我不断创建AS3类。我面临的情况如下 用户在" Intro"场景中开始,他进入" Game"现场。在失去游戏之后,他去了#Ott; GameOver"。原始fla文件有一个名为:introClassToUse.as
的文档类 一旦用户进入" GameOver",他就有一个重播游戏的按钮,如回到场景" Intro"。我使用以下代码进行replayGame.as:

package 
{
    import flash.display.MovieClip;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.events.MouseEvent;
    import flash.display.Screen;
    import flash.system.Capabilities;
    import flash.geom.*;
    import flash.display.Stage;
    import flash.display.*;
    import flash.display.DisplayObject;
    import flash.display.MovieClip;

    import baseCode;
    import introClassToUse;
    import flash.events.Event;
    public class replayGame extends flash.display.MovieClip
    {

        var replayButToUse:replayBut= new replayBut();

        public function replayGame()
        {
            replayButToUse.x = 0.127 * introClassToUse.STAGE.stage.stageWidth;
            replayButToUse.y = 0.91 * introClassToUse.STAGE.stage.stageHeight;
            replayButToUse.addEventListener(MouseEvent.CLICK, gotoIntro);
            introClassToUse.STAGE.stage.addChild(replayButToUse);
        }


        function gotoIntro(event:MouseEvent):void
        {

            replayButToUse.removeEventListener(MouseEvent.CLICK, gotoIntro);
            stop();

            gotoAndPlay(1,"Intro");

            var reload:introClassToUse = new introClassToUse();




        }




    }

}

此代码在" GameOver"中创建重播按钮。现场。我的目标是回到" Intro"单击场景并导航到该场景后,重新调用introClassToUse.as并重新启动实际游戏。问题是,现场还没有找到! (错误flash cs6显示)。我猜测如果您从不同的AS3级导航,我对导航没有正确的理解。我在互联网上搜索过,并尝试了几个片段,如:

MovieClip(root).gotoAndPlay(1,"Intro");

以及其他一些互联网建议,我总是会遇到同样的错误。我该如何解决这种情况?

2 个答案:

答案 0 :(得分:1)

您应该做的一个简单示例:

public class Main extends MovieClip {
    // ONE frame!
    private var intro:Intro;
    private var game:Game;
    private var gameover:GameOver;
    public function Main() {
        intro=new Intro();
        game=new Game();
        gameover=new GameOver();
        // skipped
        addChild(intro);
        intro.addEventListener("startGame",startGame);
        game.addEventListener("gameOver",gameOver);
        gameover.addEventListener("backToIntro",backToIntro);
    }
    private function startGame(e:Event):void {
        if (!intro.parent) return; // sanity check
        addChild(game);
        removeChild(intro);
    }
    private function gameOver(e:Event):void {
        if (!game.parent) return;
        addChild(gameover);
        removeChild(game);
        // potentially parse the e.data to stuff "gameover" with data
    }
    private function backToIntro(e:Event):void {
        if (!gameover.parent) return;
        addChild(intro);
        removeChild(gameover);
    }
}

现在,编写所有这些类来保存他们需要的东西,并且只要在介绍中按下“开始游戏”按钮(并且介绍已准备好从显示列表中删除,可能有转换),它执行dispatchEvent(new Event("startGame"));,然后等待,直到它再次添加到显示列表。对于GameGameOver类,它们各自的事件都是相同的。所有这些类至少应该继承Sprite,包含对象和监听事件。看,没有gotoAndStop()参与。

答案 1 :(得分:0)

简短回答

不要使用场景。

长答案

您拥有的每个课程都应代表一个场景。实例化您的Intro课程并将该对象添加到显示列表中:您有新的"场景"。

为该对象添加一个侦听器,以等待它调度的事件以指示游戏的开始。在处理程序中,从显示中删除intro对象,实例化Game类(如果你还没有)并将该对象添加到显示中。

这是您应该如何从应用程序的一个状态转换到另一个状态的基本思路。