Added assets manager singleton.
This commit is contained in:
130
src/utils/asstmngr.lua
Normal file
130
src/utils/asstmngr.lua
Normal 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()
|
||||
Reference in New Issue
Block a user