Advertisement
Guest User

ecs on lua

a guest
Nov 9th, 2016
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.89 KB | None | 0 0
  1. --- Just a template for component
  2. function Component_Empty()
  3.     local self = {
  4.         name = "put_unique_name"
  5.         -- properties ...
  6.         }
  7.     return self
  8. end
  9.  
  10. function Component_Position(_x, _y)
  11.     local self = { 
  12.         name = "position",
  13.         x = _x or 0,
  14.         y = _y or 0 }
  15.     return self
  16. end
  17.  
  18. function Component_Velocity(_vx, _vy)
  19.     local s = {
  20.         name = "velocity",
  21.         vx = _vx or 0,
  22.         vy = _vy or 0 }
  23.     return s
  24. end
  25.  
  26. -- Systems --
  27.  
  28. Systems = {}
  29.  
  30. function Systems.Base()
  31.     local self = {}
  32.     self.name = "base"
  33.     local entities = {}
  34.    
  35.     function self.subscribe(entity)
  36.         table.insert(entities, entity)
  37.     end
  38.    
  39.     function self.get_entities()
  40.         return entities
  41.     end
  42.    
  43.     return self
  44. end
  45.  
  46. function Systems.Moving()
  47.     local self = Systems.Base()
  48.     self.name = "moving"
  49.    
  50.     function self.update(dt)
  51.         local entities = self.get_entities()
  52.         for i, e in pairs(entities) do
  53.             local p = e.position
  54.             local v = e.velocity
  55.             p.x = p.x + v.vx * dt
  56.             p.y = p.y + v.vy * dt
  57.         end
  58.     end
  59.    
  60.     return self
  61. end
  62.  
  63. function Systems.Handling()
  64.     local self = Systems.Base()
  65.     self.name = "handling"
  66.    
  67.     function self.update(dt)
  68.         local entities = self.get_entities()
  69.         for i, e in pairs(entities) do
  70.             local v = e.velocity
  71.             v.vx, v.vy = 0, 0
  72.             if      love.keyboard.isDown("up")      then v.vy = -100
  73.             elseif  love.keyboard.isDown("down")    then v.vy = 100
  74.             end
  75.             if      love.keyboard.isDown("right")   then v.vx = 100
  76.             elseif  love.keyboard.isDown("left")    then v.vx = -100
  77.             end
  78.         end
  79.     end
  80.    
  81.     return self
  82. end
  83.  
  84. function Systems.Drawing()
  85.     local self = Systems.Base()
  86.     self.name = "drawing"
  87.    
  88.     function self.draw()
  89.         local entities = self.get_entities()
  90.         for i, e in pairs(entities) do
  91.             local p = e.position
  92.             love.graphics.circle("fill", p.x, p.y, 10)
  93.         end
  94.     end
  95.    
  96.     return self
  97. end
  98.  
  99. function SystemManager()
  100.     local self = {}
  101.     local systems = {}
  102.    
  103.     -- registering systems
  104.     for i, s in pairs(Systems) do
  105.         local sys = s()
  106.         systems[sys.name] = sys
  107.     end
  108.    
  109.     function self.update(dt)
  110.         for k, system in pairs(systems) do
  111.             local upd = system.update
  112.             if upd then upd(dt) end
  113.         end
  114.     end
  115.    
  116.     function self.draw()
  117.         for k, system in pairs(systems) do
  118.             local drw = system.draw
  119.             if drw then drw(dt) end
  120.         end
  121.     end
  122.  
  123.     function self.subscribe(entity, system)
  124.         local sys = systems[system]
  125.         sys.subscribe(entity)
  126.     end
  127.    
  128.     return self
  129. end
  130.  
  131. -- Entity class --
  132.  
  133. Entity = {}
  134. function Entity.new()
  135.     local self = {}
  136.     local updates = {}
  137.     local draws = {}
  138.    
  139.     function self.add(component)
  140.         self[component.name] = component
  141.     end
  142.    
  143.     function self.subscribe(system)
  144.         if system.update then table.insert(updates, system.update)
  145.         elseif system.draw then table.insert(draws, system.draw)
  146.         end
  147.     end
  148.    
  149.     function self.update(dt)
  150.         for k, update in pairs(updates) do
  151.             update(self, dt)
  152.         end
  153.     end
  154.    
  155.     function self.draw()
  156.         for k, draw in pairs(draws) do
  157.             draw(self)
  158.         end
  159.     end
  160.    
  161.     return self
  162. end
  163.  
  164. --- Assembling custom entity
  165. function create_player(x, y, vx, vy)
  166.     entity = Entity.new()
  167.     entity.add(Component_Position(x, y))
  168.     entity.add(Component_Velocity(vx, vy))
  169.     ecs.subscribe(entity, "moving")
  170.     ecs.subscribe(entity, "handling")
  171.     ecs.subscribe(entity, "drawing")
  172.     return entity
  173. end
  174.  
  175. function create_moving_dot(x, y, vx, vy)
  176.     entity = Entity.new()
  177.     entity.add(Component_Position(x, y))
  178.     entity.add(Component_Velocity(vx, vy))
  179.     ecs.subscribe(entity, "moving")
  180.     ecs.subscribe(entity, "drawing")
  181.     return entity
  182. end
  183.  
  184. function create_static_dot(x, y)
  185.     entity = Entity.new()
  186.     entity.add(Component_Position(x, y))
  187.     ecs.subscribe(entity, "drawing")
  188.     return entity
  189. end
  190.  
  191. -- Main --
  192. -- testing ECS framework
  193.  
  194. function love.load()
  195.     ecs = SystemManager()
  196.     e1 = create_player(400, 300)
  197.     create_player(100, 100)
  198.     create_moving_dot(200, 100, 50, 0)
  199.     create_static_dot(500, 400)
  200. end
  201.  
  202. function love.update(dt)
  203.     ecs.update(dt)
  204. end
  205.  
  206. function love.draw()
  207.     ecs.draw()
  208. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement