forked from zllangct/ecs
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsystem.go
More file actions
130 lines (102 loc) · 2.21 KB
/
Copy pathsystem.go
File metadata and controls
130 lines (102 loc) · 2.21 KB
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package ecs
import (
"reflect"
"sync"
"unsafe"
)
type SystemLifeCircleType int
const (
SYSTEM_LIFE_CIRCLE_TYPE_NONE SystemLifeCircleType = iota
SYSTEM_LIFE_CIRCLE_TYPE_Default
SYSTEM_LIFE_CIRCLE_TYPE_ONCE
SYSTEM_LIFE_CIRCLE_TYPE_REPEAT
)
type ISystem interface {
//Init()
Type() reflect.Type
Order() Order
World() *World
Requirements() map[reflect.Type]struct{}
Call(label int) interface{}
baseInit(world *World, ins ISystem)
}
type System[T any] struct {
lock sync.Mutex
requirements map[reflect.Type]struct{}
order Order
world *World
realType reflect.Type
isInited bool
}
func (s *System[T]) Ins() *T {
return (*T)(unsafe.Pointer(s))
}
func (s *System[T]) Call(label int) interface{} {
return nil
}
func (s *System[T]) SetRequirements(rqs ...IComponentTemplate) {
//s.lock.Lock()
//defer s.lock.Unlock()
if s.isInited {
return
}
if s.requirements == nil {
s.requirements = map[reflect.Type]struct{}{}
}
for _, value := range rqs {
s.requirements[value.ComponentType()] = struct{}{}
}
}
func (s *System[T]) Requirements() map[reflect.Type]struct{} {
//s.lock.Lock()
//defer s.lock.Unlock()
return s.requirements
}
func (s *System[T]) baseInit(world *World, ins ISystem) {
s.requirements = map[reflect.Type]struct{}{}
s.SetOrder(ORDER_DEFAULT)
s.world = world
if i, ok := ins.(IEventInit); ok {
i.Init()
}
s.isInited = true
}
func (s *System[T]) Type() reflect.Type {
//s.lock.Lock()
//defer s.lock.Unlock()
if s.realType == nil {
s.realType = reflect.TypeOf(*new(T))
}
return s.realType
}
func (s *System[T]) SetOrder(order Order) {
s.lock.Lock()
defer s.lock.Unlock()
if s.isInited {
return
}
s.order = order
}
func (s *System[T]) Order() Order {
//s.lock.Lock()
//defer s.lock.Unlock()
return s.order
}
func (s *System[T]) World() *World {
return s.world
}
func (s *System[T]) GetInterested(typ reflect.Type) interface{}{
if _, ok := s.requirements[typ]; !ok {
return nil
}
return s.World().getComponents(typ)
}
func (s *System[T]) GetInterestedNew() map[reflect.Type][]ComponentOptResult {
ls := map[reflect.Type][]ComponentOptResult{}
for typ, _ := range s.Requirements() {
if n :=s.World().getNewComponents(typ); n != nil {
ls[typ] = n
}
}
return ls
}