@kkarum/framework 2.3.17

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 (171) hide show
  1. package/Framework.ts +337 -0
  2. package/Framework.ts.meta +10 -0
  3. package/FrameworkBase.ts +207 -0
  4. package/FrameworkBase.ts.meta +10 -0
  5. package/FrameworkInitialize.ts +79 -0
  6. package/FrameworkInitialize.ts.meta +10 -0
  7. package/README.md +93 -0
  8. package/README.md.meta +6 -0
  9. package/animation/FWAnimation.ts +13 -0
  10. package/animation/FWAnimation.ts.meta +10 -0
  11. package/animation/FWSkeleton.ts +174 -0
  12. package/animation/FWSkeleton.ts.meta +10 -0
  13. package/animation/FWTween.ts +60 -0
  14. package/animation/FWTween.ts.meta +10 -0
  15. package/animation.meta +13 -0
  16. package/component/FWVirtuaScrollViewComponent.ts +56 -0
  17. package/component/FWVirtuaScrollViewComponent.ts.meta +10 -0
  18. package/component/FWVirtualViewComponent.ts +2212 -0
  19. package/component/FWVirtualViewComponent.ts.meta +10 -0
  20. package/component.meta +13 -0
  21. package/config/FWAssetConfig.ts +7 -0
  22. package/config/FWAssetConfig.ts.meta +10 -0
  23. package/config/FWSystemConfig.ts +29 -0
  24. package/config/FWSystemConfig.ts.meta +10 -0
  25. package/config.meta +13 -0
  26. package/controller/FWLayerController.ts +178 -0
  27. package/controller/FWLayerController.ts.meta +10 -0
  28. package/controller.meta +13 -0
  29. package/data/FWData.ts +6 -0
  30. package/data/FWData.ts.meta +10 -0
  31. package/data.meta +13 -0
  32. package/define/FWEventDefine.ts +28 -0
  33. package/define/FWEventDefine.ts.meta +10 -0
  34. package/define/FWSystemDefine.ts +154 -0
  35. package/define/FWSystemDefine.ts.meta +10 -0
  36. package/define.meta +13 -0
  37. package/entry/FWEntry.ts +219 -0
  38. package/entry/FWEntry.ts.meta +10 -0
  39. package/entry.meta +13 -0
  40. package/expand/FWCocosExpand.ts +73 -0
  41. package/expand/FWCocosExpand.ts.meta +10 -0
  42. package/expand/FWDecorator.ts +366 -0
  43. package/expand/FWDecorator.ts.meta +10 -0
  44. package/expand/FWNodeExpand.ts +147 -0
  45. package/expand/FWNodeExpand.ts.meta +10 -0
  46. package/expand/FWRollingViewNesting.ts +195 -0
  47. package/expand/FWRollingViewNesting.ts.meta +10 -0
  48. package/expand/FWTweenExpand.ts +44 -0
  49. package/expand/FWTweenExpand.ts.meta +10 -0
  50. package/expand.meta +13 -0
  51. package/item/FWVirtualListItem.ts +141 -0
  52. package/item/FWVirtualListItem.ts.meta +10 -0
  53. package/item.meta +13 -0
  54. package/language/FWLanguage.ts +71 -0
  55. package/language/FWLanguage.ts.meta +10 -0
  56. package/language/FWLanguageLabelLocalize.ts +144 -0
  57. package/language/FWLanguageLabelLocalize.ts.meta +10 -0
  58. package/language/FWLanguageSkeletonLocalize.ts +106 -0
  59. package/language/FWLanguageSkeletonLocalize.ts.meta +10 -0
  60. package/language/FWLanguageSpriteLocalize.ts +81 -0
  61. package/language/FWLanguageSpriteLocalize.ts.meta +10 -0
  62. package/language.meta +13 -0
  63. package/layer/FWLayer.ts +14 -0
  64. package/layer/FWLayer.ts.meta +10 -0
  65. package/layer.meta +13 -0
  66. package/log/FWLog.ts +135 -0
  67. package/log/FWLog.ts.meta +10 -0
  68. package/log.meta +13 -0
  69. package/logic/FWLogic.ts +6 -0
  70. package/logic/FWLogic.ts.meta +10 -0
  71. package/logic.meta +13 -0
  72. package/machine/FWAnimationMachine.ts +28 -0
  73. package/machine/FWAnimationMachine.ts.meta +10 -0
  74. package/machine/FWStateMachine.ts +74 -0
  75. package/machine/FWStateMachine.ts.meta +10 -0
  76. package/machine.meta +13 -0
  77. package/manager/FWAnimationManager.ts +89 -0
  78. package/manager/FWAnimationManager.ts.meta +10 -0
  79. package/manager/FWAssetManager.ts +451 -0
  80. package/manager/FWAssetManager.ts.meta +10 -0
  81. package/manager/FWAudioManager.ts +339 -0
  82. package/manager/FWAudioManager.ts.meta +10 -0
  83. package/manager/FWBundleManager.ts +97 -0
  84. package/manager/FWBundleManager.ts.meta +10 -0
  85. package/manager/FWComponentManager.ts +24 -0
  86. package/manager/FWComponentManager.ts.meta +10 -0
  87. package/manager/FWEngineManager.ts +74 -0
  88. package/manager/FWEngineManager.ts.meta +10 -0
  89. package/manager/FWEventManager.ts +361 -0
  90. package/manager/FWEventManager.ts.meta +10 -0
  91. package/manager/FWHotUpdateManager.ts +344 -0
  92. package/manager/FWHotUpdateManager.ts.meta +10 -0
  93. package/manager/FWLanguageManager.ts +114 -0
  94. package/manager/FWLanguageManager.ts.meta +10 -0
  95. package/manager/FWLayerManager.ts +862 -0
  96. package/manager/FWLayerManager.ts.meta +10 -0
  97. package/manager/FWManager.ts +9 -0
  98. package/manager/FWManager.ts.meta +10 -0
  99. package/manager/FWObjectManager.ts +161 -0
  100. package/manager/FWObjectManager.ts.meta +10 -0
  101. package/manager/FWPerformanceManager.ts +198 -0
  102. package/manager/FWPerformanceManager.ts.meta +10 -0
  103. package/manager/FWPromiseManager.ts +504 -0
  104. package/manager/FWPromiseManager.ts.meta +10 -0
  105. package/manager/FWResManager.ts +299 -0
  106. package/manager/FWResManager.ts.meta +10 -0
  107. package/manager/FWSocketManager.ts +93 -0
  108. package/manager/FWSocketManager.ts.meta +10 -0
  109. package/manager/FWStateManager.ts +100 -0
  110. package/manager/FWStateManager.ts.meta +10 -0
  111. package/manager/FWTaskManager.ts +41 -0
  112. package/manager/FWTaskManager.ts.meta +10 -0
  113. package/manager/FWTimeManager.ts +442 -0
  114. package/manager/FWTimeManager.ts.meta +10 -0
  115. package/manager/FWUiManager.ts +217 -0
  116. package/manager/FWUiManager.ts.meta +10 -0
  117. package/manager.meta +13 -0
  118. package/package.json +11 -0
  119. package/package.json.meta +6 -0
  120. package/registry/FWRegistry.ts +62 -0
  121. package/registry/FWRegistry.ts.meta +10 -0
  122. package/registry.meta +13 -0
  123. package/render/FWRenderAssembler.ts +620 -0
  124. package/render/FWRenderAssembler.ts.meta +10 -0
  125. package/render.meta +13 -0
  126. package/scene/FWScene.ts +23 -0
  127. package/scene/FWScene.ts.meta +10 -0
  128. package/scene.meta +13 -0
  129. package/service/FWService.ts +11 -0
  130. package/service/FWService.ts.meta +10 -0
  131. package/service/http/FWHttp.ts +103 -0
  132. package/service/http/FWHttp.ts.meta +10 -0
  133. package/service/http.meta +13 -0
  134. package/service/socket/FWSocket.ts +367 -0
  135. package/service/socket/FWSocket.ts.meta +10 -0
  136. package/service/socket/FWSocketHandle.ts +16 -0
  137. package/service/socket/FWSocketHandle.ts.meta +10 -0
  138. package/service/socket/FWSocketSender.ts +14 -0
  139. package/service/socket/FWSocketSender.ts.meta +10 -0
  140. package/service/socket/mock/FWSocketMock.ts +202 -0
  141. package/service/socket/mock/FWSocketMock.ts.meta +10 -0
  142. package/service/socket/mock.meta +13 -0
  143. package/service/socket.meta +13 -0
  144. package/service.meta +13 -0
  145. package/state/FWState.ts +8 -0
  146. package/state/FWState.ts.meta +10 -0
  147. package/state.meta +13 -0
  148. package/types/Creator.d.ts +121 -0
  149. package/types/Creator.d.ts.meta +6 -0
  150. package/types/FW.d.ts +3016 -0
  151. package/types/FW.d.ts.meta +6 -0
  152. package/types/Global.d.ts +22 -0
  153. package/types/Global.d.ts.meta +10 -0
  154. package/types.meta +13 -0
  155. package/utils/FWLodash.ts +105 -0
  156. package/utils/FWLodash.ts.meta +10 -0
  157. package/utils/FWMask.ts +222 -0
  158. package/utils/FWMask.ts.meta +10 -0
  159. package/utils/FWObject.ts +27 -0
  160. package/utils/FWObject.ts.meta +10 -0
  161. package/utils/FWObjectPool.ts +177 -0
  162. package/utils/FWObjectPool.ts.meta +10 -0
  163. package/utils/FWQueue.ts +55 -0
  164. package/utils/FWQueue.ts.meta +10 -0
  165. package/utils/FWResLoader.ts +139 -0
  166. package/utils/FWResLoader.ts.meta +10 -0
  167. package/utils/FWTask.ts +227 -0
  168. package/utils/FWTask.ts.meta +10 -0
  169. package/utils/FWUtils.ts +15 -0
  170. package/utils/FWUtils.ts.meta +10 -0
  171. package/utils.meta +13 -0
@@ -0,0 +1,339 @@
1
+ import { FWManager } from './FWManager';
2
+
3
+ class FWAudioData {
4
+ clip: cc.AudioClip;
5
+ volume: number = 1;
6
+ loop: boolean = false;
7
+ cb?: (id: number) => void;
8
+ tag?: string;
9
+ }
10
+
11
+ class FWAudioPoolItem {
12
+ constructor(
13
+ public audioId: number,
14
+ public startTime: number,
15
+ public tag?: string,
16
+ ) {}
17
+ }
18
+
19
+ export default class FWAudioManager extends FWManager implements FW.AudioManager {
20
+ musicVolume: number = 1;
21
+ effectsVolume: number = 1;
22
+ soundVolume: number = 1;
23
+
24
+ private audioPool: Map<number, FWAudioPoolItem> = new Map();
25
+ private maxConcurrentAudio: number = 1000;
26
+ private cleanupInterval: number = 5;
27
+
28
+ public initialize(): void {
29
+ this.autoClear();
30
+ }
31
+
32
+ /**
33
+ * 播放背景音乐
34
+ */
35
+ async playMusic(path: string, volume?: number, loop?: boolean): Promise<void>;
36
+ async playMusic(music: cc.AudioClip, volume?: number, loop?: boolean): Promise<void>;
37
+ async playMusic(assetProperty: FW.AssetProperty, volume?: number, loop?: boolean): Promise<void>;
38
+ async playMusic(): Promise<void> {
39
+ try {
40
+ const audioData = await this.processAudioArguments(
41
+ arguments,
42
+ FW.SystemDefine.FWAudioType.MUSIC,
43
+ );
44
+ if (!audioData.clip) return;
45
+
46
+ const volume = audioData.volume ?? this.musicVolume;
47
+ const loop = audioData.loop ?? true;
48
+
49
+ cc.audioEngine.stopMusic();
50
+ const id = cc.audioEngine.playMusic(audioData.clip, loop);
51
+ cc.audioEngine.setVolume(id, volume);
52
+
53
+ FW.Log.debug(`播放背景音乐: ${this.getAudioName(audioData.clip)}`);
54
+ } catch (e) {
55
+ FW.Log.error('播放音乐失败:', e);
56
+ }
57
+ }
58
+
59
+ stopMusic(): void {
60
+ cc.audioEngine.stopMusic();
61
+ }
62
+
63
+ pauseMusic(): void {
64
+ cc.audioEngine.pauseMusic();
65
+ }
66
+
67
+ resumeMusic(): void {
68
+ cc.audioEngine.resumeMusic();
69
+ }
70
+
71
+ /** 设置背景音效是否静音 */
72
+ setMusicMute(mute: boolean): void {
73
+ this.musicVolume = mute ? 0 : 1;
74
+ cc.audioEngine.setMusicVolume(this.musicVolume);
75
+ }
76
+
77
+ /**
78
+ * 播放音效
79
+ */
80
+ async play(
81
+ path: string,
82
+ cb?: (id: number) => void,
83
+ volume?: number,
84
+ loop?: boolean,
85
+ tag?: string,
86
+ ): Promise<number>;
87
+ async play(
88
+ audio: cc.AudioClip,
89
+ cb?: (id: number) => void,
90
+ volume?: number,
91
+ loop?: boolean,
92
+ tag?: string,
93
+ ): Promise<number>;
94
+ async play(
95
+ assetProperty: FW.AssetProperty,
96
+ cb?: (id: number) => void,
97
+ volume?: number,
98
+ loop?: boolean,
99
+ tag?: string,
100
+ ): Promise<number>;
101
+ async play(): Promise<number> {
102
+ if (this.audioPool.size >= this.maxConcurrentAudio) {
103
+ this.clearFinishedAudio();
104
+ if (this.audioPool.size >= this.maxConcurrentAudio) {
105
+ FW.Log.warn('音频池已满,无法播放新音频');
106
+ return -1;
107
+ }
108
+ }
109
+
110
+ const audioData = await this.processAudioArguments(
111
+ arguments,
112
+ FW.SystemDefine.FWAudioType.SOUND,
113
+ );
114
+ if (!audioData.clip) return -1;
115
+
116
+ try {
117
+ return new Promise<number>(async (resolve, reject) => {
118
+ const volume = (audioData.volume ?? this.soundVolume) * this.effectsVolume;
119
+ const loop = audioData.loop ?? false;
120
+ const tag = audioData.tag;
121
+
122
+ const id = cc.audioEngine.play(audioData.clip, loop, volume);
123
+
124
+ this.audioPool.set(id, new FWAudioPoolItem(id, Date.now(), tag));
125
+
126
+ cc.audioEngine.setFinishCallback(id, () => {
127
+ audioData.cb?.(id);
128
+ resolve(id);
129
+ this.audioPool.delete(id);
130
+ });
131
+
132
+ return id;
133
+ });
134
+ } catch (e) {
135
+ FW.Log.error('播放音效失败:', e);
136
+ return -1;
137
+ }
138
+ }
139
+
140
+ /**
141
+ * 停止指定音效
142
+ */
143
+ stop(id: number): void {
144
+ if (this.audioPool.has(id)) {
145
+ cc.audioEngine.stop(id);
146
+ this.audioPool.delete(id);
147
+ FW.Log.debug(`停止音效: ID ${id}`);
148
+ }
149
+ }
150
+
151
+ pauseAll(): void {
152
+ cc.audioEngine.pauseAll();
153
+ FW.Log.debug('暂停所有音效');
154
+ }
155
+
156
+ resumeAll(): void {
157
+ cc.audioEngine.resumeAll();
158
+ FW.Log.debug('恢复所有音效');
159
+ }
160
+
161
+ stopAll(): void {
162
+ cc.audioEngine.stopAll();
163
+ this.audioPool.clear();
164
+ FW.Log.debug('停止所有音效');
165
+ }
166
+
167
+ /** 设置播放音效是否静音 */
168
+ setSoundMute(mute: boolean): void {
169
+ this.soundVolume = mute ? 0 : 1;
170
+ FW.Log.debug(`音效${mute ? '静音' : '取消静音'}`);
171
+ }
172
+
173
+ /**
174
+ * 预加载音频资源
175
+ */
176
+ async preloadAudio(assetProperty: FW.AssetProperty): Promise<cc.AudioClip> {
177
+ try {
178
+ let clip: cc.AudioClip;
179
+
180
+ if (typeof assetProperty === 'string') {
181
+ clip = await FW.Entry.resMgr.loadAsset<cc.AudioClip>({
182
+ path: assetProperty,
183
+ bundle: FW.Entry.bundleName,
184
+ });
185
+ } else {
186
+ clip = await FW.Entry.resMgr.loadAsset<cc.AudioClip>(assetProperty);
187
+ }
188
+
189
+ return clip;
190
+ } catch (e) {
191
+ return null;
192
+ }
193
+ }
194
+
195
+ /**
196
+ * 释放音频资源
197
+ */
198
+ releaseAudio(assetProperty: FW.AssetProperty): void {
199
+ FW.Entry.resMgr.releaseAsset(assetProperty);
200
+ }
201
+
202
+ /**
203
+ * 获取音频池信息
204
+ */
205
+ getAudioPoolInfo(): { playing: number; maxConcurrent: number } {
206
+ return {
207
+ playing: this.audioPool.size,
208
+ maxConcurrent: this.maxConcurrentAudio,
209
+ };
210
+ }
211
+
212
+ /**
213
+ * 设置最大并发音频数
214
+ */
215
+ setMaxConcurrentAudio(max: number): void {
216
+ this.maxConcurrentAudio = Math.max(1, max);
217
+ }
218
+
219
+ /**
220
+ * 根据标签停止音效
221
+ */
222
+ stopByTag(tag: string): void {
223
+ const arr: number[] = [];
224
+
225
+ this.audioPool.forEach((item, id) => {
226
+ if (item.tag === tag) {
227
+ arr.push(id);
228
+ }
229
+ });
230
+
231
+ arr.forEach((id) => {
232
+ this.stop(id);
233
+ });
234
+ }
235
+
236
+ /**
237
+ * 处理音频参数
238
+ */
239
+ private async processAudioArguments(
240
+ args: IArguments,
241
+ type: FW.SystemDefine.FWAudioType,
242
+ ): Promise<FWAudioData> {
243
+ const audioData = new FWAudioData();
244
+ const argsArray = Array.from(args);
245
+
246
+ if (argsArray[0] instanceof cc.AudioClip) {
247
+ audioData.clip = argsArray[0];
248
+ } else {
249
+ const assetProperty = this.normalizeAssetProperty(argsArray[0]);
250
+ audioData.clip = await this.loadAudioClip(assetProperty);
251
+ }
252
+
253
+ if (type === FW.SystemDefine.FWAudioType.MUSIC) {
254
+ audioData.volume = argsArray[1];
255
+ audioData.loop = argsArray[2];
256
+ } else {
257
+ audioData.cb = argsArray[1];
258
+ audioData.volume = argsArray[2];
259
+ audioData.loop = argsArray[3];
260
+ audioData.tag = argsArray[4];
261
+ }
262
+
263
+ return audioData;
264
+ }
265
+
266
+ /**
267
+ * 标准化资源属性
268
+ */
269
+ private normalizeAssetProperty(input: any): FW.AssetProperty {
270
+ if (typeof input === 'string') {
271
+ return {
272
+ path: input,
273
+ bundle: FW.Entry.bundleName,
274
+ };
275
+ }
276
+ return input;
277
+ }
278
+
279
+ /**
280
+ * 加载音频片段
281
+ */
282
+ private async loadAudioClip(assetProperty: FW.AssetProperty): Promise<cc.AudioClip> {
283
+ try {
284
+ return await FW.Entry.resMgr.loadAsset<cc.AudioClip>(assetProperty);
285
+ } catch (e) {
286
+ return null;
287
+ }
288
+ }
289
+
290
+ /**
291
+ * 生成缓存键
292
+ */
293
+ private getCacheKey(assetProperty: FW.AssetProperty): string {
294
+ if (typeof assetProperty === 'string') {
295
+ return `${FW.Entry.bundleName}_${assetProperty}`;
296
+ }
297
+ return `${assetProperty.bundle || FW.Entry.bundleName}_${assetProperty.path}`;
298
+ }
299
+
300
+ /**
301
+ * 获取音频名称
302
+ */
303
+ private getAudioName(clip: cc.AudioClip): string {
304
+ return clip.name || '未知音频';
305
+ }
306
+
307
+ /**
308
+ * 清理已完成的音频
309
+ */
310
+ private clearFinishedAudio(): void {
311
+ const currentTime = Date.now();
312
+ const maxAge = 30000;
313
+
314
+ this.audioPool.forEach((item, id) => {
315
+ if (!cc.audioEngine.getState(id)) {
316
+ this.audioPool.delete(id);
317
+ } else if (currentTime - item.startTime > maxAge) {
318
+ FW.Log.warn(`强制停止超时音频: ID ${id}`);
319
+ this.stop(id);
320
+ }
321
+ });
322
+ }
323
+
324
+ /**
325
+ * 启动自动清理
326
+ */
327
+ private autoClear(): void {
328
+ FW.Entry.timeMgr.schedule(
329
+ this.clearFinishedAudio,
330
+ this.cleanupInterval,
331
+ cc.macro.REPEAT_FOREVER,
332
+ this,
333
+ );
334
+ }
335
+
336
+ public onDestroy(): void {
337
+ this.stopAll();
338
+ }
339
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "ver": "1.1.0",
3
+ "uuid": "c7cec874-a219-4fc7-aadf-c1e7a95d3fa0",
4
+ "importer": "typescript",
5
+ "isPlugin": false,
6
+ "loadPluginInWeb": true,
7
+ "loadPluginInNative": true,
8
+ "loadPluginInEditor": false,
9
+ "subMetas": {}
10
+ }
@@ -0,0 +1,97 @@
1
+ import { FWManager } from "./FWManager";
2
+ import { FWSystemConfig } from "../config/FWSystemConfig";
3
+
4
+ export class FWBundleManager extends FWManager implements FW.BundleManager {
5
+ bundleMap: Map<string, cc.AssetManager.Bundle>;
6
+ remoteBundleConfigMap: Map<string, FW.RemoteBundleConfig>;
7
+
8
+ constructor(protected readonly resMgr: FW.ResManager) {
9
+ super();
10
+ }
11
+
12
+ public initialize() {
13
+ this.bundleMap = new Map<string, cc.AssetManager.Bundle>();
14
+ this.remoteBundleConfigMap = new Map<string, FW.RemoteBundleConfig>();
15
+ }
16
+
17
+ public getBundleMap() {
18
+ return this.bundleMap;
19
+ }
20
+
21
+ public getRemoteBundleConfigMap() {
22
+ return this.remoteBundleConfigMap;
23
+ }
24
+
25
+ initializeRemoteBundleConfig(config: FW.RemoteBundleConfig): void {
26
+ this.remoteBundleConfigMap.set(config.bundleName, config);
27
+ }
28
+
29
+ async load(bundleName: string): Promise<cc.AssetManager.Bundle> {
30
+ if (!bundleName) return;
31
+ if (this.bundleMap.has(bundleName)) return this.bundleMap.get(bundleName);
32
+
33
+ return await this.invoke(
34
+ FW.Entry.promiseMgr.execute((resolve, reject, signal) => {
35
+ const remote = this.remoteBundleConfigMap.get(bundleName);
36
+ const url = remote ? remote.url : "";
37
+ const path = `${url}${bundleName}`;
38
+ cc.assetManager.loadBundle(
39
+ path,
40
+ {
41
+ version: this.remoteBundleConfigMap.get(bundleName)?.version || "",
42
+ },
43
+ async (err: Error, bundle: cc.AssetManager.Bundle) => {
44
+ if (err || !bundle) {
45
+ FW.Log.error(`"加载bundle失败:"${bundleName}!`);
46
+ reject(err);
47
+ }
48
+
49
+ FW.Framework.createRegistry(bundleName)?.register();
50
+
51
+ this.bundleMap.set(bundleName, bundle);
52
+
53
+ resolve(bundle);
54
+ }
55
+ );
56
+ }, FWSystemConfig.PromiseConfig.loadBundle).promise,
57
+ `loadBundle -> ${bundleName}`
58
+ );
59
+ }
60
+
61
+ /**
62
+ * 获取bundle
63
+ * @param bundleName
64
+ * @returns
65
+ */
66
+ get(bundleName: string): cc.AssetManager.Bundle {
67
+ if (!this.has(bundleName)) {
68
+ FW.Log.error("获取bundle失败,请先加载!");
69
+ return undefined;
70
+ }
71
+ return this.bundleMap.get(bundleName);
72
+ }
73
+
74
+ /** 释放bundle */
75
+ release(bundleName: string): void {
76
+ if (!this.has(bundleName)) {
77
+ return;
78
+ }
79
+ cc.assetManager.removeBundle(this.bundleMap.get(bundleName));
80
+ this.bundleMap.delete(bundleName);
81
+ FW.Framework.getRegistry(bundleName)?.unRegister();
82
+ FW.Framework.destroyRegistry(bundleName);
83
+ }
84
+
85
+ /**
86
+ * 是否已经加载某个bundle
87
+ * @param bundleName
88
+ * @returns
89
+ */
90
+ has(bundleName: string): boolean {
91
+ return this.bundleMap.has(bundleName);
92
+ }
93
+
94
+ public onDestroy(): void {
95
+ this.bundleMap.clear();
96
+ }
97
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "ver": "1.1.0",
3
+ "uuid": "8f7a5533-19cf-4b9f-a152-ae94b65d3042",
4
+ "importer": "typescript",
5
+ "isPlugin": false,
6
+ "loadPluginInWeb": true,
7
+ "loadPluginInNative": true,
8
+ "loadPluginInEditor": false,
9
+ "subMetas": {}
10
+ }
@@ -0,0 +1,24 @@
1
+ import { FWManager } from './FWManager';
2
+
3
+ export default class FWComponentManager extends FWManager implements FW.ComponentManager {
4
+ public initialize(): void {}
5
+ public onDestroy(): void {}
6
+
7
+ /**
8
+ * 绑定虚拟视图列表
9
+ */
10
+ bindVirtualViewComponent(args: FW.VirtualViewComponentArgs) {
11
+ args.virtualView.onRender = args.onRender?.bind(args.target);
12
+ args.virtualView.onSelected = args.onSelected?.bind(args.target);
13
+ args.virtualView.onPageChange = args.onPageChange?.bind(args.target);
14
+ args.virtualView.count = args.count;
15
+
16
+ if (args.templatePrefab) {
17
+ args.virtualView.templatePrefab = args.templatePrefab;
18
+ }
19
+
20
+ if (args.templateNode) {
21
+ args.virtualView.templateNode = args.templateNode;
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "ver": "1.1.0",
3
+ "uuid": "8a40e7b7-9eb6-4236-96fb-afe4d9429a8a",
4
+ "importer": "typescript",
5
+ "isPlugin": false,
6
+ "loadPluginInWeb": true,
7
+ "loadPluginInNative": true,
8
+ "loadPluginInEditor": false,
9
+ "subMetas": {}
10
+ }
@@ -0,0 +1,74 @@
1
+ import { FWManager } from './FWManager';
2
+
3
+ export default class FWEngineManager extends FWManager implements FW.EngineManager {
4
+ debug: boolean = false;
5
+
6
+ initialize() {
7
+ this.registerCCCSystemEvent();
8
+ }
9
+
10
+ onDestroy(): void {
11
+ cc.game.off(cc.game.EVENT_SHOW, this.onAppShow, this);
12
+ cc.game.off(cc.game.EVENT_HIDE, this.onAppHide, this);
13
+ }
14
+
15
+ restart() {
16
+ if (!launchScene) {
17
+ FW.Log.error('请设置启动场景');
18
+ return;
19
+ }
20
+ FW.Entry.evtMgr.dispatch(FW.EventDefine.SystemEvent.SYSTEM_RESTART);
21
+ FW.Entry.initialize();
22
+ FW.Framework.restart();
23
+ FW.Entry.launchScene(launchScene);
24
+ }
25
+
26
+ getMemory() {
27
+ if (!this.debug) return;
28
+ if (window.performance && window.performance['memory']) {
29
+ FW.Log.debug(
30
+ '浏览器允许的最大内存:',
31
+ this.formatBytes(window.performance['memory'].jsHeapSizeLimit),
32
+ );
33
+ FW.Log.debug(
34
+ '浏览器已分配内存:',
35
+ this.formatBytes(window.performance['memory'].totalJSHeapSize),
36
+ );
37
+ FW.Log.debug(
38
+ '浏览器已使用内存:',
39
+ this.formatBytes(window.performance['memory'].usedJSHeapSize),
40
+ );
41
+ } else {
42
+ FW.Log.debug('当前浏览器不支持 performance.memory');
43
+ }
44
+ }
45
+ /**
46
+ * 注册cocos系统事件
47
+ */
48
+ private registerCCCSystemEvent() {
49
+ cc.game.on(cc.game.EVENT_SHOW, this.onAppShow, this);
50
+ cc.game.on(cc.game.EVENT_HIDE, this.onAppHide, this);
51
+ }
52
+
53
+ /** 应用切换到前台 */
54
+ private onAppShow() {
55
+ FW.Log.debug('game on show!');
56
+ FW.Entry.evtMgr?.dispatch(FW.EventDefine.CCEvent.ON_SHOW);
57
+ }
58
+
59
+ /** 应用切换到后台 */
60
+ private onAppHide() {
61
+ FW.Log.debug('game on hide!');
62
+ FW.Entry.evtMgr?.dispatch(FW.EventDefine.CCEvent.ON_HIDE);
63
+ }
64
+
65
+ private formatBytes(bytes: number) {
66
+ if (bytes < 1024 * 1024) {
67
+ return (bytes / 1024).toFixed(2) + ' KB';
68
+ } else if (bytes < 1024 * 1024 * 1024) {
69
+ return (bytes / 1024 / 1024).toFixed(2) + ' MB';
70
+ } else {
71
+ return (bytes / 1024 / 1024 / 1024).toFixed(2) + ' GB';
72
+ }
73
+ }
74
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "ver": "1.1.0",
3
+ "uuid": "dcaa0ad6-aa1c-4103-9705-2777da3e2e83",
4
+ "importer": "typescript",
5
+ "isPlugin": false,
6
+ "loadPluginInWeb": true,
7
+ "loadPluginInNative": true,
8
+ "loadPluginInEditor": false,
9
+ "subMetas": {}
10
+ }