XNA - 簡易選單
相信有學過compiler的人都稍微知道有限狀態機,寫遊戲的時候,很多地方都可以用到,
簡單的說,有限狀態機就是一個描述狀態改變的機器,可以由什麼狀態變換成哪個狀態的描述,
由此可以清楚規劃我們的行為。
簡單的狀態機可以是用來表示選單,如下:
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