FSM 有限狀態機:
一個有限狀態機是一個設備,或者是一個設備模型,具有有限數量的狀態,它可以在任何給定的時間根據輸入進行操作,使得一個狀態變換到另一個狀態,或者是使一個輸入或者一種行為的發生。一個有限狀態機在任何瞬間只能處在一種狀態。
進入動作
退出動作
更新動作
FsmMachine.lua
FsmMachine = {}
function FsmMachine:New()
self.__index = self
o = setmetatable({}, self)
o.states = {}
o.curState = nil
return o
end
-- 添加狀態
function FsmMachine:AddState(baseState)
self.states[baseState.stateName] = baseState
end
-- 初始化默認狀態
function FsmMachine:AddInitState(baseState)
self.curState = baseState
end
-- 更新當前狀態
function FsmMachine:Update()
self.curState:OnUpdate()
end
-- 切換狀態
function FsmMachine:Switch(stateName)
if self.curState.stateName ~= stateName then
self.curState:OnLeave()
self.curState = self.states[stateName]
self.curState:OnEnter()
end
end
狀態機基類
BaseState.lua
BaseState = {}
function BaseState:New(stateName)
self.__index = self
o = setmetatable({}, self)
o.stateName = stateName
return o
end
-- 進入狀態
function BaseState:OnEnter()
end
-- 更新狀態
function BaseState:OnUpdate()
end
-- 離開狀態
function BaseState:OnLeave()
end
測試類
Main.lua
require("BaseState")
require("FsmMachine")
FsmMachineTest = {}
-----[狀態A,覆蓋BaseState方法]----------------
aState = BaseState:New("aState")
function aState:OnEnter()
print("aState:OnEnter()")
end
function aState:OnUpdate()
print("aState:OnUpdate()")
end
function aState:OnLeave()
print("aState:OnLeave()")
end
-----[狀態B,覆蓋BaseState方法]----------------
bState = BaseState:New("bState")
function bState:OnEnter()
print("bState:OnEnter()")
end
function bState:OnUpdate()
print("bState:OnUpdate()")
end
function bState:OnLeave()
print("bState:OnLeave()")
end
-----[測試狀態機]-----------------------------
fsm = FsmMachine:New()
fsm:AddState(aState)
fsm:AddState(bState)
fsm:AddInitState(aState)
for i = 1, 10 do
if i == 5 then
fsm:Switch("bState")
end
fsm.curState:OnUpdate()
end
輸出
aState:OnUpdate()
aState:OnUpdate()
aState:OnUpdate()
aState:OnUpdate()
aState:OnUpdate()
aState:OnLeave()
bState:OnEnter()
bState:OnUpdate()
bState:OnUpdate()
bState:OnUpdate()
bState:OnUpdate()
bState:OnUpdate()