@cjhd/cj-ecs 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/assets/common/component/MoveComponent.d.ts +141 -0
  2. package/assets/common/component/NodeComponent.d.ts +98 -0
  3. package/assets/common/system/MoveSystem.d.ts +17 -0
  4. package/assets/ecs/EcsComponent.d.ts +89 -0
  5. package/assets/ecs/{EcsDirty.ts → EcsDirty.d.ts} +340 -459
  6. package/assets/ecs/EcsEntity.d.ts +148 -0
  7. package/assets/ecs/EcsSingleton.d.ts +3 -0
  8. package/assets/ecs/EcsSystem.d.ts +96 -0
  9. package/assets/ecs.d.ts +126 -0
  10. package/assets/lib/EcsCache.d.ts +24 -0
  11. package/assets/lib/EcsFilter.d.ts +57 -0
  12. package/assets/lib/EcsManager.d.ts +251 -0
  13. package/assets/lib/{EcsObject.ts → EcsObject.d.ts} +360 -422
  14. package/assets/lib/EcsTimer.d.ts +119 -0
  15. package/assets/lib/EcsTween.d.ts +168 -0
  16. package/assets/lib/EcsUtils.d.ts +82 -0
  17. package/dist/cocos/assets/common/component/MoveComponent.js +4 -0
  18. package/dist/cocos/assets/common/component/NodeComponent.js +4 -0
  19. package/dist/cocos/assets/common/system/MoveSystem.js +2 -0
  20. package/dist/cocos/assets/ecs/EcsComponent.js +4 -0
  21. package/dist/cocos/assets/ecs/EcsDirty.js +4 -0
  22. package/dist/cocos/assets/ecs/EcsEntity.js +4 -0
  23. package/dist/cocos/assets/ecs/EcsSingleton.js +4 -0
  24. package/dist/cocos/assets/ecs/EcsSystem.js +2 -0
  25. package/dist/cocos/assets/ecs.js +2 -0
  26. package/dist/cocos/assets/lib/EcsCache.js +2 -0
  27. package/dist/cocos/assets/lib/EcsFilter.js +2 -0
  28. package/dist/cocos/assets/lib/EcsManager.js +4 -0
  29. package/dist/cocos/assets/lib/EcsObject.js +4 -0
  30. package/dist/cocos/assets/lib/EcsTimer.js +4 -0
  31. package/dist/cocos/assets/lib/EcsTween.js +4 -0
  32. package/dist/cocos/assets/lib/EcsUtils.js +2 -0
  33. package/dist/cocos/index.js +4 -0
  34. package/{index.ts → index.d.ts} +14 -33
  35. package/package.json +27 -7
  36. package/assets/common/component/MoveComponent.ts +0 -292
  37. package/assets/common/component/MoveComponent.ts.meta +0 -9
  38. package/assets/common/component/NodeComponent.ts +0 -315
  39. package/assets/common/component/NodeComponent.ts.meta +0 -9
  40. package/assets/common/component.meta +0 -12
  41. package/assets/common/system/MoveSystem.ts +0 -108
  42. package/assets/common/system/MoveSystem.ts.meta +0 -9
  43. package/assets/common/system.meta +0 -12
  44. package/assets/common.meta +0 -12
  45. package/assets/ecs/EcsComponent.ts +0 -244
  46. package/assets/ecs/EcsComponent.ts.meta +0 -9
  47. package/assets/ecs/EcsDirty.ts.meta +0 -9
  48. package/assets/ecs/EcsEntity.ts +0 -430
  49. package/assets/ecs/EcsEntity.ts.meta +0 -9
  50. package/assets/ecs/EcsSingleton.ts +0 -6
  51. package/assets/ecs/EcsSingleton.ts.meta +0 -9
  52. package/assets/ecs/EcsSystem.ts +0 -191
  53. package/assets/ecs/EcsSystem.ts.meta +0 -9
  54. package/assets/ecs.meta +0 -12
  55. package/assets/ecs.ts +0 -339
  56. package/assets/ecs.ts.meta +0 -9
  57. package/assets/lib/EcsCache.ts +0 -43
  58. package/assets/lib/EcsCache.ts.meta +0 -9
  59. package/assets/lib/EcsFilter.ts +0 -210
  60. package/assets/lib/EcsFilter.ts.meta +0 -9
  61. package/assets/lib/EcsManager.ts +0 -502
  62. package/assets/lib/EcsManager.ts.meta +0 -9
  63. package/assets/lib/EcsObject.ts.meta +0 -9
  64. package/assets/lib/EcsTimer.ts +0 -239
  65. package/assets/lib/EcsTimer.ts.meta +0 -9
  66. package/assets/lib/EcsTween.ts +0 -486
  67. package/assets/lib/EcsTween.ts.meta +0 -9
  68. package/assets/lib/EcsUtils.ts +0 -352
  69. package/assets/lib/EcsUtils.ts.meta +0 -9
  70. package/assets/lib.meta +0 -12
  71. package/assets.meta +0 -9
  72. package/index.ts.meta +0 -9
  73. package/package.json.meta +0 -11
  74. /package/{.cj-ecs.md → README.md} +0 -0
@@ -1,502 +0,0 @@
1
- import { DEV } from 'cc/env';
2
- import { EcsBase, EcsBaseComponent, EcsBaseSingleton, IComponent, IComponentName, IEntity, IEntityUUID, IFlag, ISystem, ITypeofSystem } from './EcsObject';
3
- import { CustomArray } from './EcsUtils';
4
-
5
- /**
6
- * 根据名获取类,用于通过组件名字获取组件类
7
- */
8
- export function getClassByName(name: IComponentName) {
9
- return classManager.getClassByName(name);
10
- }
11
-
12
- /**
13
- * 类装饰器(组件与单例组件必须使用ecsclass)
14
- */
15
- export function ecsclass(className: string) {
16
- return function fNOP(ctor: any) {
17
- // ecsName需要先初始化
18
- (<typeof EcsBase>ctor).ecsName = className;
19
- classManager.add(ctor, className);
20
- return ctor;
21
- };
22
- }
23
-
24
- /**
25
- * flag位管理器
26
- */
27
- class FlagManager {
28
- private index: number = 0;
29
- private cache: Map<string, IFlag> = new Map();
30
- private cacheAll: Map<string, IFlag> = new Map();
31
-
32
- /**
33
- * 在source中添加flag
34
- * @param source
35
- * @param flag
36
- */
37
- addFlag(source: IFlag, flag: IFlag) {
38
- for (let index = 0; index < flag.length; index++) {
39
- source[index] |= flag[index];
40
- }
41
- }
42
- /**
43
- * 在source中移除flag
44
- * @param source
45
- * @param flag
46
- */
47
- removeFlag(source: IFlag, flag: IFlag) {
48
- for (let index = 0; index < flag.length; index++) {
49
- source[index] &= ~flag[index];
50
- }
51
- }
52
-
53
- /**
54
- * 检查是否完全包含
55
- * @param source 源
56
- * @param sub 子集
57
- * @returns 是否完全包含子集
58
- */
59
- checkFlagAll(source: IFlag, sub: IFlag) {
60
- for (let index = 0; index < sub.length; index++) {
61
- if ((source[index] & sub[index]) !== sub[index]) return false;
62
- }
63
- return true;
64
- }
65
- /**
66
- * 只包含其中一个即可
67
- * @param source 源
68
- * @param sub 子集
69
- * @returns 是否包含其中一个
70
- */
71
- checkFlagAny(source: IFlag, sub: IFlag) {
72
- for (let index = 0; index < sub.length; index++) {
73
- if ((source[index] & sub[index]) != 0) return true;
74
- }
75
- return false;
76
- }
77
-
78
- /**
79
- * 会融合父类的flag位
80
- * @param name 组件类型名
81
- * @returns 组件类型的flag位数组
82
- */
83
- getAllByName(name: string): IFlag {
84
- const result = this.cacheAll.get(name);
85
- if (result) return result;
86
-
87
- const names = [name];
88
- classManager.eachSuperName(name, (superName) => {
89
- names.push(superName);
90
- });
91
-
92
- const flag = this.getByNames(names);
93
- this.cacheAll.set(name, flag);
94
-
95
- return flag;
96
- }
97
-
98
- /**
99
- * 会融合父类的flag位
100
- * @param names 组件类型名数组
101
- * @param out 输出数组,用于存储融合后的flag位
102
- * @returns 输出数组
103
- */
104
- getAllByNames(names: string[], out: number[]): IFlag {
105
- // 设置初始值
106
- let flag = this.getAllByName(names[0]);
107
- for (let index = 0; index < out.length; index++) {
108
- out[index] = flag[index];
109
- }
110
- // 叠加
111
- for (let i = 1; i < names.length; i++) {
112
- flag = this.getAllByName(names[i]);
113
- for (let index = 0; index < out.length; index++) {
114
- out[index] = out[index] | flag[index];
115
- }
116
- }
117
- return out;
118
- }
119
-
120
- /**
121
- * 只计算自身的flag位
122
- * @param name 组件类型名
123
- * @returns 组件类型的flag位数组
124
- */
125
- getByName(name: string): IFlag {
126
- const result = this.cache.get(name);
127
- if (result) return result;
128
-
129
- const FlagBits = this.bits;
130
-
131
- if (DEV && this.index >= FlagBits * 31) {
132
- throw new Error(`当前Component的种类超过${FlagBits * 31}个`);
133
- }
134
-
135
- const flag: IFlag = new Array(FlagBits).fill(0);
136
- flag[(this.index / 31) >>> 0] = (1 << (this.index % 31));
137
- this.cache.set(name, flag);
138
- this.index++;
139
-
140
- return flag;
141
- }
142
-
143
- /**
144
- * 只计算自身的flag位
145
- * @param names 组件类型名数组
146
- * @returns 组件类型的flag位数组
147
- */
148
- getByNames(names: string[]): IFlag {
149
- const result = new Array(this.bits);
150
- // 设置初始值
151
- let flag = this.getByName(names[0]);
152
- for (let index = 0; index < result.length; index++) {
153
- result[index] = flag[index];
154
- }
155
- // 叠加
156
- for (let i = 1; i < names.length; i++) {
157
- flag = this.getByName(names[i]);
158
- for (let index = 0; index < result.length; index++) {
159
- result[index] = result[index] | flag[index];
160
- }
161
- }
162
- return result;
163
- }
164
-
165
- /**
166
- * 获取flag位数量
167
- * @returns flag位数量
168
- */
169
- get bits() {
170
- return Math.ceil(classManager.comSize / 31);
171
- }
172
- }
173
- export const flagManager = new FlagManager();
174
-
175
- /**
176
- * 类管理器
177
- */
178
- class ClassManager {
179
-
180
- /** 组件类数量 */
181
- private comClassCount = 0;
182
-
183
- /** 类名到父类名的映射 */
184
- private nameToSuperName: Map<string, string> = new Map();
185
-
186
- /** 类名到类的映射 */
187
- private nameToClass: Map<string, typeof EcsBase> = new Map();
188
-
189
- /**
190
- * 获取父类
191
- * @param type 类
192
- * @returns 父类类型
193
- */
194
- private getSuper<T extends typeof EcsBase>(type: T): T {
195
- if (!type || !type.prototype) return null;
196
- const proto = type.prototype; // binded function do not have prototype
197
- const dunderProto = proto && Object.getPrototypeOf(proto);
198
- return dunderProto && dunderProto.constructor;
199
- }
200
-
201
- /**
202
- * 添加一个类
203
- * @param ctor 类构造函数
204
- * @param className 类名
205
- */
206
- add(ctor: typeof EcsBase, className: string) {
207
- if (DEV && this.nameToClass.has(className)) {
208
- console.error(`[ecs] ${className}已存在`);
209
- }
210
- this.nameToClass.set(className, ctor);
211
-
212
- // 存储类名继承对应关系
213
- let superCls = this.getSuper(ctor);
214
- while (superCls && superCls.ecsName !== EcsBase.ecsName) {
215
- if (DEV && className === superCls.ecsName) {
216
- console.error(`[ecs] 请使用ecsclass修饰\n @ecsclass('${ctor.name}')\n`, ctor);
217
- return;
218
- }
219
- this.nameToSuperName.set(className, superCls.ecsName);
220
- superCls = this.getSuper(ctor = superCls);
221
- className = ctor.ecsName;
222
- }
223
-
224
- if (superCls === EcsBaseComponent) {
225
- this.comClassCount++;
226
- } else if (DEV && superCls !== EcsBaseSingleton) {
227
- // console.warn('[ecs] 避免用ecsclass修饰系统或实体', className);
228
- }
229
- }
230
-
231
- /**
232
- * 遍历所有父类名,包括当前类
233
- * @param subName 子类名
234
- * @param callback 处理函数,用于对每个父类名进行操作
235
- */
236
- eachSuperName(subName: string, callback: (superName: string) => any) {
237
- while (subName) {
238
- const superName = this.getSuperName(subName);
239
- if (!superName) break;
240
- callback(subName = superName);
241
- }
242
- }
243
-
244
- /**
245
- * 通过类名判断一个是否是另一个的子类
246
- * @param subName 子类名
247
- * @param superName 父类名
248
- * @returns 是否是子类
249
- */
250
- isChildByName(subName: string, superName: string) {
251
- if (!subName) return false;
252
- if (!superName) return false;
253
-
254
- while (subName) {
255
- const _superName = this.getSuperName(subName);
256
- if (_superName === superName) return true;
257
- subName = _superName;
258
- }
259
-
260
- return false;
261
- }
262
-
263
- /**
264
- * 通过类名获取一个类
265
- * @param name 类名
266
- * @returns 类
267
- */
268
- getClassByName(name: string) {
269
- return this.nameToClass.get(name);
270
- }
271
-
272
- /**
273
- * 获取父类名字
274
- * @param name 类名
275
- * @returns 父类名
276
- */
277
- getSuperName(name: string) {
278
- return this.nameToSuperName.get(name) || '';
279
- }
280
-
281
- /**
282
- * 组件种类数量
283
- */
284
- get comSize() {
285
- return this.comClassCount;
286
- }
287
- }
288
- /**类管理器 */
289
- export const classManager = new ClassManager();
290
-
291
- /**
292
- * 组件管理器
293
- */
294
- export class ComponentManager {
295
-
296
- /** 组件名到组件列表的映射 */
297
- private components: Map<IComponentName, CustomArray<IComponent>> = new Map();
298
-
299
- /**
300
- * 获取或创建组件列表
301
- * @param name 组件名
302
- * @returns 组件列表
303
- */
304
- private getOrCreateComps(name: IComponentName) {
305
- if (!this.components.has(name)) {
306
- this.components.set(name, new CustomArray<IComponent>());
307
- }
308
- return this.components.get(name);
309
- }
310
-
311
- /**
312
- * 添加一个组件名对应的实体
313
- * @param comName 组件名
314
- * @param comp 组件
315
- */
316
- addComponent(comName: IComponentName, comp: IComponent) {
317
- if (!comName) return;
318
-
319
- // 添加当前
320
- this.getOrCreateComps(comName).add(comp);
321
-
322
- // 添加基类
323
- this.addComponent(classManager.getSuperName(comName), comp);
324
- }
325
-
326
- /**
327
- * 移除一个组件名对应的实体
328
- * @param comName 组件名
329
- * @param comp 组件
330
- */
331
- removeComponent(comName: IComponentName, comp: IComponent) {
332
- if (!comName) return;
333
-
334
- // 删除当前
335
- if (!this.components.has(comName)) return;
336
- this.getOrCreateComps(comName).remove(comp);
337
-
338
- // 删除基类
339
- this.removeComponent(classManager.getSuperName(comName), comp);
340
- }
341
-
342
- /**
343
- * 根据组件名获取实体列表,可能不存在
344
- * @param comName 组件名
345
- * @returns 组件列表
346
- */
347
- getComponents(comName: IComponentName) {
348
- return this.components.get(comName) || null;
349
- }
350
-
351
- /**
352
- * 清空所有组件
353
- */
354
- clear() {
355
- this.components.forEach(value => value.clear());
356
- this.components.clear();
357
- }
358
-
359
- /**
360
- * @param callback 处理函数,用于对每个组件进行操作
361
- * @returns 输出数组
362
- */
363
- eachUnique(callback: (component: IComponent) => void) {
364
- const visited: Map<number, boolean> = new Map();
365
- this.components.forEach((components) => {
366
- components.forEach((component) => {
367
- if (visited.has(component.uuid)) return;
368
- visited.set(component.uuid, true);
369
- callback(component);
370
- });
371
- });
372
- }
373
- }
374
-
375
- /**
376
- * 实体管理器
377
- */
378
- export class EntityManager {
379
-
380
- /** 实体UUID到实体的映射 */
381
- private entities: Map<IEntityUUID, IEntity> = new Map();
382
-
383
- /**
384
- * 检查实体是否存在
385
- * @param uuid 实体UUID
386
- * @returns 是否存在
387
- */
388
- has(uuid: IEntityUUID) {
389
- return this.entities.get(uuid) || null;
390
- }
391
-
392
- /**
393
- * 添加一个实体
394
- * @param entity 实体
395
- */
396
- add(entity: IEntity) {
397
- this.entities.set(entity.uuid, entity);
398
- }
399
-
400
- /**
401
- * 移除一个实体
402
- * @param entity 实体
403
- * @returns 是否成功移除
404
- */
405
- remove(entity: IEntity) {
406
- return this.entities.delete(entity.uuid);
407
- }
408
-
409
- /**
410
- * 根据UUID获取一个实体
411
- * @param uuid 实体UUID
412
- * @returns 实体
413
- */
414
- get(uuid: IEntityUUID) {
415
- return this.entities.get(uuid) || null;
416
- }
417
-
418
- /**
419
- * 获取所有实体
420
- * @param out 输出数组,用于存储所有实体
421
- * @returns 输出数组
422
- */
423
- getAll(out: IEntity[]) {
424
- this.entities.forEach(entity => out.push(entity));
425
- return out;
426
- }
427
-
428
- /**
429
- * 遍历所有实体
430
- * @param callback 处理函数,用于对每个实体进行操作
431
- */
432
- each(callback: (value: IEntity) => void) {
433
- this.entities.forEach(callback);
434
- }
435
-
436
- /**
437
- * 清空所有实体
438
- */
439
- clear() {
440
- this.entities.clear();
441
- }
442
- }
443
-
444
- /**
445
- * 系统管理器
446
- */
447
- export class SystemManager {
448
- private systems: ISystem[] = [];
449
-
450
- /**
451
- * 添加一个系统
452
- * @param system 系统
453
- */
454
- add(system: ISystem) {
455
- this.systems.push(system);
456
- }
457
-
458
- /**
459
- * 根据系统名获取一个系统
460
- * @param System 系统类型
461
- * @returns 系统
462
- */
463
- get(System: ITypeofSystem) {
464
- const index = this.systems.findIndex(system => system.ecsName === System.ecsName);
465
- return this.systems[index];
466
- }
467
-
468
- /**
469
- * 移除一个系统
470
- * @param System 系统类型
471
- * @returns 是否成功移除
472
- */
473
- remove(System: ITypeofSystem) {
474
- const index = this.systems.findIndex(system => system.ecsName === System.ecsName);
475
- if (index >= 0) {
476
- return this.systems.splice(index, 1)[0] || null;
477
- }
478
- return null;
479
- }
480
-
481
- /**
482
- * 清空所有系统
483
- */
484
- clear() {
485
- this.systems.length = 0;
486
- }
487
-
488
- /**
489
- * 遍历所有系统
490
- * @param callback 处理函数,用于对每个系统进行操作
491
- */
492
- each(callback: (value: ISystem) => void) {
493
- this.systems.forEach(callback);
494
- }
495
-
496
- /**
497
- * 系统数量
498
- */
499
- get size() {
500
- return this.systems.length;
501
- }
502
- }
@@ -1,9 +0,0 @@
1
- {
2
- "ver": "4.0.24",
3
- "importer": "typescript",
4
- "imported": true,
5
- "uuid": "809afa16-d8c6-47de-9b8b-34dbcce2f6b0",
6
- "files": [],
7
- "subMetas": {},
8
- "userData": {}
9
- }
@@ -1,9 +0,0 @@
1
- {
2
- "ver": "4.0.24",
3
- "importer": "typescript",
4
- "imported": true,
5
- "uuid": "b4f0d986-c6b7-480c-8dc1-c0286b01d114",
6
- "files": [],
7
- "subMetas": {},
8
- "userData": {}
9
- }