Add onAddToWorld and onRemoveFromWorld callbacks to systems. Also, adding or removing systems to a world twice raises an error.

This commit is contained in:
bakpakin 2015-09-08 13:36:27 -04:00
parent f3b16a40f6
commit b870b5a34e
2 changed files with 25 additions and 14 deletions

View File

@ -120,6 +120,11 @@ describe('tiny-ecs:', function()
timePassed = 0 timePassed = 0
end) end)
after_each(function()
world:clearSystems()
world:refresh()
end)
it("Create World", function() it("Create World", function()
assert.equals(world:getEntityCount(), 3) assert.equals(world:getEntityCount(), 3)
assert.equals(world:getSystemCount(), 2) assert.equals(world:getSystemCount(), 2)
@ -196,7 +201,7 @@ describe('tiny-ecs:', function()
it("Add Systems Multiple Times", function() it("Add Systems Multiple Times", function()
world:update(1) world:update(1)
world:add(moveSystem, oneTimeSystem) assert.has_error(function() world:add(moveSystem, oneTimeSystem) end, "System already belongs to a World.")
world:update(2) world:update(2)
assert.equals(2, world:getSystemCount()) assert.equals(2, world:getSystemCount())
assert.equals(3, world:getEntityCount()) assert.equals(3, world:getEntityCount())
@ -206,7 +211,7 @@ describe('tiny-ecs:', function()
world:update(1) world:update(1)
world:remove(moveSystem) world:remove(moveSystem)
world:update(2) world:update(2)
world:remove(moveSystem) assert.has_error(function() world:remove(moveSystem) end, "System does not belong to this World.")
world:update(2) world:update(2)
assert.equals(1, world:getSystemCount()) assert.equals(1, world:getSystemCount())
assert.equals(3, world:getEntityCount()) assert.equals(3, world:getEntityCount())

View File

@ -449,7 +449,7 @@ function tiny.remove(world, ...)
if isSystem(obj) then if isSystem(obj) then
tiny_removeSystem(world, obj) tiny_removeSystem(world, obj)
else -- Assume obj is an Entity else -- Assume obj is an Entity
tiny_removeEntity(world, obj) tiny_removeEntity(world, obj)
end end
end end
end end
@ -476,19 +476,21 @@ function tiny_manageSystems(world)
for i = 1, #s2r do for i = 1, #s2r do
local system = s2r[i] local system = s2r[i]
local index = system.index local index = system.index
if system.world == world then local onRemove = system.onRemove
local onRemove = system.onRemove if onRemove then
if onRemove then local entityList = system.entities
local entityList = system.entities for j = 1, #entityList do
for j = 1, #entityList do onRemove(system, entityList[j])
onRemove(system, entityList[j])
end
end
tremove(systems, index)
for j = index, #systems do
systems[j].index = j
end end
end end
tremove(systems, index)
for j = index, #systems do
systems[j].index = j
end
local onRemoveFromWorld = system.onRemoveFromWorld
if onRemoveFromWorld then
onRemoveFromWorld(system, world)
end
s2r[i] = nil s2r[i] = nil
-- Clean up System -- Clean up System
@ -514,6 +516,10 @@ function tiny_manageSystems(world)
local index = #systems + 1 local index = #systems + 1
system.index = index system.index = index
systems[index] = system systems[index] = system
local onAddToWorld = system.onAddToWorld
if onAddToWorld then
onAddToWorld(system, world)
end
-- Try to add Entities -- Try to add Entities
local onAdd = system.onAdd local onAdd = system.onAdd