-
Notifications
You must be signed in to change notification settings - Fork 0
/
entity.go
60 lines (52 loc) · 1.17 KB
/
entity.go
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
package ecs
import (
"sync"
"sync/atomic"
)
type Entity interface {
GetID() uint64
GetComponents() []Component
AddComponents(c ...Component)
RemoveComponents(c ...Component)
}
type BasicEntity struct {
mux *sync.RWMutex
ID uint64
Components []Component
}
func (be BasicEntity) GetID() uint64 {
be.mux.RLock()
defer be.mux.RUnlock()
return be.ID
}
func (be BasicEntity) GetComponents() []Component {
be.mux.RLock()
defer be.mux.RUnlock()
return be.Components
}
func (be *BasicEntity) AddComponents(cs ...Component) {
be.mux.Lock()
defer be.mux.Unlock()
for _, c := range cs {
be.Components = append(be.Components, c)
}
}
func (be *BasicEntity) RemoveComponents(cs ...Component) {
be.mux.Lock()
defer be.mux.Unlock()
for _, c := range cs {
var delete int = -1
for index, component := range be.Components {
if c == component {
delete = index
break
}
}
if delete >= 0 {
be.Components = append(be.Components[:delete], be.Components[delete+1:]...)
}
}
}
func NewBasicEntity() BasicEntity {
return BasicEntity{ID: atomic.AddUint64(&IDInc, 1), mux: &sync.RWMutex{}}
}