Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ----------------------------
- --- STATE MACHINE DEFINITION & FUNCTIONS
- ---------------------------
- fsm = {}
- -- The format of the states table is as follows:
- --
- -- states = {
- -- state1_name = {
- -- name = state1_name,
- -- enter = func_enterState1,
- -- update = func_updateState1,
- -- exit = func_exitState1
- -- },
- -- state2_name = {
- -- name = state2_name,
- -- enter = func_enterState2,
- -- update = func_updateState2,
- -- exit = func_exitState2
- -- },
- -- state3_name = {
- -- name = state3_name,
- -- enter = func_enterState3,
- -- update = func_updateState3,
- -- exit = func_exitState3
- -- }
- -- }
- --
- -- func_enterState1 = function(self)
- -- must have a self object as argument
- -- things to run when entering state 1
- -- end
- -- func_updateState1 = function(self) -- to be run in the game loop
- -- must have a self object as argument
- -- things to run when updating state 1 with one step
- -- end
- -- func_exitState1 = function(self)
- -- must have a self object as argument
- -- things to run when exiting state 1
- -- end
- --
- -- in the func_updateState1() check for an event that triggers another state, let's say state2_name
- -- if such event occurs then use self:setState(states[state2_name]) to switch states
- --
- --
- function fsm:setState(newstate)
- assert(type(newstate.name) == 'string', "fsm:setState(): newstate.name must be string" )
- assert(type(newstate.enter) == 'function' or newstate.enter == nil, "fsm:setState(): newstate.enter must be a function or nil" )
- assert(type(newstate.update) == 'function' or newstate.update == nil, "fsm:setState(): newstate.update must be a function or nil" )
- assert(type(newstate.exit) == 'function' or newstate.exit == nil, "fsm:setState(): newstate.exit must be a function or nil" )
- self:doExit()
- self.state = newstate.name
- self.updateStateFunc = newstate.update
- self.exitStateFunc = newstate.exit
- if newstate.enter then
- debug.log(self.name.." - entering state:"..self.state)
- return newstate.enter(self)
- end
- end
- --[[
- function fsm:addState(_name, _enterStateFunc, _updateStateFunc, _exitStateFunc)
- assert(type(_name) == 'string', "fsm:addState(): _name must be string" )
- assert(type(_enterStateFunc) == 'function' or _enterStateFunc == nil, "fsm:addState(): _enterStateFunc must be a function or nil" )
- assert(type(_updateStateFunc) == 'function' or _updateStateFunc == nil, "fsm:addState(): _updateStateFunc must be a function or nil" )
- assert(type(_exitStateFunc) == 'function' or _exitStateFunc == nil, "fsm:addState(): _exitStateFunc must be a function or nil" )
- assert(self.states[_name] == nil, "fsm:addState() - state already exists")
- self.states[_name] = {
- name = _name,
- enterStateFunc = _enterStateFunc,
- updateStateFunc = _updateStateFunc,
- exitStateFunc = _exitStateFunc
- }
- end
- --]]
- function fsm:update()
- if self.updateStateFunc then
- debug.log(self.name.." - updating state:"..self.state)
- self:updateStateFunc()
- end
- end
- function fsm:doExit()
- if self.exitStateFunc then
- debug.log(self.name.." - exiting state:"..self.state)
- self:exitStateFunc()
- end
- end
- function fsm:new(states)--, state)
- local newfsm = {}
- -- use the kew table as a metatable for the new queue object
- setmetatable(newfsm, self)
- self.__index = self
- self.name = "state machine"
- newfsm.states = states or {}
- print(newfsm.states)
- --[[
- if state then
- newfsm:setState(state)
- elseif states then
- newfsm:setState(states[1])
- end --]]
- return newfsm
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement