Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --- Just a template for component
- function Component_Empty()
- local self = {
- name = "put_unique_name"
- -- properties ...
- }
- return self
- end
- function Component_Position(_x, _y)
- local self = {
- name = "position",
- x = _x or 0,
- y = _y or 0 }
- return self
- end
- function Component_Velocity(_vx, _vy)
- local s = {
- name = "velocity",
- vx = _vx or 0,
- vy = _vy or 0 }
- return s
- end
- -- Systems --
- Systems = {}
- function Systems.Base()
- local self = {}
- self.name = "base"
- local entities = {}
- function self.subscribe(entity)
- table.insert(entities, entity)
- end
- function self.get_entities()
- return entities
- end
- return self
- end
- function Systems.Moving()
- local self = Systems.Base()
- self.name = "moving"
- function self.update(dt)
- local entities = self.get_entities()
- for i, e in pairs(entities) do
- local p = e.position
- local v = e.velocity
- p.x = p.x + v.vx * dt
- p.y = p.y + v.vy * dt
- end
- end
- return self
- end
- function Systems.Handling()
- local self = Systems.Base()
- self.name = "handling"
- function self.update(dt)
- local entities = self.get_entities()
- for i, e in pairs(entities) do
- local v = e.velocity
- v.vx, v.vy = 0, 0
- if love.keyboard.isDown("up") then v.vy = -100
- elseif love.keyboard.isDown("down") then v.vy = 100
- end
- if love.keyboard.isDown("right") then v.vx = 100
- elseif love.keyboard.isDown("left") then v.vx = -100
- end
- end
- end
- return self
- end
- function Systems.Drawing()
- local self = Systems.Base()
- self.name = "drawing"
- function self.draw()
- local entities = self.get_entities()
- for i, e in pairs(entities) do
- local p = e.position
- love.graphics.circle("fill", p.x, p.y, 10)
- end
- end
- return self
- end
- function SystemManager()
- local self = {}
- local systems = {}
- -- registering systems
- for i, s in pairs(Systems) do
- local sys = s()
- systems[sys.name] = sys
- end
- function self.update(dt)
- for k, system in pairs(systems) do
- local upd = system.update
- if upd then upd(dt) end
- end
- end
- function self.draw()
- for k, system in pairs(systems) do
- local drw = system.draw
- if drw then drw(dt) end
- end
- end
- function self.subscribe(entity, system)
- local sys = systems[system]
- sys.subscribe(entity)
- end
- return self
- end
- -- Entity class --
- Entity = {}
- function Entity.new()
- local self = {}
- local updates = {}
- local draws = {}
- function self.add(component)
- self[component.name] = component
- end
- function self.subscribe(system)
- if system.update then table.insert(updates, system.update)
- elseif system.draw then table.insert(draws, system.draw)
- end
- end
- function self.update(dt)
- for k, update in pairs(updates) do
- update(self, dt)
- end
- end
- function self.draw()
- for k, draw in pairs(draws) do
- draw(self)
- end
- end
- return self
- end
- --- Assembling custom entity
- function create_player(x, y, vx, vy)
- entity = Entity.new()
- entity.add(Component_Position(x, y))
- entity.add(Component_Velocity(vx, vy))
- ecs.subscribe(entity, "moving")
- ecs.subscribe(entity, "handling")
- ecs.subscribe(entity, "drawing")
- return entity
- end
- function create_moving_dot(x, y, vx, vy)
- entity = Entity.new()
- entity.add(Component_Position(x, y))
- entity.add(Component_Velocity(vx, vy))
- ecs.subscribe(entity, "moving")
- ecs.subscribe(entity, "drawing")
- return entity
- end
- function create_static_dot(x, y)
- entity = Entity.new()
- entity.add(Component_Position(x, y))
- ecs.subscribe(entity, "drawing")
- return entity
- end
- -- Main --
- -- testing ECS framework
- function love.load()
- ecs = SystemManager()
- e1 = create_player(400, 300)
- create_player(100, 100)
- create_moving_dot(200, 100, 50, 0)
- create_static_dot(500, 400)
- end
- function love.update(dt)
- ecs.update(dt)
- end
- function love.draw()
- ecs.draw()
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement