Files
LoveDOS-Dungeon-Crawler/src/utils/asstmngr.lua

136 lines
3.5 KiB
Lua

------------------------------------------------------------------------------
-- 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/BBrick.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.assets[owner].co == nil then
self.assets[owner].co = coroutine.create(_load)
end
local errorfree, retval = coroutine.resume(self.assets[owner].co, self, owner)
if errorfree then
self.assets[owner].done = retval
if retval then
self.assets[owner].co = nil
end
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,
co = nil,
}
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()