mirror of
https://github.com/Keyslam-Group/Concord.git
synced 2025-09-02 12:24:11 -04:00
Some more work on system-instance interaction
This commit is contained in:
parent
0d5f05fa64
commit
fa22f6f6f6
3 changed files with 25 additions and 23 deletions
|
@ -45,7 +45,9 @@ function EventManager:deregister(name, listener, callback)
|
||||||
table.remove(listeners, index)
|
table.remove(listeners, index)
|
||||||
listeners.count = listeners.count - 1
|
listeners.count = listeners.count - 1
|
||||||
|
|
||||||
return
|
if callback then
|
||||||
|
break
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,10 +9,9 @@ Instance.__index = Instance
|
||||||
function Instance.new()
|
function Instance.new()
|
||||||
local instance = setmetatable({
|
local instance = setmetatable({
|
||||||
entities = List(),
|
entities = List(),
|
||||||
|
systems = List(),
|
||||||
|
systemCount = {},
|
||||||
eventManager = EventManager(),
|
eventManager = EventManager(),
|
||||||
|
|
||||||
systems = {},
|
|
||||||
namedSystems = {},
|
|
||||||
}, Instance)
|
}, Instance)
|
||||||
|
|
||||||
return instance
|
return instance
|
||||||
|
@ -25,8 +24,8 @@ function Instance:addEntity(e)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Instance:checkEntity(e)
|
function Instance:checkEntity(e)
|
||||||
for _, system in ipairs(self.systems) do
|
for i = 1, self.systems.size do
|
||||||
system:__checkEntity(e)
|
self.systems:get(i):__check(e)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -34,16 +33,14 @@ function Instance:removeEntity(e)
|
||||||
e.instances:remove(self)
|
e.instances:remove(self)
|
||||||
self.entities:remove(e)
|
self.entities:remove(e)
|
||||||
|
|
||||||
for _, system in ipairs(self.systems) do
|
for i = 1, self.systems.size do
|
||||||
system:__remove(e)
|
self.systems:get(i):__remove(e)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function Instance:addSystem(system, eventName, callback)
|
function Instance:addSystem(system, eventName, callback)
|
||||||
if not self.namedSystems[system] then
|
self.systemCount[system] = (self.systemCount[system] or 0) + 1
|
||||||
self.systems[#self.systems + 1] = system
|
self.systems:add(system)
|
||||||
self.namedSystems[system] = system
|
|
||||||
end
|
|
||||||
|
|
||||||
self.eventManager:register(eventName, system, callback)
|
self.eventManager:register(eventName, system, callback)
|
||||||
|
|
||||||
|
@ -51,16 +48,12 @@ function Instance:addSystem(system, eventName, callback)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Instance:removeSystem(system, callback)
|
function Instance:removeSystem(system, callback)
|
||||||
for index, other in ipairs(self.systems) do
|
self.systemCount[system] = self.systemCount[system] - 1
|
||||||
if system == other then
|
if self.systemCount[system] == 0 then
|
||||||
table.remove(self.systems, index)
|
self.systemCount[system] = nil
|
||||||
end
|
self.eventManager:deregister(eventName, system, callback)
|
||||||
end
|
end
|
||||||
|
|
||||||
self.eventManager:deregister(eventName, system, callback)
|
|
||||||
|
|
||||||
self.namedSystems[system] = nil
|
|
||||||
|
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -8,8 +8,9 @@ System.mt = {
|
||||||
__index = System,
|
__index = System,
|
||||||
__call = function(systemProto, ...)
|
__call = function(systemProto, ...)
|
||||||
local system = setmetatable({
|
local system = setmetatable({
|
||||||
__all = {},
|
__all = {},
|
||||||
__pools = {},
|
__pools = {},
|
||||||
|
__instance = nil,
|
||||||
}, systemProto)
|
}, systemProto)
|
||||||
|
|
||||||
for _, filter in pairs(systemProto.__filter) do
|
for _, filter in pairs(systemProto.__filter) do
|
||||||
|
@ -39,6 +40,12 @@ end
|
||||||
function System:init(...)
|
function System:init(...)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function System:destroy()
|
||||||
|
if self.instance then
|
||||||
|
self.instance:removeSystem(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function System:__buildPool(pool)
|
function System:__buildPool(pool)
|
||||||
local name = "pool"
|
local name = "pool"
|
||||||
local filter = {}
|
local filter = {}
|
||||||
|
@ -54,7 +61,7 @@ function System:__buildPool(pool)
|
||||||
return Pool(name, filter)
|
return Pool(name, filter)
|
||||||
end
|
end
|
||||||
|
|
||||||
function System:__checkEntity(e)
|
function System:__check(e)
|
||||||
local systemHas = self:__has(e)
|
local systemHas = self:__has(e)
|
||||||
|
|
||||||
for _, pool in ipairs(self.__pools) do
|
for _, pool in ipairs(self.__pools) do
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue