From d4297af78e2a8d8bfa89e922b8b124eccee843fc Mon Sep 17 00:00:00 2001 From: Justin van der Leij Date: Tue, 30 Jan 2018 12:59:56 +0100 Subject: [PATCH] A bit more polish --- fluid/instance.lua | 4 ++-- fluid/list.lua | 38 +++++++++++++++++++++----------------- fluid/system.lua | 26 +++++++++++++------------- main.lua | 10 +++++++--- 4 files changed, 43 insertions(+), 35 deletions(-) diff --git a/fluid/instance.lua b/fluid/instance.lua index f90ef49..dd6f42e 100644 --- a/fluid/instance.lua +++ b/fluid/instance.lua @@ -26,7 +26,7 @@ end function Instance:checkEntity(e) for _, system in ipairs(self.systems) do - system:checkEntity(e) + system:__checkEntity(e) end end @@ -34,7 +34,7 @@ function Instance:removeEntity(e) self.entities:remove(e) for _, system in ipairs(self.systems) do - system:remove(e) + system:__remove(e) end end diff --git a/fluid/list.lua b/fluid/list.lua index af67bf5..72fa68e 100644 --- a/fluid/list.lua +++ b/fluid/list.lua @@ -3,48 +3,52 @@ local mt = {__index = List} function List.new() return setmetatable({ - numerical = {}, - named = {}, - size = 0, + objects = {}, + pointers = {}, + size = 0, }, mt) end function List:clear() - self.numerical = {} - self.named = {} - self.size = 0 + self.objects = {} + self.pointers = {} + self.size = 0 end function List:add(obj) local size = self.size + 1 - self.numerical[size] = obj - self.named[obj] = size - self.size = size + self.objects[size] = obj + self.pointers[obj] = size + self.size = size end function List:remove(obj) - local index = self.named[obj] + local index = self.pointers[obj] local size = self.size if index == size then - self.numerical[size] = nil + self.objects[size] = nil else - local other = self.numerical[size] + local other = self.objects[size] - self.numerical[index] = other - self.named[other] = index + self.objects[index] = other + self.pointers[other] = index - self.numerical[size] = nil + self.objects[size] = nil end - self.named[obj] = nil + self.pointers[obj] = nil self.size = size - 1 end +function List:get(index) + return self.objects[index] +end + function List:has(obj) - return self.named[obj] and true + return self.pointers[obj] and true end return setmetatable(List, { diff --git a/fluid/system.lua b/fluid/system.lua index eb0d775..3e91746 100644 --- a/fluid/system.lua +++ b/fluid/system.lua @@ -13,7 +13,7 @@ function System.new(...) }, System) for _, filter in pairs({...}) do - local pool = system:buildPool(filter) + local pool = system:__buildPool(filter) if not system[pool.name] then system[pool.name] = pool system.__pools[#system.__pools + 1] = pool @@ -25,7 +25,7 @@ function System.new(...) return system end -function System:buildPool(pool) +function System:__buildPool(pool) local name = "pool" local filter = {} @@ -40,8 +40,8 @@ function System:buildPool(pool) return Pool(name, filter) end -function System:checkEntity(e) - local systemHas = self:has(e) +function System:__checkEntity(e) + local systemHas = self:__has(e) for _, pool in ipairs(self.__pools) do local poolHas = pool:has(e) @@ -50,21 +50,21 @@ function System:checkEntity(e) if not poolHas and eligible then pool:add(e) self:entityAddedTo(e, pool) - self:tryAdd(e) + self:__tryAdd(e) return true elseif poolHas and not eligible then pool:remove(e) self:entityRemovedFrom(e, pool) - self:tryRemove(e) + self:__tryRemove(e) return false end end end -function System:tryAdd(e) - if not self:has(e) then +function System:__tryAdd(e) + if not self:__has(e) then self.__all[e] = 0 self:entityAdded(e) end @@ -72,8 +72,8 @@ function System:tryAdd(e) self.__all[e] = self.__all[e] + 1 end -function System:tryRemove() - if self:has(e) then +function System:__tryRemove() + if self:__has(e) then self.__all[e] = self.__all[e] - 1 if self.__all[e] == 0 then @@ -83,8 +83,8 @@ function System:tryRemove() end end -function System:remove(e) - if self:has(e) then +function System:__remove(e) + if self:__has(e) then for _, pool in ipairs(self.__pools) do if pool:has(e) then pool:remove(e) @@ -97,7 +97,7 @@ function System:remove(e) end end -function System:has(e) +function System:__has(e) return self.__all[e] and true end diff --git a/main.lua b/main.lua index 3a680bf..b2d0441 100644 --- a/main.lua +++ b/main.lua @@ -31,7 +31,9 @@ end) local RectangleRenderer = System({Position, Rectangle}) 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 rectangle = e:get(Rectangle) local color = e:get(Color) @@ -47,7 +49,9 @@ end local CircleRenderer = System({Position, Circle}) 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 circle = e:get(Circle) local color = e:get(Color) @@ -73,7 +77,7 @@ function RandomRemover:update(dt) if self.pool.size > 0 then local i = love.math.random(1, self.pool.size) - Game:removeEntity(self.pool.numerical[i]) + Game:removeEntity(self.pool.objects[i]) end end end