Lua中使用狀態機FSM簡單例子


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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM