@ives_xxz/framework 1.0.0

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 (139) hide show
  1. package/FW.d.ts +1845 -0
  2. package/FW.d.ts.meta +6 -0
  3. package/Framework.ts +148 -0
  4. package/Framework.ts.meta +10 -0
  5. package/README.md +93 -0
  6. package/README.md.meta +6 -0
  7. package/animation/FWAnimation.ts +13 -0
  8. package/animation/FWAnimation.ts.meta +10 -0
  9. package/animation/FWSkeleton.ts +176 -0
  10. package/animation/FWSkeleton.ts.meta +10 -0
  11. package/animation/FWTween.ts +60 -0
  12. package/animation/FWTween.ts.meta +10 -0
  13. package/animation.meta +13 -0
  14. package/component/FWVirtualViewComponent.ts +2080 -0
  15. package/component/FWVirtualViewComponent.ts.meta +10 -0
  16. package/component.meta +13 -0
  17. package/config/FWAssetConfig.ts +7 -0
  18. package/config/FWAssetConfig.ts.meta +10 -0
  19. package/config.meta +13 -0
  20. package/controller/FWLayerController.ts +236 -0
  21. package/controller/FWLayerController.ts.meta +10 -0
  22. package/controller.meta +13 -0
  23. package/data/FWData.ts +10 -0
  24. package/data/FWData.ts.meta +10 -0
  25. package/data.meta +13 -0
  26. package/define/FWEventDefine.ts +26 -0
  27. package/define/FWEventDefine.ts.meta +10 -0
  28. package/define/FWSystemDefine.ts +133 -0
  29. package/define/FWSystemDefine.ts.meta +10 -0
  30. package/define.meta +13 -0
  31. package/entry/FWEntry.ts +196 -0
  32. package/entry/FWEntry.ts.meta +10 -0
  33. package/entry.meta +13 -0
  34. package/expand/FWCocosExpand.ts +73 -0
  35. package/expand/FWCocosExpand.ts.meta +10 -0
  36. package/expand/FWDecorator.ts +256 -0
  37. package/expand/FWDecorator.ts.meta +10 -0
  38. package/expand/FWRollingViewNesting.ts +191 -0
  39. package/expand/FWRollingViewNesting.ts.meta +10 -0
  40. package/expand/FWTweenExpand.ts +44 -0
  41. package/expand/FWTweenExpand.ts.meta +10 -0
  42. package/expand.meta +13 -0
  43. package/item/FWVirtualListItem.ts +150 -0
  44. package/item/FWVirtualListItem.ts.meta +10 -0
  45. package/item.meta +13 -0
  46. package/language/FWLanguage.ts +69 -0
  47. package/language/FWLanguage.ts.meta +10 -0
  48. package/language/FWLanguageLabelLocalize.ts +144 -0
  49. package/language/FWLanguageLabelLocalize.ts.meta +10 -0
  50. package/language/FWLanguageSkeletonLocalize.ts +106 -0
  51. package/language/FWLanguageSkeletonLocalize.ts.meta +10 -0
  52. package/language/FWLanguageSpriteLocalize.ts +81 -0
  53. package/language/FWLanguageSpriteLocalize.ts.meta +10 -0
  54. package/language.meta +13 -0
  55. package/layer/FWLayer.ts +13 -0
  56. package/layer/FWLayer.ts.meta +10 -0
  57. package/layer.meta +13 -0
  58. package/log/FWLog.ts +115 -0
  59. package/log/FWLog.ts.meta +10 -0
  60. package/log.meta +13 -0
  61. package/logic/FWLogic.ts +10 -0
  62. package/logic/FWLogic.ts.meta +10 -0
  63. package/logic.meta +13 -0
  64. package/machine/FWAnimationMachine.ts +28 -0
  65. package/machine/FWAnimationMachine.ts.meta +10 -0
  66. package/machine/FWStateMachine.ts +75 -0
  67. package/machine/FWStateMachine.ts.meta +10 -0
  68. package/machine.meta +13 -0
  69. package/manager/FWAnimationManager.ts +128 -0
  70. package/manager/FWAnimationManager.ts.meta +10 -0
  71. package/manager/FWAssetManager.ts +349 -0
  72. package/manager/FWAssetManager.ts.meta +10 -0
  73. package/manager/FWAudioManager.ts +289 -0
  74. package/manager/FWAudioManager.ts.meta +10 -0
  75. package/manager/FWBundleManager.ts +91 -0
  76. package/manager/FWBundleManager.ts.meta +10 -0
  77. package/manager/FWComponentManager.ts +25 -0
  78. package/manager/FWComponentManager.ts.meta +10 -0
  79. package/manager/FWEngineManager.ts +63 -0
  80. package/manager/FWEngineManager.ts.meta +10 -0
  81. package/manager/FWEventManager.ts +275 -0
  82. package/manager/FWEventManager.ts.meta +10 -0
  83. package/manager/FWHotUpdateManager.ts +213 -0
  84. package/manager/FWHotUpdateManager.ts.meta +10 -0
  85. package/manager/FWLanguageManager.ts +116 -0
  86. package/manager/FWLanguageManager.ts.meta +10 -0
  87. package/manager/FWLayerManager.ts +490 -0
  88. package/manager/FWLayerManager.ts.meta +10 -0
  89. package/manager/FWManager.ts +8 -0
  90. package/manager/FWManager.ts.meta +10 -0
  91. package/manager/FWObjectManager.ts +91 -0
  92. package/manager/FWObjectManager.ts.meta +10 -0
  93. package/manager/FWResManager.ts +171 -0
  94. package/manager/FWResManager.ts.meta +10 -0
  95. package/manager/FWSocketManager.ts +94 -0
  96. package/manager/FWSocketManager.ts.meta +10 -0
  97. package/manager/FWStateManager.ts +102 -0
  98. package/manager/FWStateManager.ts.meta +10 -0
  99. package/manager/FWTaskManager.ts +38 -0
  100. package/manager/FWTaskManager.ts.meta +10 -0
  101. package/manager/FWTimeManager.ts +473 -0
  102. package/manager/FWTimeManager.ts.meta +10 -0
  103. package/manager/FWUiManager.ts +164 -0
  104. package/manager/FWUiManager.ts.meta +10 -0
  105. package/manager.meta +13 -0
  106. package/package.json +17 -0
  107. package/package.json.meta +6 -0
  108. package/scene/FWScene.ts +25 -0
  109. package/scene/FWScene.ts.meta +10 -0
  110. package/scene.meta +13 -0
  111. package/service/FWService.ts +7 -0
  112. package/service/FWService.ts.meta +10 -0
  113. package/service/http/FWHttp.ts +70 -0
  114. package/service/http/FWHttp.ts.meta +10 -0
  115. package/service/http.meta +13 -0
  116. package/service/socket/FWSocket.ts +236 -0
  117. package/service/socket/FWSocket.ts.meta +10 -0
  118. package/service/socket/FWSocketHandle.ts +17 -0
  119. package/service/socket/FWSocketHandle.ts.meta +10 -0
  120. package/service/socket/FWSocketSender.ts +16 -0
  121. package/service/socket/FWSocketSender.ts.meta +10 -0
  122. package/service/socket.meta +13 -0
  123. package/service.meta +13 -0
  124. package/state/FWState.ts +8 -0
  125. package/state/FWState.ts.meta +10 -0
  126. package/state.meta +13 -0
  127. package/utils/FWLodash.ts +105 -0
  128. package/utils/FWLodash.ts.meta +10 -0
  129. package/utils/FWMask.ts +222 -0
  130. package/utils/FWMask.ts.meta +10 -0
  131. package/utils/FWObject.ts +22 -0
  132. package/utils/FWObject.ts.meta +10 -0
  133. package/utils/FWObjectPool.ts +178 -0
  134. package/utils/FWObjectPool.ts.meta +10 -0
  135. package/utils/FWQueue.ts +47 -0
  136. package/utils/FWQueue.ts.meta +10 -0
  137. package/utils/FWTask.ts +223 -0
  138. package/utils/FWTask.ts.meta +10 -0
  139. package/utils.meta +13 -0
@@ -0,0 +1,490 @@
1
+ import { FWManager } from './FWManager';
2
+ import { FWLayerController } from '../controller/FWLayerController';
3
+ import { FWSystemDefine } from '../define/FWSystemDefine';
4
+ import FWLayer from '../layer/FWLayer';
5
+ import FWLog from '../log/FWLog';
6
+ import { FWQueue } from '../utils/FWQueue';
7
+
8
+ const ADD_EXTERNAL_REFERENCE: string = 'addExternalReference';
9
+
10
+ export class FWLayerData<T extends FWLayerController = FWLayerController>
11
+ implements FW.LayerData<T>
12
+ {
13
+ layerConstructor: new () => T;
14
+ uuid: string;
15
+ layer: FW.Layer;
16
+ layerName: string;
17
+ layerAssetProperty: FW.AssetProperty;
18
+ layerRenderOrder: FWSystemDefine.FWLayerRenderOrder;
19
+ layerType: FWSystemDefine.FWLayerType;
20
+ layerParent?: cc.Node;
21
+ layerPosition?: cc.Vec3;
22
+ controllerName: string;
23
+ controller: FWLayerController;
24
+ loaded: boolean;
25
+ externalReference?: Set<(ref: FW.LayerController | null) => void>;
26
+ }
27
+
28
+ export class FWLayerManager extends FWManager implements FW.LayerManager {
29
+ /**
30
+ * 当前待打开的layer队列
31
+ */
32
+ private layerQueue: FWQueue<FWLayerData>;
33
+ /**
34
+ * 当前已经打开的layer缓存容器
35
+ */
36
+ private layerMap: Map<string, FWLayerData>;
37
+ /**
38
+ * layer栈队列
39
+ */
40
+ private layerStack: FWLayerData[];
41
+
42
+ public initialize(): void {
43
+ this.layerQueue = new FWQueue<FWLayerData>();
44
+ this.layerMap = new Map<string, FWLayerData>();
45
+ this.layerStack = [];
46
+ }
47
+
48
+ /**
49
+ * 异步打开layer
50
+ * @param layerData
51
+ * @returns
52
+ */
53
+ protected async openLayerAsync(layerData: FWLayerData) {
54
+ try {
55
+ const res = await FW.Entry.resMgr.loadAssetData<cc.Prefab>(layerData.layerAssetProperty);
56
+
57
+ /** 保存资源数据 */
58
+ res.user = layerData.layerName;
59
+ res.autoRelease = layerData.controller.autoRelease;
60
+ res.dependentBundle = layerData.controller.layerAssetProperty.bundle;
61
+
62
+ return res;
63
+ } catch (e) {
64
+ FWLog.error(`openLayerAsync failed : `, e);
65
+ }
66
+ }
67
+ /**
68
+ * 同步打开layer
69
+ * @param layerData
70
+ * @returns
71
+ */
72
+ protected openLayerSync(layerData: FWLayerData) {
73
+ layerData.layerAssetProperty.bundle =
74
+ layerData.layerAssetProperty.bundle || FW.Entry.bundleName;
75
+ const res = FW.Entry.resMgr.getAssetData<cc.Prefab>(layerData.layerAssetProperty);
76
+ /** 保存资源数据 */
77
+ res.user = layerData.layerName;
78
+ res.autoRelease = layerData.controller.autoRelease;
79
+ res.dependentBundle = layerData.controller.layerAssetProperty.bundle;
80
+
81
+ layerData.uuid = res.uuid;
82
+
83
+ return res;
84
+ }
85
+
86
+ /**
87
+ * 创建layer数据
88
+ * @param ctr
89
+ * @returns
90
+ */
91
+ protected createLayerData(ctr: FWLayerController) {
92
+ const layerData = new FWLayerData();
93
+ const layerType = ctr.layerType;
94
+
95
+ /** 记录layer数据 */
96
+ layerData.layerRenderOrder = ctr.renderOrder;
97
+ layerData.layerAssetProperty = ctr.layerAssetProperty;
98
+ layerData.layerType = layerType;
99
+ layerData.controller = ctr;
100
+ layerData.loaded = false;
101
+ layerData.externalReference = new Set();
102
+
103
+ return layerData;
104
+ }
105
+
106
+ /**
107
+ * 异步打开layer
108
+ * @param data
109
+ * @returns
110
+ */
111
+ async openAsync<Ctr extends FWLayerController = FWLayerController>(
112
+ data: FW.LayerOpenArgs<Ctr>,
113
+ ): Promise<Ctr> {
114
+ if (!data) {
115
+ FWLog.error(`打开Layer失败:${data},请检查参数!`);
116
+ return undefined;
117
+ }
118
+
119
+ let ctr = new data.type();
120
+
121
+ if (!ctr.isRepeatOpen) {
122
+ for (const [key, value] of this.layerMap) {
123
+ if (value.layerAssetProperty.path == ctr.layerAssetProperty.path) {
124
+ return this.layerMap.get(value.uuid).controller as Ctr;
125
+ }
126
+ }
127
+ }
128
+
129
+ if (ctr.layerType == FWSystemDefine.FWLayerType.POPUP_QUEUE && !this.layerQueue.isEmpty()) {
130
+ this.layerQueue.add(ctr.layerData);
131
+ return;
132
+ }
133
+
134
+ ctr.initialize();
135
+
136
+ const layerData = this.createLayerData(ctr);
137
+
138
+ const res = await this.openLayerAsync(layerData);
139
+
140
+ const layer = await this.createLayer(
141
+ res.asset,
142
+ res.asset.name,
143
+ ctr.renderOrder,
144
+ data.parent,
145
+ data.position,
146
+ );
147
+
148
+ const layerName = cc.js.getClassName(layer);
149
+ const ctrName = cc.js.getClassName(ctr);
150
+
151
+ ctr.layerData = layerData;
152
+ ctr.layerData.loaded = true;
153
+ ctr.layer = layer;
154
+ ctr.layerData.layerName = layerName;
155
+ ctr.layerData.controllerName = ctrName;
156
+ ctr.layerData.uuid = res.uuid;
157
+ ctr.uuid = res.uuid;
158
+ ctr.onInit?.(data.args);
159
+
160
+ this.lifecycleProcessing(ctr);
161
+
162
+ this.layerMap.set(res.uuid, layerData);
163
+
164
+ if (ctr.layerType !== FWSystemDefine.FWLayerType.PERMANENT) {
165
+ this.layerStack.push(layerData);
166
+ }
167
+
168
+ const proxy = new Proxy(ctr, {
169
+ get: (target, prop) => {
170
+ if (prop === ADD_EXTERNAL_REFERENCE) {
171
+ return (cb: (ref: FW.LayerController | null) => void) => {
172
+ layerData.externalReference.add(cb);
173
+ };
174
+ }
175
+ return target[prop];
176
+ },
177
+ });
178
+ return proxy;
179
+ }
180
+
181
+ /**
182
+ * 同步打开
183
+ * @param data
184
+ * @returns
185
+ */
186
+ openSync<Ctr extends FWLayerController = FWLayerController>(data: FW.LayerOpenArgs<Ctr>): Ctr {
187
+ if (!data) {
188
+ FWLog.error(`open layer failed:${data},please check param!`);
189
+ return undefined;
190
+ }
191
+ let ctr = new data.type();
192
+
193
+ if (!ctr.isRepeatOpen) {
194
+ for (const [key, value] of this.layerMap) {
195
+ if (value.layerAssetProperty.path == ctr.layerAssetProperty.path) {
196
+ return this.layerMap.get(value.uuid).controller as Ctr;
197
+ }
198
+ }
199
+ }
200
+
201
+ if (ctr.layerType == FWSystemDefine.FWLayerType.POPUP_QUEUE && !this.layerQueue.isEmpty()) {
202
+ this.layerQueue.add(ctr.layerData);
203
+ return;
204
+ }
205
+
206
+ ctr.initialize();
207
+
208
+ const layerData = this.createLayerData(ctr);
209
+
210
+ if (
211
+ layerData.layerType == FWSystemDefine.FWLayerType.POPUP_QUEUE &&
212
+ !this.layerQueue.isEmpty()
213
+ ) {
214
+ this.layerQueue.add(layerData);
215
+ } else {
216
+ const res = this.openLayerSync(layerData);
217
+ const layer = this.createLayer(
218
+ res.asset,
219
+ res.asset.name,
220
+ layerData.layerRenderOrder,
221
+ layerData.layerParent,
222
+ layerData.layerPosition,
223
+ );
224
+ this.layerMap.set(res.uuid, layerData);
225
+ const layerName = cc.js.getClassName(layer);
226
+ const ctrName = cc.js.getClassName(ctr);
227
+
228
+ ctr.layerData = layerData;
229
+ ctr.layerData.loaded = true;
230
+ ctr.layer = layer;
231
+ ctr.layerData.layerName = layerName;
232
+ ctr.layerData.controllerName = ctrName;
233
+ ctr.layerData.uuid = res.uuid;
234
+ ctr.uuid = res.uuid;
235
+ ctr.onInit?.(data.args);
236
+
237
+ this.lifecycleProcessing(ctr);
238
+ }
239
+
240
+ if (ctr.layerType !== FWSystemDefine.FWLayerType.PERMANENT) {
241
+ this.layerStack.push(layerData);
242
+ }
243
+ const a = Symbol['addExternalReference'];
244
+
245
+ const proxy = new Proxy(ctr, {
246
+ get: (target, prop) => {
247
+ if (prop === 'addExternalReference') {
248
+ return (cb: (ref: FW.LayerController | null) => void) => {
249
+ layerData.externalReference.add(cb);
250
+ };
251
+ }
252
+ return target[prop];
253
+ },
254
+ });
255
+ return proxy;
256
+ }
257
+
258
+ /**
259
+ * 显示layer并恢复所有节点事件
260
+ * @param ctr
261
+ * @returns
262
+ */
263
+ displayLayer<Ctr extends FWLayerController = FWLayerController>(ctr: Ctr): Ctr {
264
+ const layerData = ctr.layerData;
265
+ if (!this.layerMap.has(layerData.uuid)) {
266
+ FWLog.warn(`display layer failed,layer name : ${layerData.layerName}`);
267
+ return;
268
+ }
269
+ /** 非常驻layer不允许操作透明度显示 */
270
+ if (ctr.layerType != FWSystemDefine.FWLayerType.PERMANENT) return;
271
+
272
+ const node = ctr.layer.node;
273
+ node.opacity = 255;
274
+ node.resumeSystemEvents(true);
275
+
276
+ FW.Entry.evtMgr.targetResume(ctr);
277
+ }
278
+
279
+ /**
280
+ * 隐藏layer并隐藏所有节点事件
281
+ * @param ctr
282
+ * @returns
283
+ */
284
+ hideLayer<Ctr extends FWLayerController = FWLayerController>(ctr: Ctr): Ctr {
285
+ const layerData = ctr.layerData;
286
+ if (!this.layerMap.has(layerData.uuid)) {
287
+ FWLog.warn(`hide layer failed,layer name : ${layerData.layerName}`);
288
+ return;
289
+ }
290
+
291
+ /** 非常驻layer不允许操作透明度 */
292
+ if (ctr.layerType != FWSystemDefine.FWLayerType.PERMANENT) return;
293
+
294
+ const node = ctr.layer.node;
295
+ node.opacity = 0;
296
+ node.pauseSystemEvents(true);
297
+ FW.Entry.evtMgr.targetPause(ctr);
298
+ }
299
+
300
+ /**
301
+ * 通过layer名字关闭
302
+ * @param name
303
+ */
304
+ closeFromLayerName(name: string | string[]): void {
305
+ this.layerMap.forEach((v) => {
306
+ if (Array.isArray(name)) {
307
+ name.forEach((n) => {
308
+ if (n === v.layerName) {
309
+ this.close(v.controller);
310
+ }
311
+ });
312
+ } else {
313
+ if (v.layerName == name) {
314
+ this.close(v.controller);
315
+ }
316
+ }
317
+ });
318
+ }
319
+ /**
320
+ * 从栈关闭
321
+ */
322
+ closeFromStack(count?: number) {
323
+ count = count ? count : 1;
324
+ for (let i = 0; i < count; i++) {
325
+ let layerData = this.layerStack.pop();
326
+ let ctr = layerData.controller;
327
+ if (!this.layerMap.has(layerData.uuid)) {
328
+ return;
329
+ }
330
+ if (cc.isValid(ctr.layer?.node)) {
331
+ ctr.destroy?.();
332
+ if (ctr.autoRelease) {
333
+ FW.Entry.resMgr.releaseAsset(ctr.layerData.layerAssetProperty);
334
+ }
335
+ this.notifyExternalRefUpdates(ctr.layerData);
336
+ }
337
+ this.layerMap.delete(layerData.uuid);
338
+ }
339
+ }
340
+
341
+ /**
342
+ * 关闭layer
343
+ * @param ctr
344
+ */
345
+ async close<Ctr extends FWLayerController = FWLayerController>(
346
+ ctr: Ctr,
347
+ ): Promise<FWLayerController> {
348
+ if (!ctr) return;
349
+
350
+ let layerData = ctr.layerData;
351
+
352
+ if (!this.layerMap.has(layerData.uuid)) {
353
+ return;
354
+ }
355
+
356
+ if (cc.isValid(ctr.layer?.node)) {
357
+ ctr.destroy?.();
358
+ if (ctr.autoRelease) {
359
+ FW.Entry.resMgr.releaseAsset(ctr.layerData.layerAssetProperty);
360
+ }
361
+ this.notifyExternalRefUpdates(ctr.layerData);
362
+ }
363
+
364
+ this.layerMap.delete(layerData.uuid);
365
+ this.layerStack.pop();
366
+
367
+ const index = this.layerStack.findIndex((v) => {
368
+ v.controller == ctr;
369
+ });
370
+ this.layerStack.slice(index, 1);
371
+
372
+ /** 如果队列中还有等待打开的layer */
373
+ if (!this.layerQueue.isEmpty()) {
374
+ const nextLayerData = this.layerQueue.shift();
375
+ /** 先尝试同步打开 */
376
+ const nextLayer = this.openSync({
377
+ parent: nextLayerData.layerParent,
378
+ position: nextLayerData.layerPosition,
379
+ type: nextLayerData.layerConstructor,
380
+ });
381
+ /** 如果同步打开失败,再次尝试异步打开(可能由于资源所在bundle并未提前加载) */
382
+ if (!nextLayer) {
383
+ return this.openAsync({
384
+ parent: nextLayerData.layerParent,
385
+ position: nextLayerData.layerPosition,
386
+ type: nextLayerData.layerConstructor,
387
+ });
388
+ } else {
389
+ return nextLayer;
390
+ }
391
+ } else {
392
+ return undefined;
393
+ }
394
+ }
395
+
396
+ private notifyExternalRefUpdates(layerData: FWLayerData) {
397
+ layerData.externalReference.forEach((cb) => {
398
+ try {
399
+ cb?.(null);
400
+ } catch (e) {
401
+ FWLog.error('External ref update callback error:', e);
402
+ }
403
+ });
404
+ layerData.externalReference.clear();
405
+ }
406
+ /** 创建layer */
407
+ private createLayer(
408
+ prefab: cc.Prefab,
409
+ layerComponent: string,
410
+ renderOrder: number,
411
+ parent: cc.Node,
412
+ position: cc.Vec3,
413
+ ) {
414
+ parent = parent || FW.Entry.scene?.node;
415
+
416
+ position = position || cc.Vec3.ZERO;
417
+
418
+ if (!parent.activeInHierarchy || !cc.isValid(parent)) {
419
+ FWLog.error(`createLayer failed , parent : ${parent}`);
420
+ return;
421
+ }
422
+ const node = cc.instantiate(prefab);
423
+ node.setParent(parent);
424
+ node.setPosition(position);
425
+ node.zIndex = renderOrder;
426
+ !node.getComponent(layerComponent) && node.addComponent(layerComponent);
427
+ return node.getComponent(FWLayer);
428
+ }
429
+
430
+ private lifecycleProcessing(ctr: FWLayerController) {
431
+ const layer = ctr.layer;
432
+
433
+ const onLoad = layer['onLoad'];
434
+ layer['onLoad'] = () => {
435
+ onLoad?.call(layer);
436
+ ctr.onLoad?.();
437
+ };
438
+
439
+ const onStart = layer['start'];
440
+ layer['start'] = () => {
441
+ onStart?.call(layer);
442
+ ctr.onStart?.();
443
+ };
444
+
445
+ const onEnable = layer['onEnable'];
446
+ layer['onEnable'] = () => {
447
+ onEnable?.call(layer);
448
+ ctr.onEnable?.();
449
+ };
450
+
451
+ const onDisable = layer['onDisable'];
452
+ layer['onDisable'] = () => {
453
+ onDisable?.call(layer);
454
+ ctr.onDisable?.();
455
+ };
456
+
457
+ const onDestroy = layer['onDestroy'];
458
+ layer['onDestroy'] = () => {
459
+ onDestroy?.call(layer);
460
+ ctr.onDestroy?.();
461
+ };
462
+
463
+ const onUpdate = layer['update'];
464
+ layer['update'] = (dt?: number) => {
465
+ onUpdate?.call(layer);
466
+ ctr.onUpdate?.(dt);
467
+ };
468
+
469
+ const onLateUpdate = layer['lateUpdate'];
470
+ layer['lateUpdate'] = () => {
471
+ onLateUpdate?.call(layer);
472
+ ctr.onLateUpdate?.();
473
+ };
474
+ }
475
+
476
+ getLayerMap(): Map<string, FWLayerData> {
477
+ return this.layerMap;
478
+ }
479
+
480
+ public clear() {
481
+ this.layerMap.forEach((v) => this.close(v.controller));
482
+ this.layerMap.clear();
483
+ }
484
+
485
+ public onDestroy(): void {
486
+ this.layerMap.clear();
487
+ this.layerMap = null;
488
+ this.layerQueue = null;
489
+ }
490
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "ver": "1.1.0",
3
+ "uuid": "763150db-103d-4078-9dab-48f9ced9015a",
4
+ "importer": "typescript",
5
+ "isPlugin": false,
6
+ "loadPluginInWeb": true,
7
+ "loadPluginInNative": true,
8
+ "loadPluginInEditor": false,
9
+ "subMetas": {}
10
+ }
@@ -0,0 +1,8 @@
1
+ export abstract class FWManager {
2
+ public readonly entry: FW.Entry = FW.Entry;
3
+ constructor() {
4
+ this.initialize();
5
+ }
6
+ public abstract initialize(): void;
7
+ public abstract onDestroy(): void;
8
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "ver": "1.1.0",
3
+ "uuid": "f2b4d729-7f2a-4065-823f-d998a5d4f449",
4
+ "importer": "typescript",
5
+ "isPlugin": false,
6
+ "loadPluginInWeb": true,
7
+ "loadPluginInNative": true,
8
+ "loadPluginInEditor": false,
9
+ "subMetas": {}
10
+ }
@@ -0,0 +1,91 @@
1
+ import { FWSystemDefine } from '../define/FWSystemDefine';
2
+ import Framework from '../Framework';
3
+ import FWObject from '../utils/FWObject';
4
+ import { FWObjectPool } from '../utils/FWObjectPool';
5
+ import { FWManager } from './FWManager';
6
+
7
+ export default class FWObjectManager extends FWManager implements FW.ObjectManager {
8
+ public initialize(): void {
9
+ this.poolMap = new Map<string, FWObjectPool>();
10
+ }
11
+ public onDestroy(): void {}
12
+ private poolMap: Map<string, FWObjectPool>;
13
+
14
+ /** 创建一个对象池 */
15
+ async createObjectPool<T extends FWObject = FWObject>(
16
+ node: cc.Node,
17
+ parent: cc.Node,
18
+ tag?: string,
19
+ ): Promise<FWObjectPool>;
20
+ async createObjectPool<T extends FWObject = FWObject>(
21
+ prefab: cc.Prefab,
22
+ parent: cc.Node,
23
+ tag?: string,
24
+ ): Promise<FWObjectPool>;
25
+ async createObjectPool<T extends FWObject = FWObject>(
26
+ assetProperty: FW.AssetProperty,
27
+ parent: cc.Node,
28
+ tag?: string,
29
+ ): Promise<FWObjectPool>;
30
+ async createObjectPool<T extends FWObject = FWObject>(
31
+ node: cc.Node,
32
+ parent: cc.Node,
33
+ type?: number,
34
+ ): Promise<FWObjectPool>;
35
+ async createObjectPool<T extends FWObject = FWObject>(
36
+ prefab: cc.Prefab,
37
+ parent: cc.Node,
38
+ type?: number,
39
+ ): Promise<FWObjectPool>;
40
+ async createObjectPool<T extends FWObject = FWObject>(
41
+ assetProperty: FW.AssetProperty,
42
+ parent: cc.Node,
43
+ type?: number,
44
+ ): Promise<FWObjectPool>;
45
+ async createObjectPool<T extends FWObject = FWObject>(): Promise<FWObjectPool> {
46
+ let objectNode: cc.Node = null;
47
+ let objectPrefab: cc.Prefab = null;
48
+ let objectAssetProperty: FW.AssetProperty = null;
49
+ let objectParent: cc.Node;
50
+ let objectTag: string;
51
+ let objectType: FWSystemDefine.FWObjectType;
52
+ if (arguments.length > 3) return;
53
+ if (arguments[0] instanceof cc.Node) {
54
+ objectNode = arguments[0];
55
+ } else if (arguments[0] instanceof cc.Prefab) {
56
+ objectPrefab = arguments[0];
57
+ objectNode = cc.instantiate(objectPrefab);
58
+ } else {
59
+ objectAssetProperty = arguments[0];
60
+ objectPrefab = await FW.Entry.resMgr.loadAsset<cc.Prefab>(objectAssetProperty);
61
+ objectNode = cc.instantiate(objectPrefab);
62
+ }
63
+ objectParent = arguments[1];
64
+ if (arguments[2] && typeof arguments[2] === 'string') {
65
+ objectTag = arguments[2];
66
+ objectType = FWSystemDefine.FWObjectType.OPACITY;
67
+ } else {
68
+ objectTag = this.poolMap.size?.toString() || '';
69
+ objectType = arguments[2];
70
+ }
71
+
72
+ const pool = new FWObjectPool<T>(objectNode, objectParent, objectType);
73
+
74
+ this.poolMap.set(objectTag, pool);
75
+
76
+ return pool;
77
+ }
78
+
79
+ /** 获取已经创建的对象池 */
80
+ getObjectPool(tag: string) {
81
+ if (!this.poolMap.has(tag)) return undefined;
82
+ return this.poolMap.get(tag);
83
+ }
84
+
85
+ /** 销毁一个对象池 */
86
+ destroyObjectPool(tag: string) {
87
+ if (!this.poolMap.has(tag)) return;
88
+ this.poolMap.get(tag).onDestroy();
89
+ this.poolMap.delete(tag);
90
+ }
91
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "ver": "1.1.0",
3
+ "uuid": "a490a2b7-8487-4fe1-a3ce-fbb473a39530",
4
+ "importer": "typescript",
5
+ "isPlugin": false,
6
+ "loadPluginInWeb": true,
7
+ "loadPluginInNative": true,
8
+ "loadPluginInEditor": false,
9
+ "subMetas": {}
10
+ }