Skip to content

Commit 8e0db4a

Browse files
committed
very simple scene management without queueing
1 parent a79ce7f commit 8e0db4a

File tree

2 files changed

+162
-0
lines changed

2 files changed

+162
-0
lines changed

main.lua

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
local manager = require 'roomy'.new()
2+
3+
local state = {}
4+
5+
state.title = {}
6+
7+
function state.title:keypressed(key)
8+
if key == 'return' then
9+
manager:enter(state.gameplay, 'hi!')
10+
end
11+
end
12+
13+
function state.title:leave(next, ...)
14+
print('leaving the title screen for', next, ...)
15+
end
16+
17+
function state.title:draw()
18+
love.graphics.print 'title'
19+
end
20+
21+
state.gameplay = {}
22+
23+
function state.gameplay:keypressed(key)
24+
if key == 'return' then
25+
manager:enter(state.title)
26+
elseif key == 'space' then
27+
manager:push(state.pause)
28+
end
29+
end
30+
31+
function state.gameplay:pause(...)
32+
print('pause', ...)
33+
end
34+
35+
function state.gameplay:resume(...)
36+
print('resume', ...)
37+
end
38+
39+
function state.gameplay:draw()
40+
love.graphics.print 'gameplay'
41+
end
42+
43+
state.pause = {}
44+
45+
function state.pause:keypressed(key)
46+
manager:pop(love.math.random(), love.math.random())
47+
end
48+
49+
function state.pause:draw()
50+
love.graphics.print 'pause'
51+
end
52+
53+
function love.load()
54+
manager:hook()
55+
manager:enter(state.title)
56+
end
57+
58+
function love.keypressed(key)
59+
if key == 'escape' then love.event.quit() end
60+
end

roomy.lua

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
local roomy = {}
2+
3+
local loveCallbacks = {
4+
'directorydropped',
5+
'draw',
6+
'filedropped',
7+
'focus',
8+
'gamepadaxis',
9+
'gamepadpressed',
10+
'gamepadreleased',
11+
'joystickaxis',
12+
'joystickhat',
13+
'joystickpressed',
14+
'joystickreleased',
15+
'joystickremoved',
16+
'keypressed',
17+
'keyreleased',
18+
'load',
19+
'lowmemory',
20+
'mousefocus',
21+
'mousemoved',
22+
'mousepressed',
23+
'mousereleased',
24+
'quit',
25+
'resize',
26+
'run',
27+
'textedited',
28+
'textinput',
29+
'threaderror',
30+
'touchmoved',
31+
'touchpressed',
32+
'touchreleased',
33+
'update',
34+
'visible',
35+
'wheelmoved',
36+
'joystickadded',
37+
}
38+
39+
-- returns a list of all the items in t1 that aren't in t2
40+
local function exclude(t1, t2)
41+
local set = {}
42+
for _, item in ipairs(t1) do set[item] = true end
43+
for _, item in ipairs(t2) do set[item] = nil end
44+
local t = {}
45+
for item, _ in pairs(set) do
46+
table.insert(t, item)
47+
end
48+
return t
49+
end
50+
51+
local Manager = {}
52+
Manager.__index = Manager
53+
54+
function Manager:emit(event, ...)
55+
local state = self._stack[#self._stack]
56+
if state[event] then state[event](state, ...) end
57+
end
58+
59+
function Manager:enter(next, ...)
60+
local previous = self._stack[#self._stack]
61+
self:emit('leave', next, ...)
62+
self._stack[#self._stack] = next
63+
self:emit('enter', previous, ...)
64+
end
65+
66+
function Manager:push(next, ...)
67+
local previous = self._stack[#self._stack]
68+
self:emit('pause', next, ...)
69+
self._stack[#self._stack + 1] = next
70+
self:emit('enter', previous, ...)
71+
end
72+
73+
function Manager:pop(...)
74+
local previous = self._stack[#self._stack]
75+
local next = self._stack[#self._stack - 1]
76+
self:emit('leave', next, ...)
77+
self._stack[#self._stack] = nil
78+
self:emit('resume', previous, ...)
79+
end
80+
81+
function Manager:hook(options)
82+
options = options or {}
83+
local callbacks = options.include or loveCallbacks
84+
if options.exclude then
85+
callbacks = exclude(callbacks, options.exclude)
86+
end
87+
for _, callbackName in ipairs(callbacks) do
88+
local oldCallback = love[callbackName]
89+
love[callbackName] = function(...)
90+
if oldCallback then oldCallback(...) end
91+
self:emit(callbackName, ...)
92+
end
93+
end
94+
end
95+
96+
function roomy.new()
97+
return setmetatable({
98+
_stack = {{}},
99+
}, Manager)
100+
end
101+
102+
return roomy

0 commit comments

Comments
 (0)