mirror of
https://github.com/Keyslam-Group/Concord.git
synced 2025-09-02 04:13:58 -04:00
A bit more polish
This commit is contained in:
parent
2d21fe97a5
commit
d4297af78e
4 changed files with 43 additions and 35 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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, {
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
10
main.lua
10
main.lua
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue