-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathentity.lua
87 lines (69 loc) · 1.59 KB
/
entity.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
local Component = require("lecs.component")
---@class Entity
---@field public id number
---@field private _world World
---@field private _singletonName boolean
---@field private _comps table<string, number>
local Entity = class("Entity")
function Entity:ctor()
self.id = 0
self._world = nil
self._singletonName = nil
self._comps = {}
end
---@public
---@param comp Component
function Entity:AddComponent(comp)
assert(comp:isInstComponent(), comp)
self[comp.__cname] = comp
self._comps[comp.__cname] = 1
self._world:AddEntity(self)
end
---@public
---@param name component name
function Entity:GetComponent(name)
return self[name]
end
---@public
---@param comp Component
function Entity:RemoveComponent(comp)
self[comp.__cname] = nil
self._comps[comp.__cname] = nil
self._world:AddEntity(self)
end
---@public
---@return boolean
function Entity:IsSingleton()
return self._singletonName ~= nil
end
---@public
---@return World
function Entity:GetWorld()
return self._world
end
--region Private
---@private
---@param world World
---@param id number
---@param singletonName string
function Entity:awakeFromPool(world, id, singletonName)
self.id = id
self._world = world
self._singletonName = singletonName
if self._singletonName then
self._world:AddSingletonEntity(self)
end
end
---@private
function Entity:recycleToPool()
---clear all components
for k, _ in pairs(self._comps) do
self[k] = nil
end
self._world = nil
self._comps = {}
self._singletonName = nil
self.id = 0
end
--endregion
return Entity