version: cocos2d-x 3.6ide
狀態機主要分爲2大類:第一類,若輸出只和狀態有關而與輸入無關,則稱爲Moore狀態機;第二類,輸出不只和狀態有關並且和輸入有關係,則稱爲Mealy狀態機。函數
例如一個跑酷遊戲,角色有以下狀態:跑動,滑行,起跳,下落,飛行等。每個狀態有持續時間,和該狀態期間的處理邏輯,當前狀態由用戶輸入和上一個狀態肯定。那麼很容易想到角色的狀態變化經過狀態機來實現,很是的方便。lua
每一個狀態的進入、退出和持續過程都有本身的邏輯,因此咱們要爲每個狀態實現它們本身的邏輯處理接口。設計
狀態函數的參數根據本身項目的需求來設計code
各狀態的update返回當前狀態的完成度百分比,當返回100%說明該狀態結束,須要切換到下一狀態。如:下落過程當中,onUpdateFall返回100%說明着陸了,須要切換到跑狀態(下一個狀態也可經過update返回)。接口
local Actor = class("Actor") -- 1.run function Actor:onEnterRun() -- TODO 進入run狀態時,進行該狀態的初始化操做 end function Actor:onUpdateRun(dtTime, curTime) -- TODO (每一幀都會調用)在run狀態過程當中,進行的邏輯操做 --return 0.5 --return 1, nextState end function Actor:onExitRun() -- TODO 退出run狀態是,進行該狀態的退出處理 end -- 2.glide 3.jump 4.fall 5.fly return Actor
各狀態的邏輯實現後,那麼就能夠實現狀態機。其實它就是一個與狀態相關的函數回調錶。遊戲
Actor.FUNC_ONENTER = "onEnter" Actor.FUNC_UPDATE = "onUpdate" Actor.FUNC_ONEXIT = "onExit" function Actor:initStateMachine() self.stateMachine = {} self.stateMachine["RUN"] = { Actor.FUNC_ONENTER = Actor.onEnterRun, Actor.FUNC_UPDATE = Actor.onUpdateRun, Actor.FUNC_ONEXIT = Actor.onExitRun } self.stateMachine["JUMP"] = { Actor.FUNC_ONENTER = Actor.onEnterJump, Actor.FUNC_UPDATE = Actor.onUpdateJump, Actor.FUNC_ONEXIT = Actor.onExitJump } -- TODO other state .... end
在遊戲過程當中,Actor類會維護一個本身當前狀態的變量 self.curState
it
self.stateMachine[self.curState].FUNC_UPDATE(self, dtTime, curTime)
self.stateMachine[self.curState].FUNC_ONEXIT(self) self.stateMachine[nextState].FUNC_ONENTER(self)