在遊戲中,遊戲人物根據玩家的輸入以及人物與遊戲世界互動,會有許多動作動畫效果的轉換。簡單的比如馬里奧,
玩家沒有輸入,沒有發生遊戲事件(吃到蘑菇、碰到怪物)時,
馬里奧大叔靜止不動。玩家按下移動按鈕,馬里奧開始
走動,這時需要繪製走路的動畫效果。按下跳躍鍵,繪製跳躍的動畫效果。而按鍵和動作並不是一一對應的關係,
比如跳躍過程中按下左右移動鍵,並不能繪製
走路的動畫效果。
這些狀態之間的轉換可以使用if else,switch case,語句來完成,如下://這裡把人物寫成乙個role類貌似挺完美,嗯,這樣完美的情況僅僅只限於狀態比較少,狀態轉換比較簡單的條件下,如果人物狀態一增多,狀態轉換條件一變複雜,那將變成一場噩夢,**中會產生大量的class role
void jumpinput()
void walkinput()
}// 跳躍後角色落地,由碰撞檢測觸發
void onland()
private:
state _state;
}
if else條件判斷,比如我們再增加乙個蹲下的狀態,蹲下時按下跳躍鍵讓遊戲人物快速向前貼地滑動一段距離,rockman的操作好像就是這樣。再加乙個約束條件,蹲下時
按下左右移動鍵無效果。哇哦,這樣再看看上面那段簡單的**要變成什麼樣子了。
如何以一種條理清晰,便於維護的方式來實現以上需求呢? 以上需求的核心是狀態的轉換,自然而然,帶有「狀態」這個關鍵字的state模式首先成了思考方向。
state模式將每個狀態抽象成類,狀態的轉換由狀態自己來操作,是一種比較靈活的實現方式。基於state模式,將**重構如下(偽**):
// 偽**class istatus
;class idlestate;
right()
down()
jump()
}class walkstate
}class jumpstate;
class crouchstate
}class slipstate
role類:
class role// 輸入向下鍵
void down()
// 輸入向左鍵
void left()
// 輸入向右鍵
void right()
// 輸入跳躍鍵
void jump()
// 輸入攻擊鍵
void attack()
}
這樣用state模式來寫,後期維護和加入新的狀態也變得十分容易,加入新的狀態只需要加入乙個新的類,而不需變更以有的**。
狀態模式(State) 考勤系統
定義 狀態模式是物件的行為模式,允許乙個物件在其內部狀態改變時改變他的行為,這個物件看上去就像改變了他的類一樣。角色 環境 context 角色 定義客戶端感興趣的介面,並且保留乙個具體狀態類的例項,具體狀態類的例項給出環境類的當前狀態。抽象狀態 state 角色 定義乙個介面,用以封裝環境角色的具...
state模式在遊戲中的運用
好久沒有寫blog了!最近決定多寫寫,把自己的經驗多給大家分享!state模式的定義 不同的狀態,不同的行為 或者說,每個狀態有著相應的行為.我舉個遊戲應用的例子吧!mmo中,遊戲世界可以分為 登陸時前,進入遊戲中,進入遊戲後 3個狀態 我打的比喻 首先 抽象狀態的基類 class game cla...
設計模式實現(十二) 狀態模式 State
狀態模式 state 當乙個物件的內在狀態改變時,允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜的情況 也就是if過於多的情況 把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把複雜的判斷邏輯簡化。當然,如果這個狀態判斷很簡單,那麼...