Added assets manager singleton.

This commit is contained in:
2025-10-05 17:47:17 -04:00
parent 03b5d1dafb
commit 82d2a89a0a
12 changed files with 329 additions and 35 deletions

130
src/utils/asstmngr.lua Normal file
View File

@@ -0,0 +1,130 @@
------------------------------------------------------------------------------
-- Imports
------------------------------------------------------------------------------
local love = require 'love'
local make_class = require 'src.utils.classes'
local Drawable = require 'src.graphics.drawable'
local Sprite = require 'src.graphics.sprite'
local Font = require 'src.ui.font'
------------------------------------------------------------------------------
-- Class definitions
------------------------------------------------------------------------------
local AssetManager = make_class(Drawable)
local Asset = require 'src.utils.asset'
------------------------------------------------------------------------------
-- Helper functions
------------------------------------------------------------------------------
local function _load(manager, owner)
if manager.assets[owner] ~= nil then
for k, _ in pairs(manager.assets[owner]) do
if k.is_a ~= nil and k.is_a[Asset] then
k:load()
end
coroutine.yield(false)
end
end
return true
end
------------------------------------------------------------------------------
-- Class methods
------------------------------------------------------------------------------
function AssetManager:_init()
Drawable._init(self)
self.assets = {}
self.bckg = Sprite('imgs/floppy.png')
self.font = Font('fonts/Concrete.ttf', 40)
self.co = nil
self.bckg:load()
self.font:load()
end
function AssetManager:unload(owner)
-- If the owner is known...
if self.assets[owner] ~= nil then
-- Iterate over it's asset set and unload everything.
for k, _ in pairs(self.assets[owner]) do
if k.is_a ~= nil and k.is_a[Asset] then
k:unload()
end
end
end
end
function AssetManager:update(owner)
if self.assets[owner] ~= nil then
if self.co == nil then
self.co = coroutine.create(_load)
end
local errorfree, retval = coroutine.resume(self.co, self, owner)
if errorfree then
self.assets[owner].done = retval
else
error(retval)
end
end
end
function AssetManager:draw()
self.bckg:draw()
love.graphics.setColor(195, 147, 123)
self.font:set()
love.graphics.print('Loading...', 5, 150)
self.font:unset()
love.graphics.setColor()
end
function AssetManager:register(owner, asset)
-- If the owner is new, then create an asset set for it.
if self.assets[owner] == nil then
self.assets[owner] = {
done = false,
}
end
-- Store the asset in the set.
self.assets[owner][asset] = true
end
function AssetManager:remove(owner, asset)
-- If the owner is new, then create an asset set for it.
if self.assets[owner] ~= nil then
-- Unload the asset just in case.
if self.assets[owner][asset] ~= nil then
self.assets[owner][asset]:unload()
end
-- Then remove it from the set.
self.assets[owner][asset] = nil
end
end
function AssetManager:done(owner)
return self.assets[owner] ~= nil and self.assets[owner].done
end
------------------------------------------------------------------------------
-- Module return
------------------------------------------------------------------------------
return AssetManager()