Some more work on system-instance interaction

This commit is contained in:
Justin van der Leij 2018-02-21 13:38:27 +01:00
parent 0d5f05fa64
commit fa22f6f6f6
3 changed files with 25 additions and 23 deletions

View file

@ -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

View file

@ -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,15 +48,11 @@ 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
end
self.systemCount[system] = self.systemCount[system] - 1
if self.systemCount[system] == 0 then
self.systemCount[system] = nil
self.eventManager:deregister(eventName, system, callback)
self.namedSystems[system] = nil
end
return self
end

View file

@ -10,6 +10,7 @@ System.mt = {
local system = setmetatable({
__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