-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfsm.lua
More file actions
74 lines (53 loc) · 1.15 KB
/
fsm.lua
File metadata and controls
74 lines (53 loc) · 1.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
local DummyState = {}
function DummyState:enter()
end
function DummyState:exit()
end
function DummyState:update(dt)
end
-- for coroutine
function wait(t)
local startTime = love.timer.getTime()
local endTime = startTime + t
while love.timer.getTime() < endTime do
coroutine.yield()
end
end
ThreadState = {}
ThreadState.__index = ThreadState
function ThreadState:enter()
end
function ThreadState:exit()
end
function ThreadState:update(dt)
local r, error = coroutine.resume(self.co)
if not r then
love.event.quit()
print(error)
end
end
function ThreadState.new(func)
-- create coroutine
local self = setmetatable({}, ThreadState)
self.co = coroutine.create(func)
return self
end
local FSM = { currentState = nil }
FSM.__index = FSM
function FSM.new(startState)
local self = setmetatable({}, FSM)
self:changeState(startState)
return self
end
function FSM:changeState(newState)
if self.currentState then
self.currentState:exit()
end
self.currentState = newState
self.currentState:enter()
end
function FSM:update(dt)
self.currentState:update(dt)
end
setmetatable(FSM, { __call = function(_, ...) return FSM.new(...) end })
return FSM