使用包含在状态循环内的MovieClip的按钮

时间:2014-07-04 05:39:20

标签: actionscript-3 flash

我根据书中的一些例子实现了一个非常简单的状态循环:" Flash游戏的基本指南"杰夫和史蒂夫富尔顿;在这个状态机中,我有一个循环,通过Enter_Frame事件将阶段更新为目标gameState var。

在我的菜单状态中,我有一个按钮,在OVER状态下有一个MovieClip,只要按钮处于OVER状态,该按钮通常会无限循环,但剪辑甚至不会播放一次;由于Enter_Frame事件每帧都放置一个新实例,我猜测它的问题是:有没有更好的方法来更新状态循环,只有当gameState var改变或听起来像是错误的猜测时问题

让我知道如果这个细节太模糊,我不确定发布代码片段是否真的有助于这个问题...... 感谢您提前阅读和任何回复! 这是代码! : - )

//imports here  
public class Loop extends MovieClip {
    public static const STATE_MMENU:int = 10;
    public static const STATE_OPTIONS:int = 11;
    public static const STATE_NGAME:int = 20;
    public static const STATE_CHARSELECT:int = 21;
    public static const STATE_BATMAP:int = 22;
    public static const STATE_BATSTORY:int = 23
    public static const STATE_BATTLE:int = 30;
    public static const STATE_DOMDICEPHASE:int = 31;
    public static const STATE_ROLLPROCESS:int = 32;
    public static const STATE_WINLOSSPHASE:int = 33;

    public var gameState:int = 0;

    public function Loop():void {

        addEventListener(Event.ENTER_FRAME, gameLoop);
        gameState = STATE_MMENU;
    }

    public function gameLoop(e:Event):void{
        switch(gameState){
            case STATE_MMENU:        mainMenu();            break;
            case STATE_OPTIONS:      optionsMenu();         break;
            case STATE_NGAME:        newGame();             break;
            case STATE_CHARSELECT:   charaSelect();         break;
            case STATE_BATMAP:       battleMap();           break;
            case STATE_BATSTORY:     battleStory();         break;
            case STATE_BATTLE:       battlePhase();         break;
            case STATE_DOMDICEPHASE: domDicePhase();        break;
            case STATE_ROLLPROCESS:  rollProcessPhase();    break;
            case STATE_WINLOSSPHASE: winLossPhase();        break;
        }
}
        //insert functions for phases/states here lol :-0

        public function mainMenu(){
        var titleText:title_gfx = new title_gfx();
        titleText.x = 520;      titleText.y = 150;
        addChild(titleText);

        var newGameSel:newGame_btn = new newGame_btn();
        newGameSel.x = 512;     newGameSel.y = 300;
        addChild(newGameSel);
        //newGameSel.addEventListener(Mouse.MouseEvent.CLICK, newGameButton);

我在mainMenu()函数中插入带有movieclip的按钮... 再次感谢!

1 个答案:

答案 0 :(得分:0)

你基本上每帧都添加一个新的titleText和newGameSel。如果您的FPS为24,则每秒为每个按钮添加24个动画片段。您可以保留一个全局布尔变量,如isMainMenuCreated,最初为false,并在第一次实例化按钮后将其设置为true。

 public var gameState:int = 0;
 public var isMainMenuCreated:Boolean = false;

 //rest of your code

 public function mainMenu():void { 
    if(isMainMenuCreated) return;

    //code for button instantiation and placing
    isMainMenuCreated = true;
 }

这是一种方法。其他方法是删除mainMenu函数中的ENTER_FRAME事件侦听器,并在单击新游戏按钮后重新添加它。后者会更高效,因为你只需要在需要时保持游戏状态循环。当玩家什么也不做时,你真的不需要每秒24次更新主菜单屏幕。

另一件需要考虑的事情是,如果你真的需要游戏中的游戏循环。有些游戏,比如动作游戏,你需要实时更新图形(想想平台游戏)需要一个游戏循环。点击游戏并不需要游戏循环。

相关问题