Removed the need for manual flushing. Systems now know about their instance

This commit is contained in:
Justin van der Leij 2018-03-23 23:40:35 +01:00
parent 358a455c8b
commit acd77fafa5
3 changed files with 23 additions and 19 deletions

View file

@ -52,6 +52,7 @@ end
--- Completely removes all marked Entities in the Instance. --- Completely removes all marked Entities in the Instance.
-- @return self -- @return self
function Instance:flush() function Instance:flush()
if #self.removed > 0 then
for i = 1, #self.removed do for i = 1, #self.removed do
local e = self.removed[i] local e = self.removed[i]
@ -64,6 +65,7 @@ function Instance:flush()
end end
self.removed = {} self.removed = {}
end
return self return self
end end
@ -75,8 +77,13 @@ end
-- @param enabled If the system is enabled. Defaults to true -- @param enabled If the system is enabled. Defaults to true
-- @return self -- @return self
function Instance:addSystem(system, eventName, callback, enabled) function Instance:addSystem(system, eventName, callback, enabled)
if system.__instance then
error("System already in instance '" ..system.__instance.."'")
end
if not self.systems:has(system) then if not self.systems:has(system) then
self.systems:add(system) self.systems:add(system)
system.__instance = self
end end
if eventName then if eventName then
@ -141,6 +148,8 @@ end
-- @param ... Parameters passed to listeners -- @param ... Parameters passed to listeners
-- @return self -- @return self
function Instance:emit(eventName, ...) function Instance:emit(eventName, ...)
self:flush()
local listeners = self.events[eventName] local listeners = self.events[eventName]
if listeners then if listeners then

View file

@ -129,6 +129,12 @@ function System:__tryRemove(e)
end end
end end
--- Returns the Instance the System is in.
-- @return The Instance
function System:getInstance()
return self.__instance
end
--- Returns if the System has the Entity. --- Returns if the System has the Entity.
-- @param The Entity to check for -- @param The Entity to check for
-- @return True if the System has the Entity. False otherwise -- @return True if the System has the Entity. False otherwise

View file

@ -89,21 +89,10 @@ function RandomRemover:update(dt)
love.window.setTitle(love.timer.getFPS()) love.window.setTitle(love.timer.getFPS())
end end
local RemovalSystem = System({})
function RemovalSystem:init(instance)
self.instance = instance
end
function RemovalSystem:update()
self.instance:flush()
end
Game:addSystem(RandomRemover(), "update") Game:addSystem(RandomRemover(), "update")
Game:addSystem(RectangleRenderer(), "draw") Game:addSystem(RectangleRenderer(), "draw")
Game:addSystem(CircleRenderer(), "draw") Game:addSystem(CircleRenderer(), "draw")
Game:addSystem(RemovalSystem(Game), "update", false)
for i = 1, 100 do for i = 1, 100 do
local e = Entity() local e = Entity()
e:give(Position, love.math.random(0, 700), love.math.random(0, 700)) e:give(Position, love.math.random(0, 700), love.math.random(0, 700))