我根据书中的一些例子实现了一个非常简单的状态循环:" 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的按钮... 再次感谢!
答案 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次更新主菜单屏幕。
另一件需要考虑的事情是,如果你真的需要游戏中的游戏循环。有些游戏,比如动作游戏,你需要实时更新图形(想想平台游戏)需要一个游戏循环。点击游戏并不需要游戏循环。