136 lines
3.5 KiB
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()
|