A bit more polish

This commit is contained in:
Justin van der Leij 2018-01-30 12:59:56 +01:00
parent 2d21fe97a5
commit d4297af78e
4 changed files with 43 additions and 35 deletions

View file

@ -26,7 +26,7 @@ end
function Instance:checkEntity(e) function Instance:checkEntity(e)
for _, system in ipairs(self.systems) do for _, system in ipairs(self.systems) do
system:checkEntity(e) system:__checkEntity(e)
end end
end end
@ -34,7 +34,7 @@ function Instance:removeEntity(e)
self.entities:remove(e) self.entities:remove(e)
for _, system in ipairs(self.systems) do for _, system in ipairs(self.systems) do
system:remove(e) system:__remove(e)
end end
end end

View file

@ -3,48 +3,52 @@ local mt = {__index = List}
function List.new() function List.new()
return setmetatable({ return setmetatable({
numerical = {}, objects = {},
named = {}, pointers = {},
size = 0, size = 0,
}, mt) }, mt)
end end
function List:clear() function List:clear()
self.numerical = {} self.objects = {}
self.named = {} self.pointers = {}
self.size = 0 self.size = 0
end end
function List:add(obj) function List:add(obj)
local size = self.size + 1 local size = self.size + 1
self.numerical[size] = obj self.objects[size] = obj
self.named[obj] = size self.pointers[obj] = size
self.size = size self.size = size
end end
function List:remove(obj) function List:remove(obj)
local index = self.named[obj] local index = self.pointers[obj]
local size = self.size local size = self.size
if index == size then if index == size then
self.numerical[size] = nil self.objects[size] = nil
else else
local other = self.numerical[size] local other = self.objects[size]
self.numerical[index] = other self.objects[index] = other
self.named[other] = index self.pointers[other] = index
self.numerical[size] = nil self.objects[size] = nil
end end
self.named[obj] = nil self.pointers[obj] = nil
self.size = size - 1 self.size = size - 1
end end
function List:get(index)
return self.objects[index]
end
function List:has(obj) function List:has(obj)
return self.named[obj] and true return self.pointers[obj] and true
end end
return setmetatable(List, { return setmetatable(List, {

View file

@ -13,7 +13,7 @@ function System.new(...)
}, System) }, System)
for _, filter in pairs({...}) do for _, filter in pairs({...}) do
local pool = system:buildPool(filter) local pool = system:__buildPool(filter)
if not system[pool.name] then if not system[pool.name] then
system[pool.name] = pool system[pool.name] = pool
system.__pools[#system.__pools + 1] = pool system.__pools[#system.__pools + 1] = pool
@ -25,7 +25,7 @@ function System.new(...)
return system return system
end end
function System:buildPool(pool) function System:__buildPool(pool)
local name = "pool" local name = "pool"
local filter = {} local filter = {}
@ -40,8 +40,8 @@ function System:buildPool(pool)
return Pool(name, filter) return Pool(name, filter)
end end
function System:checkEntity(e) function System:__checkEntity(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
local poolHas = pool:has(e) local poolHas = pool:has(e)
@ -50,21 +50,21 @@ function System:checkEntity(e)
if not poolHas and eligible then if not poolHas and eligible then
pool:add(e) pool:add(e)
self:entityAddedTo(e, pool) self:entityAddedTo(e, pool)
self:tryAdd(e) self:__tryAdd(e)
return true return true
elseif poolHas and not eligible then elseif poolHas and not eligible then
pool:remove(e) pool:remove(e)
self:entityRemovedFrom(e, pool) self:entityRemovedFrom(e, pool)
self:tryRemove(e) self:__tryRemove(e)
return false return false
end end
end end
end end
function System:tryAdd(e) function System:__tryAdd(e)
if not self:has(e) then if not self:__has(e) then
self.__all[e] = 0 self.__all[e] = 0
self:entityAdded(e) self:entityAdded(e)
end end
@ -72,8 +72,8 @@ function System:tryAdd(e)
self.__all[e] = self.__all[e] + 1 self.__all[e] = self.__all[e] + 1
end end
function System:tryRemove() function System:__tryRemove()
if self:has(e) then if self:__has(e) then
self.__all[e] = self.__all[e] - 1 self.__all[e] = self.__all[e] - 1
if self.__all[e] == 0 then if self.__all[e] == 0 then
@ -83,8 +83,8 @@ function System:tryRemove()
end end
end end
function System:remove(e) function System:__remove(e)
if self:has(e) then if self:__has(e) then
for _, pool in ipairs(self.__pools) do for _, pool in ipairs(self.__pools) do
if pool:has(e) then if pool:has(e) then
pool:remove(e) pool:remove(e)
@ -97,7 +97,7 @@ function System:remove(e)
end end
end end
function System:has(e) function System:__has(e)
return self.__all[e] and true return self.__all[e] and true
end end

View file

@ -31,7 +31,9 @@ end)
local RectangleRenderer = System({Position, Rectangle}) local RectangleRenderer = System({Position, Rectangle})
function RectangleRenderer:draw() function RectangleRenderer:draw()
for _, e in ipairs(self.pool.numerical) do for i = 1, self.pool.size do
local e = self.pool:get(i)
local position = e:get(Position) local position = e:get(Position)
local rectangle = e:get(Rectangle) local rectangle = e:get(Rectangle)
local color = e:get(Color) local color = e:get(Color)
@ -47,7 +49,9 @@ end
local CircleRenderer = System({Position, Circle}) local CircleRenderer = System({Position, Circle})
function CircleRenderer:draw() function CircleRenderer:draw()
for _, e in ipairs(self.pool.numerical) do for i = 1, self.pool.size do
local e = self.pool:get(i)
local position = e:get(Position) local position = e:get(Position)
local circle = e:get(Circle) local circle = e:get(Circle)
local color = e:get(Color) local color = e:get(Color)
@ -73,7 +77,7 @@ function RandomRemover:update(dt)
if self.pool.size > 0 then if self.pool.size > 0 then
local i = love.math.random(1, self.pool.size) local i = love.math.random(1, self.pool.size)
Game:removeEntity(self.pool.numerical[i]) Game:removeEntity(self.pool.objects[i])
end end
end end
end end