@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.
- package/FW.d.ts +1845 -0
- package/FW.d.ts.meta +6 -0
- package/Framework.ts +148 -0
- package/Framework.ts.meta +10 -0
- package/README.md +93 -0
- package/README.md.meta +6 -0
- package/animation/FWAnimation.ts +13 -0
- package/animation/FWAnimation.ts.meta +10 -0
- package/animation/FWSkeleton.ts +176 -0
- package/animation/FWSkeleton.ts.meta +10 -0
- package/animation/FWTween.ts +60 -0
- package/animation/FWTween.ts.meta +10 -0
- package/animation.meta +13 -0
- package/component/FWVirtualViewComponent.ts +2080 -0
- package/component/FWVirtualViewComponent.ts.meta +10 -0
- package/component.meta +13 -0
- package/config/FWAssetConfig.ts +7 -0
- package/config/FWAssetConfig.ts.meta +10 -0
- package/config.meta +13 -0
- package/controller/FWLayerController.ts +236 -0
- package/controller/FWLayerController.ts.meta +10 -0
- package/controller.meta +13 -0
- package/data/FWData.ts +10 -0
- package/data/FWData.ts.meta +10 -0
- package/data.meta +13 -0
- package/define/FWEventDefine.ts +26 -0
- package/define/FWEventDefine.ts.meta +10 -0
- package/define/FWSystemDefine.ts +133 -0
- package/define/FWSystemDefine.ts.meta +10 -0
- package/define.meta +13 -0
- package/entry/FWEntry.ts +196 -0
- package/entry/FWEntry.ts.meta +10 -0
- package/entry.meta +13 -0
- package/expand/FWCocosExpand.ts +73 -0
- package/expand/FWCocosExpand.ts.meta +10 -0
- package/expand/FWDecorator.ts +256 -0
- package/expand/FWDecorator.ts.meta +10 -0
- package/expand/FWRollingViewNesting.ts +191 -0
- package/expand/FWRollingViewNesting.ts.meta +10 -0
- package/expand/FWTweenExpand.ts +44 -0
- package/expand/FWTweenExpand.ts.meta +10 -0
- package/expand.meta +13 -0
- package/item/FWVirtualListItem.ts +150 -0
- package/item/FWVirtualListItem.ts.meta +10 -0
- package/item.meta +13 -0
- package/language/FWLanguage.ts +69 -0
- package/language/FWLanguage.ts.meta +10 -0
- package/language/FWLanguageLabelLocalize.ts +144 -0
- package/language/FWLanguageLabelLocalize.ts.meta +10 -0
- package/language/FWLanguageSkeletonLocalize.ts +106 -0
- package/language/FWLanguageSkeletonLocalize.ts.meta +10 -0
- package/language/FWLanguageSpriteLocalize.ts +81 -0
- package/language/FWLanguageSpriteLocalize.ts.meta +10 -0
- package/language.meta +13 -0
- package/layer/FWLayer.ts +13 -0
- package/layer/FWLayer.ts.meta +10 -0
- package/layer.meta +13 -0
- package/log/FWLog.ts +115 -0
- package/log/FWLog.ts.meta +10 -0
- package/log.meta +13 -0
- package/logic/FWLogic.ts +10 -0
- package/logic/FWLogic.ts.meta +10 -0
- package/logic.meta +13 -0
- package/machine/FWAnimationMachine.ts +28 -0
- package/machine/FWAnimationMachine.ts.meta +10 -0
- package/machine/FWStateMachine.ts +75 -0
- package/machine/FWStateMachine.ts.meta +10 -0
- package/machine.meta +13 -0
- package/manager/FWAnimationManager.ts +128 -0
- package/manager/FWAnimationManager.ts.meta +10 -0
- package/manager/FWAssetManager.ts +349 -0
- package/manager/FWAssetManager.ts.meta +10 -0
- package/manager/FWAudioManager.ts +289 -0
- package/manager/FWAudioManager.ts.meta +10 -0
- package/manager/FWBundleManager.ts +91 -0
- package/manager/FWBundleManager.ts.meta +10 -0
- package/manager/FWComponentManager.ts +25 -0
- package/manager/FWComponentManager.ts.meta +10 -0
- package/manager/FWEngineManager.ts +63 -0
- package/manager/FWEngineManager.ts.meta +10 -0
- package/manager/FWEventManager.ts +275 -0
- package/manager/FWEventManager.ts.meta +10 -0
- package/manager/FWHotUpdateManager.ts +213 -0
- package/manager/FWHotUpdateManager.ts.meta +10 -0
- package/manager/FWLanguageManager.ts +116 -0
- package/manager/FWLanguageManager.ts.meta +10 -0
- package/manager/FWLayerManager.ts +490 -0
- package/manager/FWLayerManager.ts.meta +10 -0
- package/manager/FWManager.ts +8 -0
- package/manager/FWManager.ts.meta +10 -0
- package/manager/FWObjectManager.ts +91 -0
- package/manager/FWObjectManager.ts.meta +10 -0
- package/manager/FWResManager.ts +171 -0
- package/manager/FWResManager.ts.meta +10 -0
- package/manager/FWSocketManager.ts +94 -0
- package/manager/FWSocketManager.ts.meta +10 -0
- package/manager/FWStateManager.ts +102 -0
- package/manager/FWStateManager.ts.meta +10 -0
- package/manager/FWTaskManager.ts +38 -0
- package/manager/FWTaskManager.ts.meta +10 -0
- package/manager/FWTimeManager.ts +473 -0
- package/manager/FWTimeManager.ts.meta +10 -0
- package/manager/FWUiManager.ts +164 -0
- package/manager/FWUiManager.ts.meta +10 -0
- package/manager.meta +13 -0
- package/package.json +17 -0
- package/package.json.meta +6 -0
- package/scene/FWScene.ts +25 -0
- package/scene/FWScene.ts.meta +10 -0
- package/scene.meta +13 -0
- package/service/FWService.ts +7 -0
- package/service/FWService.ts.meta +10 -0
- package/service/http/FWHttp.ts +70 -0
- package/service/http/FWHttp.ts.meta +10 -0
- package/service/http.meta +13 -0
- package/service/socket/FWSocket.ts +236 -0
- package/service/socket/FWSocket.ts.meta +10 -0
- package/service/socket/FWSocketHandle.ts +17 -0
- package/service/socket/FWSocketHandle.ts.meta +10 -0
- package/service/socket/FWSocketSender.ts +16 -0
- package/service/socket/FWSocketSender.ts.meta +10 -0
- package/service/socket.meta +13 -0
- package/service.meta +13 -0
- package/state/FWState.ts +8 -0
- package/state/FWState.ts.meta +10 -0
- package/state.meta +13 -0
- package/utils/FWLodash.ts +105 -0
- package/utils/FWLodash.ts.meta +10 -0
- package/utils/FWMask.ts +222 -0
- package/utils/FWMask.ts.meta +10 -0
- package/utils/FWObject.ts +22 -0
- package/utils/FWObject.ts.meta +10 -0
- package/utils/FWObjectPool.ts +178 -0
- package/utils/FWObjectPool.ts.meta +10 -0
- package/utils/FWQueue.ts +47 -0
- package/utils/FWQueue.ts.meta +10 -0
- package/utils/FWTask.ts +223 -0
- package/utils/FWTask.ts.meta +10 -0
- 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,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
|
+
}
|