From fa22f6f6f6357f3b1f78637fc022e6a8fd9cc894 Mon Sep 17 00:00:00 2001 From: Justin van der Leij Date: Wed, 21 Feb 2018 13:38:27 +0100 Subject: [PATCH] Some more work on system-instance interaction --- fluid/eventManager.lua | 4 +++- fluid/instance.lua | 31 ++++++++++++------------------- fluid/system.lua | 13 ++++++++++--- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/fluid/eventManager.lua b/fluid/eventManager.lua index 61d0066..0283a27 100644 --- a/fluid/eventManager.lua +++ b/fluid/eventManager.lua @@ -45,7 +45,9 @@ function EventManager:deregister(name, listener, callback) table.remove(listeners, index) listeners.count = listeners.count - 1 - return + if callback then + break + end end end end diff --git a/fluid/instance.lua b/fluid/instance.lua index 8d8005c..720a3ec 100644 --- a/fluid/instance.lua +++ b/fluid/instance.lua @@ -9,10 +9,9 @@ Instance.__index = Instance function Instance.new() local instance = setmetatable({ entities = List(), + systems = List(), + systemCount = {}, eventManager = EventManager(), - - systems = {}, - namedSystems = {}, }, Instance) return instance @@ -25,8 +24,8 @@ function Instance:addEntity(e) end function Instance:checkEntity(e) - for _, system in ipairs(self.systems) do - system:__checkEntity(e) + for i = 1, self.systems.size do + self.systems:get(i):__check(e) end end @@ -34,16 +33,14 @@ function Instance:removeEntity(e) e.instances:remove(self) self.entities:remove(e) - for _, system in ipairs(self.systems) do - system:__remove(e) + for i = 1, self.systems.size do + self.systems:get(i):__remove(e) end end function Instance:addSystem(system, eventName, callback) - if not self.namedSystems[system] then - self.systems[#self.systems + 1] = system - self.namedSystems[system] = system - end + self.systemCount[system] = (self.systemCount[system] or 0) + 1 + self.systems:add(system) self.eventManager:register(eventName, system, callback) @@ -51,16 +48,12 @@ function Instance:addSystem(system, eventName, callback) end function Instance:removeSystem(system, callback) - for index, other in ipairs(self.systems) do - if system == other then - table.remove(self.systems, index) - end + self.systemCount[system] = self.systemCount[system] - 1 + if self.systemCount[system] == 0 then + self.systemCount[system] = nil + self.eventManager:deregister(eventName, system, callback) end - self.eventManager:deregister(eventName, system, callback) - - self.namedSystems[system] = nil - return self end diff --git a/fluid/system.lua b/fluid/system.lua index 0775f88..e9e5b58 100644 --- a/fluid/system.lua +++ b/fluid/system.lua @@ -8,8 +8,9 @@ System.mt = { __index = System, __call = function(systemProto, ...) local system = setmetatable({ - __all = {}, - __pools = {}, + __all = {}, + __pools = {}, + __instance = nil, }, systemProto) for _, filter in pairs(systemProto.__filter) do @@ -39,6 +40,12 @@ end function System:init(...) end +function System:destroy() + if self.instance then + self.instance:removeSystem(self) + end +end + function System:__buildPool(pool) local name = "pool" local filter = {} @@ -54,7 +61,7 @@ function System:__buildPool(pool) return Pool(name, filter) end -function System:__checkEntity(e) +function System:__check(e) local systemHas = self:__has(e) for _, pool in ipairs(self.__pools) do