• 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()
    
  • 相关阅读:
    Servlet三种实现方法(四)
    Tomcat 网站部署(三)
    MySQL表的增删改查和列的修改(二)
    Tomcat的目录结构(二)
    addEventListener,attachEvent
    DOM事件流
    函数内部的函数中的this都是指向window
    css3 translate属性
    parent,parents和closest
    each用法
  • 原文地址:https://www.cnblogs.com/tangyongle/p/8135722.html
Copyright © 2020-2023  润新知