From c750ea119fff3e2ec629aff1fd7cf527c97c0430 Mon Sep 17 00:00:00 2001 From: Justin van der Leij Date: Fri, 16 Feb 2018 15:03:07 +0100 Subject: [PATCH] Made systems classes instead of singletons --- fluid/system.lua | 44 +++++++++++++++++++++++++++++--------------- main.lua | 29 ++++++++++++++++++----------- 2 files changed, 47 insertions(+), 26 deletions(-) diff --git a/fluid/system.lua b/fluid/system.lua index 3e91746..fee95ea 100644 --- a/fluid/system.lua +++ b/fluid/system.lua @@ -4,25 +4,39 @@ local Component = require(PATH..".component") local Pool = require(PATH..".pool") local System = {} -System.__index = System +System.mt = { + __index = System, + __call = function(systemProto, ...) + local system = setmetatable({ + __all = {}, + __pools = {}, + }, systemProto) + + for _, filter in pairs(systemProto.__filter) do + local pool = system:__buildPool(filter) + if not system[pool.name] then + system[pool.name] = pool + system.__pools[#system.__pools + 1] = pool + else + error("Pool with name '"..pool.name.."' already exists.") + end + end + + system:init(...) + return system + end, +} function System.new(...) - local system = setmetatable({ - __all = {}, - __pools = {}, - }, System) + local systemProto = setmetatable({ + __filter = {...}, + }, System.mt) + systemProto.__index = systemProto - for _, filter in pairs({...}) do - local pool = system:__buildPool(filter) - if not system[pool.name] then - system[pool.name] = pool - system.__pools[#system.__pools + 1] = pool - else - error("Pool with name '"..pool.name.."' already exists.") - end - end + return systemProto +end - return system +function System:init(...) end function System:__buildPool(pool) diff --git a/main.lua b/main.lua index b2d0441..23151aa 100644 --- a/main.lua +++ b/main.lua @@ -31,8 +31,9 @@ end) local RectangleRenderer = System({Position, Rectangle}) function RectangleRenderer:draw() + local e for i = 1, self.pool.size do - local e = self.pool:get(i) + e = self.pool:get(i) local position = e:get(Position) local rectangle = e:get(Rectangle) @@ -49,8 +50,9 @@ end local CircleRenderer = System({Position, Circle}) function CircleRenderer:draw() + local e for i = 1, self.pool.size do - local e = self.pool:get(i) + e = self.pool:get(i) local position = e:get(Position) local circle = e:get(Circle) @@ -66,13 +68,16 @@ function CircleRenderer:draw() end local RandomRemover = System({}) -RandomRemover.time = 0 + +function RandomRemover:init() + self.time = 0 +end function RandomRemover:update(dt) - RandomRemover.time = RandomRemover.time + dt + self.time = self.time + dt - if RandomRemover.time >= 0.125 then - RandomRemover.time = 0 + if self.time >= 0.5 then + self.time = 0 if self.pool.size > 0 then local i = love.math.random(1, self.pool.size) @@ -80,13 +85,15 @@ function RandomRemover:update(dt) Game:removeEntity(self.pool.objects[i]) end end + + love.window.setTitle(love.timer.getFPS()) end -Game:addSystem(RandomRemover, "update") -Game:addSystem(RectangleRenderer, "draw") -Game:addSystem(CircleRenderer, "draw") +Game:addSystem(RandomRemover(), "update") +Game:addSystem(RectangleRenderer(), "draw") +Game:addSystem(CircleRenderer(), "draw") -for i = 1, 50 do +for i = 1, 100 do local e = Entity() e:give(Position, love.math.random(0, 700), love.math.random(0, 700)) e:give(Rectangle, love.math.random(5, 20), love.math.random(5, 20)) @@ -98,7 +105,7 @@ for i = 1, 50 do Game:addEntity(e) end -for i = 1, 50 do +for i = 1, 100 do local e = Entity() e:give(Position, love.math.random(0, 700), love.math.random(0, 700)) e:give(Circle, love.math.random(5, 20))