Fixed removal

This commit is contained in:
Justin van der Leij 2018-03-09 15:34:56 +01:00
parent 7053d91c80
commit eeadfc8817
3 changed files with 41 additions and 9 deletions

View file

@ -12,6 +12,7 @@ function Instance.new()
entities = List(), entities = List(),
systems = List(), systems = List(),
events = {}, events = {},
removed = {},
}, Instance) }, Instance)
return instance return instance
@ -39,16 +40,30 @@ function Instance:checkEntity(e)
return self return self
end end
--- Removes an Entity from the Instance. --- Marks an Entity as removed from the Instance.
-- @param e The Entity to remove -- @param e The Entity to mark
-- @return self -- @return self
function Instance:removeEntity(e) function Instance:removeEntity(e)
self.removed[#self.removed + 1] = e
return self
end
--- completely removes all marked Entities in the Instance.
-- @return self
function Instance:flush()
for i = 1, #self.removed do
local e = self.removed[i]
e.instances:remove(self) e.instances:remove(self)
self.entities:remove(e) self.entities:remove(e)
for i = 1, self.systems.size do for i = 1, self.systems.size do
self.systems:get(i):__remove(e) self.systems:get(i):__remove(e)
end end
end
self.removed = {}
return self return self
end end

View file

@ -7,7 +7,10 @@ function List.new()
return setmetatable({ return setmetatable({
objects = {}, objects = {},
pointers = {}, pointers = {},
removed = {},
size = 0, size = 0,
removeSize = 0,
}, mt) }, mt)
end end
@ -16,7 +19,10 @@ end
function List:clear() function List:clear()
self.objects = {} self.objects = {}
self.pointers = {} self.pointers = {}
self.removed = {}
self.size = 0 self.size = 0
self.removeSize = 0
return self return self
end end
@ -34,7 +40,7 @@ function List:add(obj)
return self return self
end end
--- Removes an object from the List. --- Removed an object from the List.
-- @param obj The object to remove -- @param obj The object to remove
-- @return self -- @return self
function List:remove(obj) function List:remove(obj)

View file

@ -89,10 +89,21 @@ 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))