
In this post, I’ll show you how to write a compact scene manager for your TIC-80 games. Feel free to check out the code and let me know if you have any suggestions for further optimization!
You can play the TIC-80 cart online here: Play TIC-80 Cart
-- scene manager
function sceneManager()
	return {
		scenes = {},
		curr = nil,
		register = function(self, s, n) self.scenes[n] = s end,
		switch = function(self, n)
			self.curr = n
			self.scenes[n]:init()
		end,
		init = function(self) self.scenes[self.curr]:init() end,
		update = function(self) self.scenes[self.curr]:update() end,
		draw = function(self) self.scenes[self.curr]:draw() end
	}
end
sMgr = sceneManager()
-- menu scene
function Menu()
	local s = {}
	function s:init()
		-- empty
	end
	function s:update()
		if btnp(4) then sMgr:switch("Game") end
	end
	function s:draw()
		cls(0)
		print("> Menu Scene ...", 0, 50, 4)
	end
	return s
end
-- game scene
function Game()
	local s = {}
	function s:init()
		-- empty
	end
	function s:update()
		if btnp(4) then sMgr:switch("Menu") end
	end
	function s:draw()
		cls(0)
		print("> Game Scene ...", 0, 50, 3)
	end
	return s
end
-- init
function init()
	sMgr:register(Menu(), "Menu")
	sMgr:register(Game(), "Game")
	sMgr:switch("Menu")
end
-- main
init()
function TIC()
	sMgr:update() -- update scene
	sMgr:draw() -- draw scene
end