Parcourir la Source

- Created a LuaComponent to have specific Lua-only elements (such as love2d objects)
- ECS : renamed create_components to create_ffi_component and added create_lua_component

Eiyeron Fulmincendii il y a 8 ans
Parent
commit
3103143247
3 fichiers modifiés avec 32 ajouts et 5 suppressions
  1. 14 1
      ecs/ECS.lua
  2. 8 0
      ecs/LuaComponent.lua
  3. 10 4
      main.lua

+ 14 - 1
ecs/ECS.lua

@@ -1,6 +1,7 @@
 local ffi = require("ffi")
 local class, object =  require("class"), require("class.object")
 local fficlass =  require("class.fficlass")
+local LuaComponent = require("ecs.LuaComponent")
 require("ecs")
 
 local ECS = class(object)
@@ -18,7 +19,7 @@ function ECS:init()
     self.n_components = 0
 end
 
-function ECS:create_component(name, structdef)
+function ECS:create_ffi_component(name, structdef)
     assert(not self.components_classes[name])
     local new_component = fficlass("bool _alive;"..structdef)
     self.components_classes[name] = new_component
@@ -27,6 +28,18 @@ function ECS:create_component(name, structdef)
     return new_component
 end
 
+function ECS:create_lua_component(name, ...)
+    assert(not self.components_classes[name])
+    local new_component = class(... or LuaComponent)
+    self.components_classes[name] = new_component
+    self.components[name] = {}
+    for i=0,ECS.N_ENTITIES-1 do
+        self.components[name][i] = self.components_classes[name]:new()
+    end
+    self.n_components = self.n_components + 1
+    return new_component
+end
+
 function ECS:get_component(name, id)
     return self.components[name][id]
 end

+ 8 - 0
ecs/LuaComponent.lua

@@ -0,0 +1,8 @@
+local class, object = require("class"), require("class.object")
+
+local LuaComponent = class(object)
+function LuaComponent:init()
+    self._alive = false
+end
+
+return LuaComponent

+ 10 - 4
main.lua

@@ -6,11 +6,20 @@ local inspect = require 'inspect'
 debug_overlay = Debug:new()
 local ecs = ECS:new()
 local a = {b = 42}
-local Position = ecs:create_component("Position", [[
+local Position = ecs:create_ffi_component("Position", [[
     int32_t x;
     int32_t y;
 ]])
+
+local LuaTest = ecs:create_lua_component("LuaTest")
+function LuaTest:init()
+    print(self._alive)
+end
+
+
 local p = ecs:get_component("Position", 42)
+local lt = ecs:get_component("LuaTest", 5)
+
 
 _G.debug_overlay = debug_overlay
 _G.ecs = ecs
@@ -20,9 +29,6 @@ _G.ecs = ecs
 --
 function love.load(arg)
     debug_overlay.console:debug("Have fun!")
-    p = Position:new()
-    p.x = 2
-    p.y = 5
     debug_overlay.watch:add(p, "x")
     debug_overlay.watch:add(p, "y")
 end