ECS.lua 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. local ffi = require("ffi")
  2. local class, object = require("class"), require("class.object")
  3. local fficlass = require("class.fficlass")
  4. local LuaComponent = require("ecs.LuaComponent")
  5. require("ecs")
  6. local ECS = class(object)
  7. ECS.N_ENTITIES = 100
  8. function ECS:init()
  9. self.entities = ffi.new("entity_t[?]", ECS.N_ENTITIES)
  10. -- Making sure that everything is set
  11. for i=0,ECS.N_ENTITIES-1 do
  12. self.entities[i] = false
  13. end
  14. self.components = {}
  15. self.components_classes = {}
  16. self.n_components = 0
  17. end
  18. function ECS.debug_register()
  19. debug_overlay:register_menu("ECS", {ECS=require("ecs.debug"):new()})
  20. end
  21. function ECS:create_ffi_component(name, structdef)
  22. if self.components_classes[name] then
  23. debug_overlay.console:error('ECS : '..name.." compoenent is already created.")
  24. return
  25. end
  26. local new_component = fficlass("bool _alive;"..structdef)
  27. self.components_classes[name] = new_component
  28. self.components[name] = new_component:new_array(ECS.N_ENTITIES)
  29. self.n_components = self.n_components + 1
  30. return new_component
  31. end
  32. function ECS:create_lua_component(name, ...)
  33. if self.components_classes[name] then
  34. debug_overlay.console:error('ECS : '..name.." compoenent is already created.")
  35. return
  36. end
  37. local new_component = class(... or LuaComponent)
  38. self.components_classes[name] = new_component
  39. self.components[name] = {}
  40. for i=0,ECS.N_ENTITIES-1 do
  41. self.components[name][i] = self.components_classes[name]:new()
  42. end
  43. self.n_components = self.n_components + 1
  44. return new_component
  45. end
  46. function ECS:get_component(name, id)
  47. return self.components[name][id]
  48. end
  49. return ECS