@cc-component/cc-core 1.2.8 → 1.2.9

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 (157) hide show
  1. package/assets/core/config/CommonEnum.ts +8 -2
  2. package/assets/core/config/CommonEnum.ts.meta +1 -1
  3. package/assets/core/config/IConfig.ts +1 -1
  4. package/assets/core/config/IConfig.ts.meta +1 -1
  5. package/assets/core/config/LayerType.ts.meta +1 -1
  6. package/assets/core/config/LayerUI.ts +14 -12
  7. package/assets/core/config/LayerUI.ts.meta +1 -1
  8. package/assets/core/config.meta +1 -1
  9. package/assets/core/editor/LanguageManager.ts +5 -5
  10. package/assets/core/editor/LanguageManager.ts.meta +1 -1
  11. package/assets/core/editor/SpineRunner.ts.meta +1 -1
  12. package/assets/core/editor/i18nEditorComponent.ts +12 -12
  13. package/assets/core/editor/i18nEditorComponent.ts.meta +1 -1
  14. package/assets/core/editor.meta +1 -1
  15. package/assets/core/home/AudioUtil.ts +5 -11
  16. package/assets/core/home/AudioUtil.ts.meta +1 -1
  17. package/assets/core/home/BaseBoxView.ts +13 -16
  18. package/assets/core/home/BaseBoxView.ts.meta +1 -1
  19. package/assets/core/home/BaseLaunchComponent.ts.meta +1 -1
  20. package/assets/core/home/BaseLoading.ts +34 -18
  21. package/assets/core/home/BaseLoading.ts.meta +1 -1
  22. package/assets/core/home/BaseModuleConfig.ts +46 -0
  23. package/assets/core/home/{ProgessView.ts.meta → BaseModuleConfig.ts.meta} +9 -9
  24. package/assets/core/home/BaseSkeleton.ts +4 -4
  25. package/assets/core/home/BaseSkeleton.ts.meta +1 -1
  26. package/assets/core/home/CameraAngel.ts +41 -41
  27. package/assets/core/home/CameraAngel.ts.meta +1 -1
  28. package/assets/core/home/DouYinShow.ts +1 -1
  29. package/assets/core/home/DouYinShow.ts.meta +1 -1
  30. package/assets/core/home/EventManager.ts +2 -10
  31. package/assets/core/home/EventManager.ts.meta +1 -1
  32. package/assets/core/home/FollowCamera.ts +28 -29
  33. package/assets/core/home/FollowCamera.ts.meta +1 -1
  34. package/assets/core/home/InViewCenter.ts +1 -1
  35. package/assets/core/home/InViewCenter.ts.meta +1 -1
  36. package/assets/core/home/LoadingWindow.ts.meta +1 -1
  37. package/assets/core/home/ParabolaTween.ts.meta +1 -1
  38. package/assets/core/home/ProgessWindow.ts +109 -0
  39. package/assets/core/home/{ExView.ts.meta → ProgessWindow.ts.meta} +1 -1
  40. package/assets/core/home/Quaternion.ts.meta +1 -1
  41. package/assets/core/home/ResUtil.ts.meta +1 -1
  42. package/assets/core/home/ResourceManager.ts +13 -14
  43. package/assets/core/home/ResourceManager.ts.meta +1 -1
  44. package/assets/core/home/StateMachine.ts +9 -9
  45. package/assets/core/home/StateMachine.ts.meta +1 -1
  46. package/assets/core/home/StorageManager.ts +1 -1
  47. package/assets/core/home/StorageManager.ts.meta +1 -1
  48. package/assets/core/home/ThirdFreeLookCamera.ts +2 -2
  49. package/assets/core/home/ThirdFreeLookCamera.ts.meta +1 -1
  50. package/assets/core/home/TimeManager.ts +1 -1
  51. package/assets/core/home/TimeManager.ts.meta +1 -1
  52. package/assets/core/home/Tools.ts +209 -0
  53. package/assets/core/home/Tools.ts.meta +1 -1
  54. package/assets/core/home/util/EncryptUtil.ts.meta +1 -1
  55. package/assets/core/home/util/MathUtil.ts.meta +1 -1
  56. package/assets/core/home/util/Md5.ts.meta +1 -1
  57. package/assets/core/home/util/RandomUtil.ts +41 -41
  58. package/assets/core/home/util/RandomUtil.ts.meta +1 -1
  59. package/assets/core/home/util/ResUtil.ts.meta +1 -1
  60. package/assets/core/home/util/crypto-js.d.ts.meta +1 -1
  61. package/assets/core/home/util/crypto-js.js.meta +1 -1
  62. package/assets/core/home/util.meta +1 -1
  63. package/assets/core/home.meta +1 -1
  64. package/assets/core/interface/App.ts +545 -0
  65. package/assets/core/interface/{MainModule.ts.meta → App.ts.meta} +1 -1
  66. package/assets/core/interface/ISceneParam.ts.meta +1 -1
  67. package/assets/core/interface/Interface.ts +66 -77
  68. package/assets/core/interface/Interface.ts.meta +1 -1
  69. package/assets/core/interface.meta +1 -1
  70. package/assets/core/lib/language/Language.ts +3 -4
  71. package/assets/core/lib/language/Language.ts.meta +1 -1
  72. package/assets/core/lib/language/LanguageData.ts +4 -4
  73. package/assets/core/lib/language/LanguageData.ts.meta +1 -1
  74. package/assets/core/lib/language/LanguageLabel.ts +6 -6
  75. package/assets/core/lib/language/LanguageLabel.ts.meta +1 -1
  76. package/assets/core/lib/language/LanguagePack.ts +8 -9
  77. package/assets/core/lib/language/LanguagePack.ts.meta +1 -1
  78. package/assets/core/lib/language/LanguagePointLabel.ts.meta +1 -1
  79. package/assets/core/lib/language/LanguageSpine.ts +1 -1
  80. package/assets/core/lib/language/LanguageSpine.ts.meta +1 -1
  81. package/assets/core/lib/language/LanguageSprite.ts +7 -7
  82. package/assets/core/lib/language/LanguageSprite.ts.meta +1 -1
  83. package/assets/core/lib/language.meta +1 -1
  84. package/assets/core/lib/logger/ELoggerLevel.ts +0 -12
  85. package/assets/core/lib/logger/ELoggerLevel.ts.meta +1 -1
  86. package/assets/core/lib/logger/MLogger.ts +7 -8
  87. package/assets/core/lib/logger/MLogger.ts.meta +1 -1
  88. package/assets/core/lib/logger.meta +1 -1
  89. package/assets/core/lib/net/libs/proto/output/protobuf.d.ts.meta +1 -1
  90. package/assets/core/lib/net/libs/proto/output/protobuf.min.js.meta +1 -1
  91. package/assets/core/lib/net/libs/proto/output/protobuf_custom.d.ts.meta +1 -1
  92. package/assets/core/lib/net/libs/proto/output/protobuf_custom.js.meta +1 -1
  93. package/assets/core/lib/net/libs/proto/output.meta +1 -1
  94. package/assets/core/lib/net/libs/proto/source/Cmd.proto.meta +1 -1
  95. package/assets/core/lib/net/libs/proto/source/UserLogin.proto.meta +1 -1
  96. package/assets/core/lib/net/libs/proto/source/base.proto.meta +1 -1
  97. package/assets/core/lib/net/libs/proto/source/command.proto.meta +1 -1
  98. package/assets/core/lib/net/libs/proto/source/domain/boos_battle_info.proto.meta +1 -1
  99. package/assets/core/lib/net/libs/proto/source/domain/player_auth.proto.meta +1 -1
  100. package/assets/core/lib/net/libs/proto/source/domain.meta +1 -1
  101. package/assets/core/lib/net/libs/proto/source/message/game_push.proto.meta +1 -1
  102. package/assets/core/lib/net/libs/proto/source/message/game_request.proto.meta +1 -1
  103. package/assets/core/lib/net/libs/proto/source/message/game_response.proto.meta +1 -1
  104. package/assets/core/lib/net/libs/proto/source/message.meta +1 -1
  105. package/assets/core/lib/net/libs/proto/source/push/boss_battle_events.proto.meta +1 -1
  106. package/assets/core/lib/net/libs/proto/source/push.meta +1 -1
  107. package/assets/core/lib/net/libs/proto/source.meta +1 -1
  108. package/assets/core/lib/net/libs/proto.meta +1 -1
  109. package/assets/core/lib/net/libs.meta +1 -1
  110. package/assets/core/lib/net/net/HttpManager.ts +2 -2
  111. package/assets/core/lib/net/net/HttpManager.ts.meta +1 -1
  112. package/assets/core/lib/net/net/NetInterface.ts.meta +1 -1
  113. package/assets/core/lib/net/net/NetManager.ts.meta +1 -1
  114. package/assets/core/lib/net/net/NetNode.ts +16 -17
  115. package/assets/core/lib/net/net/NetNode.ts.meta +1 -1
  116. package/assets/core/lib/net/net/WebSock.ts +1 -2
  117. package/assets/core/lib/net/net/WebSock.ts.meta +1 -1
  118. package/assets/core/lib/net/net/custom/NetChannelManager.ts.meta +1 -1
  119. package/assets/core/lib/net/net/custom/NetConfig.ts.meta +1 -1
  120. package/assets/core/lib/net/net/custom/NetErrorCode.ts.meta +1 -1
  121. package/assets/core/lib/net/net/custom/NetGameTips.ts +8 -9
  122. package/assets/core/lib/net/net/custom/NetGameTips.ts.meta +1 -1
  123. package/assets/core/lib/net/net/custom/NetNodeGame.ts +1 -1
  124. package/assets/core/lib/net/net/custom/NetNodeGame.ts.meta +1 -1
  125. package/assets/core/lib/net/net/custom.meta +1 -1
  126. package/assets/core/lib/net/net/protocol/NetProtocolJson.ts.meta +1 -1
  127. package/assets/core/lib/net/net/protocol/NetProtocolProtobuf.ts.meta +1 -1
  128. package/assets/core/lib/net/net/protocol.meta +1 -1
  129. package/assets/core/lib/net/net.meta +1 -1
  130. package/assets/core/lib/net/prompt.meta +1 -1
  131. package/assets/core/lib/net.meta +1 -1
  132. package/assets/core/lib/old.meta +1 -1
  133. package/assets/core/lib/tabbar/TabBarComponent.ts.meta +1 -1
  134. package/assets/core/lib/tabbar/TabBarController.ts.meta +1 -1
  135. package/assets/core/lib/tabbar/TabBarItem.ts.meta +1 -1
  136. package/assets/core/lib/tabbar.meta +1 -1
  137. package/assets/core/lib.meta +1 -1
  138. package/assets/core.meta +1 -1
  139. package/assets.meta +1 -1
  140. package/index.ts +14 -0
  141. package/index.ts.meta +1 -1
  142. package/package.json +1 -1
  143. package/package.json.meta +1 -1
  144. package/assets/core/home/ExView.ts +0 -9
  145. package/assets/core/home/JsonUtil.ts +0 -102
  146. package/assets/core/home/JsonUtil.ts.meta +0 -9
  147. package/assets/core/home/ProgessView.ts +0 -96
  148. package/assets/core/home/prefabs.meta +0 -12
  149. package/assets/core/interface/MainModule.ts +0 -1019
  150. package/assets/core/lib/Logger.ts +0 -286
  151. package/assets/core/lib/Logger.ts.meta +0 -9
  152. package/assets/core/lib/old/VM2.ts +0 -619
  153. package/assets/core/lib/old/VM2.ts.meta +0 -9
  154. package/assets/core/lib/old/ViewModel.ts +0 -905
  155. package/assets/core/lib/old/ViewModel.ts.meta +0 -9
  156. package/assets/core/lib/old/ViewSearch.ts +0 -125
  157. package/assets/core/lib/old/ViewSearch.ts.meta +0 -9
@@ -2,7 +2,7 @@
2
2
  "ver": "1.2.0",
3
3
  "importer": "directory",
4
4
  "imported": true,
5
- "uuid": "b8e0e668-5502-4e93-a3b1-3e31cdc2a6c4",
5
+ "uuid": "ded0ad88-c80b-4ac2-8e1c-75afc3701fc8",
6
6
  "files": [],
7
7
  "subMetas": {},
8
8
  "userData": {
@@ -0,0 +1,545 @@
1
+ import { Asset, assetManager, AudioClip, Canvas, CCObject, Constructor, director, find, game, instantiate, js, misc, Node, Prefab, resources, Size, tween, UITransform, v3, Vec3, view, Widget } from "cc";
2
+ import { AudioUtil } from "../home/AudioUtil";
3
+ import { BYTEDANCE, DEBUG, EDITOR } from "cc/env";
4
+ import { EventManager } from "../home/EventManager";
5
+ import { ResourceManager } from "../home/ResourceManager";
6
+ import { ISceneParam } from "./ISceneParam";
7
+ import { ParabolaTween } from "../home/ParabolaTween";
8
+ import { Component } from "cc";
9
+ import { isValid } from "cc";
10
+ import { EnvironmentConfig, IConfig } from "../config/IConfig";
11
+ import { LayerUI } from "../config/LayerUI";
12
+ import { Sprite, SpriteFrame, sp } from "cc";
13
+ import { HttpManager, HttpReturn } from "../lib/net/net/HttpManager";
14
+ import { StorageManager } from "../home/StorageManager";
15
+ import { TimeManager } from "../home/TimeManager";
16
+ import { LanguageManager } from "../lib/language/Language";
17
+ import { BundleConfigName, HttpType, IBundleConfig, IExtData, IHttpConfig, IInitConfig, IWindowParam, SystemMessage } from "../config/CommonEnum";
18
+ import { LayerType } from "../config/LayerType";
19
+ import { ELoggerLevel } from "../lib/logger/ELoggerLevel";
20
+ import { SkeletonAnim } from "../home/BaseSkeleton";
21
+
22
+ export class App {
23
+ /**当前bundle */
24
+ static get bundleName(): string { return this.instance._gui.bundleName };
25
+ /**界面层 */
26
+ static get gui(): LayerUI { return this.instance._gui };
27
+ /**网络 */
28
+ static get http(): HttpManager { return this.instance._http };
29
+ /**存储层 */
30
+ static get storage(): StorageManager { return this.instance._storage };
31
+ /**场景参数 */
32
+ static get scenesParm(): ISceneParam { return this.instance._scenesParm };
33
+ /**时间管理 */
34
+ static get time(): TimeManager { return this.instance._timeManager };
35
+ /**多语言模块 */
36
+ static get language(): LanguageManager { return this.instance._language };
37
+ /**消息 */
38
+ static get message(): EventManager { return this.instance._message };
39
+ /**声音 */
40
+ static get sound(): AudioUtil { return this.instance._sound };
41
+
42
+
43
+ _gui: LayerUI;
44
+ _http: HttpManager;
45
+ _storage: StorageManager;
46
+ _scenesParm: ISceneParam = { param: undefined, bundleName: "", sceneName: "", };
47
+ _timeManager: TimeManager;
48
+ _language: LanguageManager;
49
+ _message: EventManager;
50
+ _sound: AudioUtil;
51
+
52
+ private static instance: App | null = null;
53
+ public static get Ins(): App {
54
+ if (!App.instance) { App.instance = new App(); }
55
+ return App.instance;
56
+ }
57
+ private constructor() { }
58
+
59
+ time: number = 0
60
+ private openedWindows: Map<string, Component> = new Map();
61
+ private openedWindowsConfig: Map<string, IBundleConfig> = new Map();
62
+ private openWindowLayer: Map<string, string[]> = new Map();
63
+
64
+ static async InitGameConfig(param: IInitConfig) {
65
+ if (!EDITOR) { if (App.Ins._gui) { return } }
66
+ /**资源下载配置 */
67
+ assetManager.downloader.maxConcurrency = 10;
68
+ assetManager.downloader.maxRequestsPerFrame = 6;
69
+ assetManager.downloader.maxRetryCount = 100
70
+ assetManager.downloader.retryInterval = 2000
71
+ const self = App.Ins;
72
+ // 存储层
73
+ self._storage = new StorageManager();
74
+ /**时间管理器 */
75
+ self._timeManager = new TimeManager();
76
+ self._language = new LanguageManager();
77
+ // 加载资源配置
78
+ self._gui = new LayerUI();
79
+ self._http = new HttpManager();
80
+ self._message = new EventManager();
81
+ self._sound = new AudioUtil();
82
+
83
+ if (EDITOR) { return }//编辑器环境,不执行下面逻辑
84
+ Logger.setLevel(ELoggerLevel.Error);
85
+ await self._gui.loadConfig(param);
86
+ const config: EnvironmentConfig = self._gui.current_config;
87
+ // 免网络
88
+ self._http.server = config.httpServer;
89
+ self._http.timeout = config.httpTimeout;
90
+ console.log("初始化完成")
91
+ }
92
+
93
+ static OpenLoading(is_show: boolean) {
94
+ if (is_show) App.gui.loading_call.open?.(() => { })
95
+ else App.gui.loading_call.close?.()
96
+ App.OpenBlockEvents(LayerType.LayerBlockEventsUI, is_show)
97
+ }
98
+
99
+ /**
100
+ * 加载资源并自动记录
101
+ * @param bundleName Bundle 名称
102
+ * @param path 资源路径
103
+ * @param type 资源类型
104
+ * @returns 加载的资源
105
+ */
106
+ public static GetAsset<T extends Asset>(bundleName: string, path: string, type?: { new(): T }): T { return ResourceManager.getAsset(bundleName, path, type) }
107
+ public static async LoadAsset<T extends Asset>(bundleName: string, path: string, type: { new(): T }): Promise<T> { return ResourceManager.loadAsset(bundleName, path, type) }
108
+ static ReleaseAssetsByBundle(bundleName: string) { ResourceManager.instance.releaseAssetsByBundle(bundleName); }
109
+ static ReleaseAsset(bundleName: string, node: Node) { ResourceManager.instance.releaseAsset(node, bundleName) }
110
+ static ReleaseAssetPath(path: string, bundleName: string): void { ResourceManager.instance.releaseAssetPath(path, bundleName) }
111
+ static async PreloadDir(bundleName: string, dirName: string, pre: Function) { return ResourceManager.preloadDir(bundleName, dirName, pre) }
112
+ static async LoadDir(bundleName: string, dirName: string, type: any, pre: Function) { return ResourceManager.loadDir(bundleName, dirName, type, pre) }
113
+
114
+ //音乐
115
+ static async PlayOneShot(sound: AudioClip | string, volume: number = 1) { this.sound.playOneShot(sound, volume) }
116
+ static async Play(sound: AudioClip | string, volume: number = 1.0) { this.sound.play(sound, volume) }
117
+ static async Stop() { this.sound.stop() }
118
+ static async Pause() { this.sound.pause() }
119
+ static async Resume() { this.sound.resume() }
120
+ static MusicVolume(volume: number) { this.sound.music_volume = volume }
121
+ static SoundVolume(volume: number) { this.sound.sound_volume = volume }
122
+ static GetMusicVolume() { return this.sound.music_volume }
123
+ static GetSoundVolume() { return this.sound.sound_volume }
124
+
125
+ /**
126
+ * ================事件===================
127
+ */
128
+ static Emit(eventName: string, params: any) { this.message.emit(eventName, params); }
129
+ static On(eventName: string, callback: any, target?: any) { this.message.on(eventName, callback, target); }
130
+ static Off(eventName: string, callback?: any, target?: any) { this.message.off(eventName, callback, target); }
131
+ static OffAll(target: any) { this.message.OffAll(target); }
132
+
133
+ //#region 监听模块消息
134
+ static OnRequstNet(param: { open: (finish: (isOk: boolean) => void) => void }) { App.http.open = param.open; }
135
+ static OnLoading(param: { open: (finish: () => void) => void, close: () => void }) { App.gui.loading_call = param; }
136
+ static OnProgess(param: { open: (finish: () => void) => void, close: () => void, progess: (progress: number) => void }) { App.gui.progess = param; }
137
+
138
+ static async Requst<T>(config: IHttpConfig, params?: any, ext?: IExtData): Promise<HttpReturn<T>> {
139
+ return new Promise<HttpReturn<any>>(async (originalResolve, originalReject) => {
140
+ let retries = 0; // 当前重试次数
141
+ const maxRetries = 5; // 最大重试次数
142
+ // 内部辅助函数,用于执行请求逻辑
143
+ const attemptRequest = async () => {
144
+ try {
145
+ App.OpenBlockEvents(LayerType.LayerBlockEventsNet, true);
146
+
147
+ const url = App.gui.current_config.httpServer + config.url
148
+ Logger.debug(`${config.type === HttpType.GET ? "GET请求" : "POST请求"} url:${url} `, `\n 参数:`, params);
149
+ let ret: HttpReturn<any>;
150
+ if (config.type === HttpType.GET) {
151
+ ret = await App.http.getJson(config.url, params);
152
+ } else if (config.type === HttpType.POST) {
153
+ ret = await App.http.postJson(config.url, params, ext);
154
+ }
155
+
156
+ Logger.debug(`${config.type === HttpType.GET ? "GET请求" : "POST请求"} 结果 url:${url}\n`, ` 参数:`, params);
157
+ Logger.debug(`返回结果:`, ret.res);
158
+ //Logger.warn(`返回结果:${JSON.stringify(ret.res)}`);
159
+
160
+ App.OpenBlockEvents(LayerType.LayerBlockEventsNet, false);
161
+ if (ret.isSucc) {
162
+ originalResolve(ret.res); // 请求成功,调用原始 resolve
163
+ } else {
164
+ throw new Error(ret.err); // 请求失败,抛出错误以触发重试逻辑
165
+ }
166
+ } catch (error) {
167
+ console.error(`请求失败: ${error.message}`);
168
+ retries++;
169
+
170
+ if (retries > maxRetries) {
171
+ console.error("达到最大重试次数,请求失败");
172
+ originalReject(error); // 达到最大重试次数后调用原始 reject
173
+ return;
174
+ }
175
+
176
+ if (ext && ext.is_show_alert || (ext === undefined || ext.is_show_alert === undefined)) {
177
+
178
+ const userChoice = await new Promise<boolean>((resolve) => {
179
+ const finish = (isOk: boolean) => { resolve(isOk) }
180
+ App.http.open?.(finish)
181
+ //param.callBack = (isOk: boolean) => resolve(isOk);
182
+ });
183
+
184
+ if (!userChoice) {
185
+ Logger.debug("用户取消请求");
186
+ originalReject("取消了"); // 用户取消,调用原始 reject
187
+ return;
188
+ }
189
+ }
190
+ App.OpenBlockEvents(LayerType.LayerBlockEventsNet, true);
191
+ // 继续重试,但避免直接递归调用
192
+ setTimeout(attemptRequest, 100); // 使用 setTimeout 避免栈溢出
193
+ }
194
+ };
195
+ // 开始第一次请求
196
+ attemptRequest();
197
+ });
198
+ }
199
+
200
+
201
+ static async OpenWindow<T extends Component>(config: IBundleConfig, param?: IWindowParam): Promise<T> {
202
+ return new Promise<T>(async (resolve, reject) => {
203
+ try {
204
+ const className = config.name ?? config.path.split('/').pop();
205
+ if (App.IsWindowOpen(className)) {
206
+ const view = App.GetOpenWindow<Component>(config);
207
+ resolve(view as T);
208
+ //延迟100毫秒防止连点
209
+ setTimeout(() => { App.OpenBlockEvents(LayerType.LayerBlockEventsUI, false) }, 100);
210
+ return;
211
+ }
212
+ else if (App.IsWindowOpen(className)) {
213
+ Logger.warn("重复打开窗口-请检查", config.path)
214
+ return;
215
+ }
216
+ //console.error('打开:', Array.from(App.Instance.openedWindows.keys()), config.path);
217
+ App.OpenBlockEvents(LayerType.LayerBlockEventsUI, true)
218
+ if (!param) {
219
+ param = {}
220
+ }
221
+ const call = param?.callBack;
222
+ const backCallback = (arg1: any, arg2: any) => {
223
+ call?.(arg1, arg2)
224
+ }
225
+ if (param instanceof Object)
226
+ param.callBack = backCallback;
227
+
228
+ const view = await App.LoadWindow<T>(config, param);
229
+
230
+ App.gui.GetLayer(config.layer).addChild(view.node);
231
+
232
+ // 添加关闭事件监听
233
+ App.Ins.setupCloseListener(view, className);
234
+
235
+ if (config.is_load_sub) {
236
+ (view as any).root.active = false;
237
+ await new Promise<void>((resolve, reject) => { (view as any).finish_sub = resolve; });
238
+ (view as any).root.active = true;
239
+ }
240
+
241
+ view.node.getComponent(Widget)?.updateAlignment();
242
+
243
+ //隐藏底层的UI
244
+ App.instance.ShowLayerUI(config, false)
245
+ //收集打开的窗口
246
+ if (!App.Ins.openWindowLayer.has(config.layer)) {
247
+ App.Ins.openWindowLayer.set(config.layer, []);//LayerUI层
248
+ }
249
+ const list = App.Ins.openWindowLayer.get(config.layer)
250
+ list.push(className);
251
+ const layerUI_list = App.Ins.openWindowLayer.get(LayerType.LayerUI)
252
+ if (layerUI_list && layerUI_list.length > 0) App.gui.GetLayer(LayerType.LayerGame).active = false;
253
+ Logger.debug('LayerType.LayerUI 打开窗口记录:', className, list);
254
+ App.Emit(SystemMessage.OpenWindow, className)
255
+
256
+ resolve(view);
257
+ //延迟100毫秒防止连点
258
+ setTimeout(() => { App.OpenBlockEvents(LayerType.LayerBlockEventsUI, false) }, 100);
259
+ } catch (error) {
260
+ console.error("打开窗口失败:", error);
261
+ App.CloseLoading()
262
+ reject(error);
263
+ }
264
+ });
265
+ }
266
+
267
+ static async LoadWindow<T extends Component>(config: IBundleConfig, param?: IWindowParam): Promise<T> {
268
+ return new Promise<T>(async (resolve, reject) => {
269
+ try {
270
+ const className = config.name ?? config.path.split('/').pop();
271
+ // 记录打开的窗口--先占位
272
+ if (config.is_record === undefined || config.is_record) {//默认记录
273
+ App.Ins.openedWindows.set(className, null);
274
+ App.Ins.openedWindowsConfig.set(className, config);
275
+ }
276
+ //await Await(1000)
277
+ const prefab = await ResourceManager.loadAsset<Prefab>(config.bundle, config.path)
278
+ const node = instantiate(prefab);
279
+
280
+ const view = ((node.getComponent(className)) || (node.addComponent(className))) as T;
281
+ if (config.is_record === undefined || config.is_record) {//默认记录
282
+ App.Ins.openedWindows.set(className, view);
283
+ App.Ins.openedWindowsConfig.set(className, config);
284
+ }
285
+ //@ts-ignore
286
+ view.window_name = className;
287
+ //@ts-ignore
288
+ view.config = config;
289
+ //@ts-ignore
290
+ if (param) view.param = param;
291
+ resolve(view);
292
+ } catch (error) {
293
+ console.error("加载窗口失败:", config.path, error);
294
+ reject(error);
295
+ }
296
+ });
297
+ }
298
+
299
+ static async RootWindow<T extends Component>(config: IBundleConfig, param?: IWindowParam): Promise<T> {
300
+ await App.CloseAll([LayerType.LayerUI, LayerType.LayerDialog, LayerType.LayerPopUp])
301
+ return App.OpenWindow(config)
302
+ }
303
+
304
+ static async CloseAll(layer_list: LayerType[]) {
305
+ const windows = App.GetOpenedWindowNames()
306
+ await new Promise<void>((resolve, reject) => {
307
+ //销毁已有的窗口
308
+ const destroyPromises: Promise<void>[] = []; // 用于存储每个销毁事件的 Promise
309
+ windows.forEach(className => {
310
+ const config = App.Ins.openedWindowsConfig.get(className);
311
+ if (layer_list.includes(config.layer)) {
312
+ const view = App.GetOpenWindow<any>(config);
313
+ // 创建一个 Promise 来等待 NODE_DESTROYED 事件完成
314
+ const destroyPromise = new Promise<void>((destroyResolve) => {
315
+ if (view.node && isValid(view.node, true)) {
316
+ view.node.once(Node.EventType.NODE_DESTROYED, () => {
317
+ destroyResolve(); // 当前节点销毁后 resolve
318
+ });
319
+ } else {
320
+ destroyResolve(); // 当前节点销毁后 resolve
321
+ }
322
+ });
323
+ destroyPromises.push(destroyPromise); // 将 Promise 添加到集合中
324
+ if (view && view.node && isValid(view.node, true)) {
325
+ view.node.destroy(); // 关闭窗口
326
+ }
327
+ }
328
+ })
329
+ // 等待所有销毁事件完成后再 resolve 外层 Promise
330
+ Promise.all(destroyPromises).then(() => resolve());
331
+ });
332
+ }
333
+ static OpenBlockEvents(type: LayerType, is_show: boolean) { App.gui.GetLayer(type).active = is_show; }
334
+ static async CloseLoading() {
335
+ App.OpenBlockEvents(LayerType.LayerBlockEventsUI, false)
336
+ App.OpenBlockEvents(LayerType.LayerBlockEventsNet, false)
337
+ }
338
+
339
+ static async OpenScene(param: ISceneParam) {
340
+ App.OpenBlockEvents(LayerType.LayerBlockEventsUI, true)
341
+ await new Promise<void>(resolve => { App.gui.progess?.open?.(() => { resolve() }) })
342
+ //关闭所有窗口
343
+ await App.CloseAll([LayerType.LayerUI, LayerType.LayerDialog, LayerType.LayerPopUp, LayerType.LayerGame])
344
+ App.scenesParm.param = param
345
+ let scene = await ResourceManager.loadScene(param.bundleName, param.sceneName, (pro) => { });
346
+ if (scene) {
347
+ ResourceManager.runScene(scene);
348
+ } else {
349
+ param.error?.("加载场景失败");
350
+ }
351
+ App.OpenBlockEvents(LayerType.LayerBlockEventsUI, false)
352
+ }
353
+
354
+ //#region 记录打开的窗口
355
+ // 关闭指定窗口
356
+ static CloseWindow(className: string): boolean {
357
+ const instance = App.Ins;
358
+ const window = instance.openedWindows.get(className);
359
+ if (window) {
360
+ try {
361
+ // 调用窗口的关闭方法(如果存在)
362
+ if (typeof (window as any).onClose === 'function') {
363
+ (window as any).onClose();
364
+ }
365
+ // 销毁节点
366
+ if (window.node && isValid(window.node, true)) {
367
+ window.node.destroy();
368
+ }
369
+ // 清除记录
370
+ instance.openedWindows.delete(className);
371
+ instance.openedWindowsConfig.delete(className);
372
+ return true;
373
+ } catch (error) {
374
+ console.error(`关闭窗口 ${className} 时出错:`, error);
375
+ return false;
376
+ }
377
+ } else {
378
+ Logger.warn(`窗口 ${className} 未找到或未打开`);
379
+ return false;
380
+ }
381
+ }
382
+
383
+ // 设置窗口关闭监听
384
+ private setupCloseListener(view: Component, className: string) {
385
+ view.node["old_destroy"] = view.node.destroy
386
+ view.node.destroy = () => {
387
+ this.removeWindowRecord(className);
388
+ return view.node["old_destroy"]()
389
+ }
390
+ // 监听节点销毁事件
391
+ // view.node.once(Node.EventType.NODE_DESTROYED, () => {
392
+ // this.removeWindowRecord(className);
393
+ // });
394
+ }
395
+
396
+ ShowLayerUI(config: IBundleConfig, is_show: boolean) {
397
+ if (config.layer === LayerType.LayerUI) {
398
+ const list_layer = App.Ins.openWindowLayer.get(config.layer)
399
+ if (list_layer && list_layer.length > 0) {
400
+ const last_name = list_layer[list_layer.length - 1];
401
+ const com = this.openedWindows.get(last_name);
402
+ if (com && com.isValid) {
403
+ com.node.active = is_show;
404
+ }
405
+ } else {
406
+ App.gui.GetLayer(LayerType.LayerGame).active = true;
407
+ }
408
+ }
409
+ }
410
+ // 移除窗口记录
411
+ private removeWindowRecord(className: string) {
412
+ const config = App.Ins.openedWindowsConfig.get(className);
413
+ const list_layer = App.Ins.openWindowLayer.get(config.layer)
414
+ list_layer.pop();//移除最后一个
415
+ if (config.layer === LayerType.LayerUI) {
416
+ this.ShowLayerUI(config, true)
417
+ }
418
+ Logger.debug('LayerType.LayerUI 移除窗口记录:', className, list_layer);
419
+ this.openedWindows.delete(className);
420
+ this.openedWindowsConfig.delete(className);
421
+ App.Emit(SystemMessage.CloseWindow, className)
422
+ }
423
+
424
+ // 通过配置关闭窗口
425
+ static CloseWindowTarget(config: IBundleConfig): boolean { return App.CloseWindow(config.path.split('/').pop()); }
426
+
427
+ // 关闭所有窗口
428
+ static CloseAllWindows(): number {
429
+ const instance = App.Ins;
430
+ let closedCount = 0;
431
+ // 创建副本以避免在迭代时修改Map
432
+ const windowsToClose = new Array(...instance.openedWindows.entries());
433
+ for (const [className, window] of windowsToClose) {
434
+ if (App.CloseWindow(className)) {
435
+ closedCount++;
436
+ }
437
+ }
438
+ Logger.debug(`共关闭 ${closedCount} 个窗口`);
439
+ return closedCount;
440
+ }
441
+
442
+ // 检查窗口是否已打开
443
+ static IsWindowOpen(className: string): boolean { return App.Ins.openedWindows.has(className); }
444
+ // 获取已打开的窗口实例
445
+ static GetOpenWindow<T extends Component>(config: IBundleConfig): T {
446
+ const className = config.path.split('/').pop();
447
+ const window = App.Ins.openedWindows.get(className);
448
+ return window ? window as T : null;
449
+ }
450
+ // 获取已打开的窗口实例
451
+ static GetOpenWindows<T extends Component>(): T[] { return Array.from(App.Ins.openedWindows.values()) as T[]; }
452
+ // 获取已打开的窗口实例
453
+ static GetOpenWindowsConfig(): IBundleConfig[] { return Array.from(App.Ins.openedWindowsConfig.values()); }
454
+ // 获取所有已打开的窗口名称
455
+ static GetOpenedWindowNames(): string[] { return Array.from(App.Ins.openedWindows.keys()); }
456
+
457
+
458
+ //#region 常用
459
+
460
+ /**播放skpine动画 */
461
+ static PlaySpine(skeleton: sp.Skeleton, animations: { name: string, loop?: boolean, call?: (name?: string) => void, event?: (name?: string) => void }[]) { SkeletonAnim.Play(skeleton, animations); }
462
+
463
+ static LoadSprite(sp: Sprite, params: { path: string, bundle?: string, callback?: () => void }) {
464
+ const path = params.path + '/spriteFrame'
465
+ const bundleName = params ? (params.bundle ?? 'game') : "game"
466
+ const sprite = App.GetAsset<SpriteFrame>(bundleName, path, SpriteFrame)
467
+ if (sprite) {
468
+ if (isValid(sp, true)) {
469
+ sp.spriteFrame = sprite;
470
+ params?.callback?.()
471
+ }
472
+ else {
473
+ Logger.debug("图片已销毁")
474
+ }
475
+ return;
476
+ }
477
+ App.LoadAsset(bundleName, path, SpriteFrame).then((spriteFrame) => {
478
+ if (sp) {
479
+ if (isValid(sp, true)) {
480
+ sp.spriteFrame = spriteFrame;
481
+ params?.callback?.()
482
+ }
483
+ else {
484
+ Logger.debug("图片已销毁")
485
+ }
486
+ }
487
+ })
488
+ }
489
+
490
+
491
+ static LoadSpine(spine: sp.Skeleton, params: { path: string, bundle?: string, callback?: () => void }) {
492
+ const path = params.path
493
+ const bundleName = params ? (params.bundle ?? 'game') : "game"
494
+ const skeletonData = App.GetAsset<sp.SkeletonData>(bundleName, path, sp.SkeletonData)
495
+ if (skeletonData) {
496
+ if (spine) {
497
+ if (isValid(spine, true)) {
498
+ spine.skeletonData = skeletonData;
499
+ params?.callback?.()
500
+ }
501
+ }
502
+ return;
503
+ }
504
+ App.LoadAsset(bundleName, path, sp.SkeletonData).then((skeletonData) => {
505
+ if (spine) {
506
+ if (isValid(spine, true)) {
507
+ spine.skeletonData = skeletonData;
508
+ params?.callback?.()
509
+ }
510
+ else {
511
+ Logger.debug("动画已销毁")
512
+ }
513
+ }
514
+ })
515
+ }
516
+
517
+ //#region 运行补丁
518
+ // 默认实现函数
519
+ static DefaultFunction(param?: any, callBack?: Function) {
520
+ Logger.warn('调用了默认方法,可能该方法未实现', param);
521
+ callBack?.();
522
+ }
523
+ /**
524
+ * 为 target 补全缺失的方法
525
+ * @param target 目标类/对象
526
+ s */
527
+ static RegisterModule(target: any) {
528
+ if (!target) { return }
529
+ const allKeys = Object.keys(target);
530
+ for (const key of allKeys) {
531
+ const desc = Object.getOwnPropertyDescriptor(target, key);
532
+ if (desc?.get || desc?.set) continue; // ✅ 正确跳过 getter/setter
533
+ if (!desc?.writable) continue; // ✅ 跳过只读(防御性)
534
+ if (typeof target[key] !== 'function') { // ⚠️ 问题在这里!
535
+ target[key] = App.DefaultFunction;
536
+ }
537
+ }
538
+ }
539
+ }
540
+
541
+ window.App = App;
542
+
543
+
544
+
545
+
@@ -2,7 +2,7 @@
2
2
  "ver": "4.0.24",
3
3
  "importer": "typescript",
4
4
  "imported": true,
5
- "uuid": "2a625de7-3c1a-46f8-b2a9-4bcf30407cf6",
5
+ "uuid": "c7104320-8366-4695-aecf-60046ff3e79c",
6
6
  "files": [],
7
7
  "subMetas": {},
8
8
  "userData": {}
@@ -2,7 +2,7 @@
2
2
  "ver": "4.0.24",
3
3
  "importer": "typescript",
4
4
  "imported": true,
5
- "uuid": "4daf387d-aef9-46f1-abed-5890401f68f2",
5
+ "uuid": "e7bac7b1-1bef-47e2-b2fd-2fa27b179b73",
6
6
  "files": [],
7
7
  "subMetas": {},
8
8
  "userData": {}