diff --git a/fluid/instance.lua b/fluid/instance.lua index 93013c8..a3b8da8 100644 --- a/fluid/instance.lua +++ b/fluid/instance.lua @@ -12,6 +12,7 @@ function Instance.new() entities = List(), systems = List(), events = {}, + removed = {}, }, Instance) return instance @@ -39,17 +40,31 @@ function Instance:checkEntity(e) return self end ---- Removes an Entity from the Instance. --- @param e The Entity to remove +--- Marks an Entity as removed from the Instance. +-- @param e The Entity to mark -- @return self function Instance:removeEntity(e) - e.instances:remove(self) - self.entities:remove(e) + self.removed[#self.removed + 1] = e - for i = 1, self.systems.size do - self.systems:get(i):__remove(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) + self.entities:remove(e) + + for i = 1, self.systems.size do + self.systems:get(i):__remove(e) + end end + self.removed = {} + return self end diff --git a/fluid/list.lua b/fluid/list.lua index b464a27..53e654c 100644 --- a/fluid/list.lua +++ b/fluid/list.lua @@ -7,7 +7,10 @@ function List.new() return setmetatable({ objects = {}, pointers = {}, - size = 0, + removed = {}, + + size = 0, + removeSize = 0, }, mt) end @@ -16,7 +19,10 @@ end function List:clear() self.objects = {} self.pointers = {} - self.size = 0 + self.removed = {} + + self.size = 0 + self.removeSize = 0 return self end @@ -34,7 +40,7 @@ function List:add(obj) return self end ---- Removes an object from the List. +--- Removed an object from the List. -- @param obj The object to remove -- @return self function List:remove(obj) diff --git a/main.lua b/main.lua index 1150623..6cafe47 100644 --- a/main.lua +++ b/main.lua @@ -89,10 +89,21 @@ function RandomRemover:update(dt) love.window.setTitle(love.timer.getFPS()) 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(RectangleRenderer(), "draw") Game:addSystem(CircleRenderer(), "draw") +Game:addSystem(RemovalSystem(Game), "update", false) + for i = 1, 100 do local e = Entity() e:give(Position, love.math.random(0, 700), love.math.random(0, 700))