Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 在对象/电影唇上显示主菜单?_Actionscript 3_Flash Cs6 - Fatal编程技术网

Actionscript 3 在对象/电影唇上显示主菜单?

Actionscript 3 在对象/电影唇上显示主菜单?,actionscript-3,flash-cs6,Actionscript 3,Flash Cs6,我正在用Flash创建一个游戏,我正在为游戏创建一个主菜单(带有“Play”、“How to Play”、“Hiscores”等按钮),我想知道最好的方法是什么 我所有的Actionscript代码都是外部的。作为文件,我一直在使用类,但我很难弄清楚如何获取它,以便在游戏运行后立即显示菜单。主要的问题是,我的游戏中有一些计时器附加了事件处理程序,我试图想出最好的方法来基本上停止这些计时器,直到用户真正单击“播放”,否则对象会在菜单顶部生成,计时器会停止 停止计时器,然后将事件处理程序添加到播放按

我正在用Flash创建一个游戏,我正在为游戏创建一个主菜单(带有“Play”、“How to Play”、“Hiscores”等按钮),我想知道最好的方法是什么

我所有的Actionscript代码都是外部的。作为文件,我一直在使用类,但我很难弄清楚如何获取它,以便在游戏运行后立即显示菜单。主要的问题是,我的游戏中有一些计时器附加了事件处理程序,我试图想出最好的方法来基本上停止这些计时器,直到用户真正单击“播放”,否则对象会在菜单顶部生成,计时器会停止

停止计时器,然后将事件处理程序添加到播放按钮以启动计时器是一个好主意吗?我正试图找出最好的方法来做这件事,以备将来参考

谢谢你的帮助

编辑:尝试了切尔尼夫的建议,得到了一些错误

Main.as:

package  {
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.display.DisplayObject;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.TimerEvent;
    import flash.utils.Timer;
    import flash.ui.Mouse;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.text.TextFormat;
    import flash.text.TextField;
    import flash.display.Loader;
    import flash.net.URLRequest;
    import flash.net.URLLoader;
    import flash.system.LoaderContext;
    import flash.display.Sprite;
    import flash.net.Socket;


    public class Main extends MovieClip {

    public static var gameLayer:Sprite = new Sprite;
    public static var endGameLayer:Sprite = new Sprite;
    public static var menuLayer:Sprite = new Sprite;

    public var gameTime:int;
    public var levelDuration:int;

    public var crosshair:crosshair_mc;
    static var score:Number;

    var enemyShipTimer:Timer;
    var enemyShipTimerMed:Timer;
    var enemyShipTimerSmall:Timer;

    static var scoreHeader:TextField = new TextField();
    static var scoreText:TextField = new TextField();
    static var timeHeader:TextField = new TextField();
    static var timeText:TextField = new TextField();

    public function Main()
    {
        var mainMenu:myMenu = new myMenu;
        addChild(gameLayer);
        addChild(endGameLayer);
        addChild(menuLayer);

        playBtn.addEventListener(MouseEvent.CLICK, startButtonPressed);
    }

    function startButtonPressed(e:Event)
    {
        levelDuration = 30;
        gameTime = levelDuration;
        var gameTimer:Timer = new Timer(1000,levelDuration);
        gameTimer.addEventListener(TimerEvent.TIMER, updateTime);
        gameTimer.addEventListener(TimerEvent.TIMER_COMPLETE, timeExpired)
        gameTimer.start();

        scoreHeader = new TextField();
        scoreHeader.x = 5;
        scoreHeader.text = String("Score: ");
        gameLayer.addChild(scoreHeader);

        scoreText = new TextField();
        scoreText.x = 75;
        scoreText.y = 0;
        scoreText.text = String(0);
        gameLayer.addChild(scoreText);

        timeHeader = new TextField();
        timeHeader.x = 490;
        timeHeader.y = 0;
        timeHeader.text = String("Time: ");
        gameLayer.addChild(timeHeader);

        timeText = new TextField();
        timeText.x = 550;
        timeText.y = 0;
        timeText.text = gameTime.toString();
        gameLayer.addChild(timeText);

        var scoreFormat = new TextFormat("Arial Rounded MT Bold", 20, 0xFFFFFF);
        scoreHeader.setTextFormat(scoreFormat);
        scoreText.setTextFormat(scoreFormat);
        timeHeader.setTextFormat(scoreFormat);
        timeText.setTextFormat(scoreFormat);

        enemyShipTimer = new Timer(2000);
        enemyShipTimer.addEventListener("timer", sendEnemy);
        enemyShipTimer.start();

        enemyShipTimerMed = new Timer(2500);
        enemyShipTimerMed.addEventListener("timer", sendEnemyMed);
        enemyShipTimerMed.start();

        enemyShipTimerSmall = new Timer(2750);
        enemyShipTimerSmall.addEventListener("timer", sendEnemySmall);
        enemyShipTimerSmall.start();

        crosshair = new crosshair_mc();
        gameLayer.addChild(crosshair);

        crosshair.mouseEnabled = crosshair.mouseChildren = false;

        Mouse.hide();

        gameLayer.addEventListener(Event.ENTER_FRAME, moveCursor);
        resetScore();
    }

    function sendEnemy(e:Event)
    {
        var enemy = new EnemyShip();
        gameLayer.addChild(enemy);
        gameLayer.addChild(crosshair);
    }

    function sendEnemyMed(e:Event)
    {
        var enemymed = new EnemyShipMed();
        gameLayer.addChild(enemymed);
        gameLayer.addChild(crosshair);
    }

    function sendEnemySmall(e:Event)
    {
        var enemysmall = new EnemyShipSmall();
        gameLayer.addChild(enemysmall);
        gameLayer.addChild(crosshair);
    }

    static function updateScore(points)
    {
        score += points;
        scoreText.text = String(score);
        var scoreFormat = new TextFormat("Arial Rounded MT Bold", 20, 0xFFFFFF);
        scoreHeader.setTextFormat(scoreFormat);
        scoreText.setTextFormat(scoreFormat);
    }

    static function resetScore()
    {
        score = 0;
        scoreText.text = String(score);
    }

    function updateTime(e:TimerEvent):void
    {
        trace(gameTime);
        // your class variable tracking each second, 
        gameTime--;
        //update your user interface as needed
        var scoreFormat = new TextFormat("Arial Rounded MT Bold", 20, 0xFFFFFF);
        timeText.defaultTextFormat = scoreFormat;
        timeText.text = String(gameTime);
    }

    function timeExpired(e:TimerEvent):void
    {
        var gameTimer:Timer = e.target as Timer;
        gameTimer.removeEventListener(TimerEvent.TIMER, updateTime)
        gameTimer.removeEventListener(TimerEvent.TIMER, timeExpired)
        // do whatever you need to do for game over
    }

    function moveCursor(event:Event) 
    {
      crosshair.x=mouseX;
      crosshair.y=mouseY;
    }
  }
}
Menu.as:

package  {
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.display.DisplayObject;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.TimerEvent;
    import flash.utils.Timer;
    import flash.ui.Mouse;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.text.TextFormat;
    import flash.text.TextField;
    import flash.display.Loader;
    import flash.net.URLRequest;
    import flash.net.URLLoader;
    import flash.system.LoaderContext;
    import flash.display.Sprite;
    import flash.net.Socket;

    public class Menu extends MovieClip
    {

    var mainMenu:Menu = new Menu();

    Main.menuLayer.addChild(myMenu);

    playBtn.addEventListener(MouseEvent.CLICK, playBtnPressed);

    function playBtnPressed()
    {
        Main.menuLayer.removeChild(myMenu);
        dispatchEvent(new Event("playButtonPressed"))
    }
    }
我的菜单是一个名为
myMenu
的movieclip,该类被设置为
menu
,但我会遇到以下错误:

Main.as, Line 50 1120: Access of undefined property playBtn

在我将菜单转换为movieclip之前,我给了按钮一个playBtn的实例名,所以不确定那里发生了什么。我可能错过了一些非常简单的东西,但键入一整天之后,我有点困惑。

如果主构造函数中有所有初始化内容(包括计时器初始化),那么需要将其拆分为两个函数,主构造函数将显示菜单,“开始”按钮将启动第二个函数,这将包括所有初始化内容

Ah,因此只需将菜单放入
Main
构造函数中,并将所有其他内容(视情况而定)放入另一个函数中即可。我对菜单还是不太清楚;将其制作成movieclip并导入库还是以其他方式更好?将菜单放入menu类,然后在主类构造函数中实例化并运行它,如
var myMenu:menu=new menu()请原谅我的困惑(最近到处乱逛)。那么,从菜单中创建一个movieclip并将类设置为
menu
,然后在
Main
构造函数中实例化并运行它?无需创建
菜单。作为
Actionscript文件?不,您的菜单
movieclip
就是菜单,在其库属性中将其类设置为
Menu
,并将类本身放在Menu.asYeah中,因为我对其他对象也是这样做的(也就是说,随机产卵船是一个名为
EnemyShip
的类的movieclip,类代码在
EnemyShip.as
文件中),但我想我会仔细检查一下。谢谢。