ECS.lua 1.4 KB

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