ECS.lua 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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. assert(not self.components_classes[name])
  23. local new_component = fficlass("bool _alive;"..structdef)
  24. self.components_classes[name] = new_component
  25. self.components[name] = new_component:new_array(ECS.N_ENTITIES)
  26. self.n_components = self.n_components + 1
  27. return new_component
  28. end
  29. function ECS:create_lua_component(name, ...)
  30. assert(not self.components_classes[name])
  31. local new_component = class(... or LuaComponent)
  32. self.components_classes[name] = new_component
  33. self.components[name] = {}
  34. for i=0,ECS.N_ENTITIES-1 do
  35. self.components[name][i] = self.components_classes[name]:new()
  36. end
  37. self.n_components = self.n_components + 1
  38. return new_component
  39. end
  40. function ECS:get_component(name, id)
  41. return self.components[name][id]
  42. end
  43. return ECS