cocos2d-x lua 實現狀態機

cocos2d-x lua 實現狀態機

version: cocos2d-x 3.6ide

0.狀態機

狀態機主要分爲2大類:第一類,若輸出只和狀態有關而與輸入無關,則稱爲Moore狀態機;第二類,輸出不只和狀態有關並且和輸入有關係,則稱爲Mealy狀態機。函數


1.應用場景

例如一個跑酷遊戲,角色有以下狀態:跑動,滑行,起跳,下落,飛行等。每個狀態有持續時間,和該狀態期間的處理邏輯,當前狀態由用戶輸入和上一個狀態肯定。那麼很容易想到角色的狀態變化經過狀態機來實現,很是的方便。lua


2.實現

1) 各狀態的處理

每一個狀態的進入、退出和持續過程都有本身的邏輯,因此咱們要爲每個狀態實現它們本身的邏輯處理接口。設計

  • 狀態函數的參數根據本身項目的需求來設計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

2) 實現狀態機

各狀態的邏輯實現後,那麼就能夠實現狀態機。其實它就是一個與狀態相關的函數回調錶。遊戲

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

3) 使用狀態機

在遊戲過程當中,Actor類會維護一個本身當前狀態的變量 self.curStateit

  • 在遊戲過程的每一幀,調用update以執行當前狀態的邏輯處理。
self.stateMachine[self.curState].FUNC_UPDATE(self, dtTime, curTime)
  • 當用戶輸入、或當前狀態結束時(即update返回100%,那麼將切換狀態)
self.stateMachine[self.curState].FUNC_ONEXIT(self)
self.stateMachine[nextState].FUNC_ONENTER(self)
相關文章
相關標籤/搜索