50 lines
1.2 KiB
Lua
50 lines
1.2 KiB
Lua
-- Maquina d'escenes (FSM simple).
|
|
--
|
|
-- Cada escena es una taula amb les funcions opcionals:
|
|
-- entra(servicis, args) -- en activar-se (rep els servicis globals)
|
|
-- ix() -- en eixir (per netejar timers, etc)
|
|
-- update(dt) -- per frame, amb delta en segons
|
|
-- draw() -- per frame, despres d'update()
|
|
--
|
|
-- El motor d'ascii no separa update i draw; ho fem aci nosaltres per
|
|
-- mantindre el codi de cada escena ordenat.
|
|
|
|
local M = {}
|
|
|
|
M.servicis = {} -- injectat des de main.lua
|
|
M.escenes = {} -- nom -> escena
|
|
M.actual = nil -- escena activa
|
|
|
|
function M.registra(nom, escena)
|
|
M.escenes[nom] = escena
|
|
end
|
|
|
|
function M.canvia(nom, args)
|
|
local seguent = M.escenes[nom]
|
|
if not seguent then
|
|
log("[manager] escena desconeguda: "..tostr(nom))
|
|
return
|
|
end
|
|
if M.actual and M.actual.ix then
|
|
M.actual.ix()
|
|
end
|
|
M.actual = seguent
|
|
if M.actual.entra then
|
|
M.actual.entra(M.servicis, args or {})
|
|
end
|
|
end
|
|
|
|
function M.update(dt)
|
|
if M.actual and M.actual.update then
|
|
M.actual.update(dt)
|
|
end
|
|
end
|
|
|
|
function M.draw()
|
|
if M.actual and M.actual.draw then
|
|
M.actual.draw()
|
|
end
|
|
end
|
|
|
|
return M
|