mirror of
https://github.com/Keyslam-Group/Concord.git
synced 2025-09-02 12:24:11 -04:00
Made systems classes instead of singletons
This commit is contained in:
parent
d4297af78e
commit
c750ea119f
2 changed files with 47 additions and 26 deletions
|
@ -4,15 +4,15 @@ local Component = require(PATH..".component")
|
||||||
local Pool = require(PATH..".pool")
|
local Pool = require(PATH..".pool")
|
||||||
|
|
||||||
local System = {}
|
local System = {}
|
||||||
System.__index = System
|
System.mt = {
|
||||||
|
__index = System,
|
||||||
function System.new(...)
|
__call = function(systemProto, ...)
|
||||||
local system = setmetatable({
|
local system = setmetatable({
|
||||||
__all = {},
|
__all = {},
|
||||||
__pools = {},
|
__pools = {},
|
||||||
}, System)
|
}, systemProto)
|
||||||
|
|
||||||
for _, filter in pairs({...}) do
|
for _, filter in pairs(systemProto.__filter) 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
|
||||||
|
@ -22,7 +22,21 @@ function System.new(...)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
system:init(...)
|
||||||
return system
|
return system
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
|
||||||
|
function System.new(...)
|
||||||
|
local systemProto = setmetatable({
|
||||||
|
__filter = {...},
|
||||||
|
}, System.mt)
|
||||||
|
systemProto.__index = systemProto
|
||||||
|
|
||||||
|
return systemProto
|
||||||
|
end
|
||||||
|
|
||||||
|
function System:init(...)
|
||||||
end
|
end
|
||||||
|
|
||||||
function System:__buildPool(pool)
|
function System:__buildPool(pool)
|
||||||
|
|
29
main.lua
29
main.lua
|
@ -31,8 +31,9 @@ end)
|
||||||
|
|
||||||
local RectangleRenderer = System({Position, Rectangle})
|
local RectangleRenderer = System({Position, Rectangle})
|
||||||
function RectangleRenderer:draw()
|
function RectangleRenderer:draw()
|
||||||
|
local e
|
||||||
for i = 1, self.pool.size do
|
for i = 1, self.pool.size do
|
||||||
local e = self.pool:get(i)
|
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)
|
||||||
|
@ -49,8 +50,9 @@ end
|
||||||
|
|
||||||
local CircleRenderer = System({Position, Circle})
|
local CircleRenderer = System({Position, Circle})
|
||||||
function CircleRenderer:draw()
|
function CircleRenderer:draw()
|
||||||
|
local e
|
||||||
for i = 1, self.pool.size do
|
for i = 1, self.pool.size do
|
||||||
local e = self.pool:get(i)
|
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)
|
||||||
|
@ -66,13 +68,16 @@ function CircleRenderer:draw()
|
||||||
end
|
end
|
||||||
|
|
||||||
local RandomRemover = System({})
|
local RandomRemover = System({})
|
||||||
RandomRemover.time = 0
|
|
||||||
|
function RandomRemover:init()
|
||||||
|
self.time = 0
|
||||||
|
end
|
||||||
|
|
||||||
function RandomRemover:update(dt)
|
function RandomRemover:update(dt)
|
||||||
RandomRemover.time = RandomRemover.time + dt
|
self.time = self.time + dt
|
||||||
|
|
||||||
if RandomRemover.time >= 0.125 then
|
if self.time >= 0.5 then
|
||||||
RandomRemover.time = 0
|
self.time = 0
|
||||||
|
|
||||||
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)
|
||||||
|
@ -80,13 +85,15 @@ function RandomRemover:update(dt)
|
||||||
Game:removeEntity(self.pool.objects[i])
|
Game:removeEntity(self.pool.objects[i])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
love.window.setTitle(love.timer.getFPS())
|
||||||
end
|
end
|
||||||
|
|
||||||
Game:addSystem(RandomRemover, "update")
|
Game:addSystem(RandomRemover(), "update")
|
||||||
Game:addSystem(RectangleRenderer, "draw")
|
Game:addSystem(RectangleRenderer(), "draw")
|
||||||
Game:addSystem(CircleRenderer, "draw")
|
Game:addSystem(CircleRenderer(), "draw")
|
||||||
|
|
||||||
for i = 1, 50 do
|
for i = 1, 100 do
|
||||||
local e = Entity()
|
local e = Entity()
|
||||||
e:give(Position, love.math.random(0, 700), love.math.random(0, 700))
|
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))
|
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)
|
Game:addEntity(e)
|
||||||
end
|
end
|
||||||
|
|
||||||
for i = 1, 50 do
|
for i = 1, 100 do
|
||||||
local e = Entity()
|
local e = Entity()
|
||||||
e:give(Position, love.math.random(0, 700), love.math.random(0, 700))
|
e:give(Position, love.math.random(0, 700), love.math.random(0, 700))
|
||||||
e:give(Circle, love.math.random(5, 20))
|
e:give(Circle, love.math.random(5, 20))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue