c1_lua/lua/app/bf/state_machine/state_machine.lua
2023-04-03 10:59:13 +08:00

109 lines
2.6 KiB
Lua

local StateMachine = class("StateMachine")
function StateMachine:ctor()
self.stateMap = {}
self.active = false
self.curStateKey = nil
self.curState = nil
end
---- 获取是否active
function StateMachine:getIsActive()
return self.active
end
---- 获取当前state StateInterface
function StateMachine:getCurState()
return self.curState
end
---- 获取当前state对应的key
function StateMachine:getCurStateKey()
return self.curStateKey
end
---- 获取state
function StateMachine:getStateByKey(key)
return self.stateMap[key]
end
---- 注册一个state
function StateMachine:registerState(stateKey, state)
if self.stateMap[stateKey] then
Logger.logWarning("StateMachine registerState: state machine already have state %s", stateKey)
return
end
self.stateMap[stateKey] = state
end
---- 改变状态
function StateMachine:changeState(stateKey, params)
if not self.active then
Logger.logWarning("StateMachine changeState: state machine not active")
return
end
local newState = self.stateMap[stateKey]
if newState then
self.curState:exit()
self.curState = newState
self.curStateKey = stateKey
self.curState:enter(params)
else
Logger.logWarning("StateMachine changeState: state machine no such state %s", stateKey)
end
end
---- start状态机
function StateMachine:start(stateKey, params)
if self.active then
return
end
local newState = self.stateMap[stateKey]
if newState then
self.curState = newState
self.curState:enter(params)
self.curStateKey = stateKey
self.active = true
else
Logger.logWarning("StateMachine start: state machine no such state %s", stateKey)
end
end
---- 重新开始状态机
function StateMachine:restart(stateKey, params)
local newState = self.stateMap[stateKey]
if newState then
if self.active then
self.curState:exit()
end
self.curState = newState
self.curStateKey = stateKey
self.curState:enter(params)
self.active = true
else
Logger.logWarning("StateMachine restart: state machine no such state %s", stateKey)
end
end
---- 停止状态机
function StateMachine:stop()
if not self.active then
return
end
self.curState:exit()
self.curState = nil
self.curStateKey = nil
self.active = false
for _, state in pairs(self.stateMap) do
state:clear()
end
end
---- 每帧tick当前状态
function StateMachine:tick()
if self.active then
self.curState:tick()
end
end
return StateMachine