XNA - 簡易選單

XNA - 簡易選單

相信有學過compiler的人都稍微知道有限狀態機,寫遊戲的時候,很多地方都可以用到,

簡單的說,有限狀態機就是一個描述狀態改變的機器,可以由什麼狀態變換成哪個狀態的描述,

由此可以清楚規劃我們的行為。

簡單的狀態機可以是用來表示選單,如下:

image

S1是開始狀態,在S1的狀態下,Key Down時狀態移到S2,Key Up時狀態移到S3,

狀態機也有用在AI方面,用來判斷戰略方向。也可以用在人物控制。

就以上面的狀態機圖為準,我們用選單來做個例子,說明簡單的狀態機可以如何實作。

在畫好狀態機後,就可以知道有多少狀態,因此我用列舉來表示這些狀態:

 


        private enum MenuStateEnum {
            Select1,
            Select2,
            Select3,
        }

而取得輸入裝置通常在Update內執行:

 


        public override void Update(GameTime gameTime) {
            KeyboardState keyboardState = Keyboard.GetState();
            switch (State) {
            case MenuStateEnum.Select1:
                if(oneClick(keyboardState, Keys.Up)){
                    selectMenu(menuList[0], menuList[2]);
                    State = MenuStateEnum.Select3;
                } else if (oneClick(keyboardState, Keys.Down)) {
                    selectMenu(menuList[0], menuList[1]);
                    State = MenuStateEnum.Select2;
                }
                break;
            case MenuStateEnum.Select2:
                if (oneClick(keyboardState, Keys.Up)) {
                    selectMenu(menuList[1], menuList[0]);
                    State = MenuStateEnum.Select1;
                } else if (oneClick(keyboardState, Keys.Down)) {
                    selectMenu(menuList[1], menuList[2]);
                    State = MenuStateEnum.Select3;
                }
                break;
            case MenuStateEnum.Select3:
                if (oneClick(keyboardState, Keys.Up)) {
                    selectMenu(menuList[2], menuList[1]);
                    State = MenuStateEnum.Select2;
                } else if (oneClick(keyboardState, Keys.Down)) {
                    selectMenu(menuList[2], menuList[0]);
                    State = MenuStateEnum.Select1;
                }
                break;
            }
            preKeyboardState = keyboardState;
            base.Update(gameTime);
        }

用switch的方式判斷現在的狀態,並且在遇到鍵盤上下鍵被按下的情況改變狀態。程式碼非常簡單。

範例檔:XNA - 簡易選單.rar