@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,275 @@
|
|
|
1
|
+
import { FWSystemDefine } from '../define/FWSystemDefine';
|
|
2
|
+
import FWLog from '../log/FWLog';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 观察者
|
|
6
|
+
*/
|
|
7
|
+
class FWObserver implements FW.Observer {
|
|
8
|
+
private pause: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* 构造函数
|
|
11
|
+
* @param eventName 事件名字
|
|
12
|
+
* @param cb 回调函数
|
|
13
|
+
* @param target 观察目标
|
|
14
|
+
*/
|
|
15
|
+
constructor(
|
|
16
|
+
private readonly eventName: string | number,
|
|
17
|
+
private readonly cb: () => void,
|
|
18
|
+
private readonly target: FW.TargetType,
|
|
19
|
+
public readonly priority: number,
|
|
20
|
+
public readonly intercept: boolean,
|
|
21
|
+
) {
|
|
22
|
+
this.cb = cb;
|
|
23
|
+
this.target = target;
|
|
24
|
+
this.pause = false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 消息通知
|
|
29
|
+
* @param args
|
|
30
|
+
*/
|
|
31
|
+
public notify(
|
|
32
|
+
args1?: FW.EventManagerArgs,
|
|
33
|
+
args2?: FW.EventManagerArgs,
|
|
34
|
+
args3?: FW.EventManagerArgs,
|
|
35
|
+
args4?: FW.EventManagerArgs,
|
|
36
|
+
args5?: FW.EventManagerArgs,
|
|
37
|
+
args6?: FW.EventManagerArgs,
|
|
38
|
+
args7?: FW.EventManagerArgs,
|
|
39
|
+
args8?: FW.EventManagerArgs,
|
|
40
|
+
args9?: FW.EventManagerArgs,
|
|
41
|
+
args10?: FW.EventManagerArgs,
|
|
42
|
+
) {
|
|
43
|
+
if (this.pause) return;
|
|
44
|
+
this.cb.call(
|
|
45
|
+
this.target,
|
|
46
|
+
args1,
|
|
47
|
+
args2,
|
|
48
|
+
args3,
|
|
49
|
+
args4,
|
|
50
|
+
args5,
|
|
51
|
+
args6,
|
|
52
|
+
args7,
|
|
53
|
+
args8,
|
|
54
|
+
args9,
|
|
55
|
+
args10,
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 目标比较
|
|
60
|
+
* @param target 目标对象
|
|
61
|
+
* @returns
|
|
62
|
+
*/
|
|
63
|
+
public compar(target: FW.TargetType) {
|
|
64
|
+
return (
|
|
65
|
+
this.target === target || (this.target.uuid && target.uuid && this.target.uuid == target.uuid)
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* 获取当前绑定事件名字
|
|
71
|
+
* @returns
|
|
72
|
+
*/
|
|
73
|
+
public getEventName() {
|
|
74
|
+
return this.eventName;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** 暂停观察 */
|
|
78
|
+
public pauseObserver() {
|
|
79
|
+
this.pause = true;
|
|
80
|
+
}
|
|
81
|
+
/** 恢复观察 */
|
|
82
|
+
public resumeObserver() {
|
|
83
|
+
this.pause = false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* 事件管理器
|
|
89
|
+
*/
|
|
90
|
+
export default class FWEventManager implements FW.EventManager {
|
|
91
|
+
private listeners: { [key: string]: FW.Observer[] } = cc.js.createMap();
|
|
92
|
+
|
|
93
|
+
public initialize(): void {
|
|
94
|
+
this.listeners = cc.js.createMap();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* 事件派发
|
|
99
|
+
* @param eventName 事件名
|
|
100
|
+
* @param args 参数列表
|
|
101
|
+
* @returns
|
|
102
|
+
*/
|
|
103
|
+
public dispatch(
|
|
104
|
+
eventName: string | number,
|
|
105
|
+
args1?: FW.EventManagerArgs,
|
|
106
|
+
args2?: FW.EventManagerArgs,
|
|
107
|
+
args3?: FW.EventManagerArgs,
|
|
108
|
+
args4?: FW.EventManagerArgs,
|
|
109
|
+
args5?: FW.EventManagerArgs,
|
|
110
|
+
args6?: FW.EventManagerArgs,
|
|
111
|
+
args7?: FW.EventManagerArgs,
|
|
112
|
+
args8?: FW.EventManagerArgs,
|
|
113
|
+
args9?: FW.EventManagerArgs,
|
|
114
|
+
args10?: FW.EventManagerArgs,
|
|
115
|
+
) {
|
|
116
|
+
const observers = this.listeners[eventName];
|
|
117
|
+
if (!observers) return;
|
|
118
|
+
let shouldStopPropagation = false;
|
|
119
|
+
for (const observer of observers) {
|
|
120
|
+
if (shouldStopPropagation) break;
|
|
121
|
+
observer.notify(args1, args2, args3, args4, args5, args6, args7, args8, args9, args10);
|
|
122
|
+
if (observer.intercept) {
|
|
123
|
+
shouldStopPropagation = true;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* 事件注册
|
|
130
|
+
* @param eventName 事件名
|
|
131
|
+
* @param cb 回调函数
|
|
132
|
+
* @param target 事件回调绑定目标
|
|
133
|
+
*/
|
|
134
|
+
public register(
|
|
135
|
+
eventName: string | number,
|
|
136
|
+
cb: (
|
|
137
|
+
args1?: FW.EventManagerArgs,
|
|
138
|
+
args2?: FW.EventManagerArgs,
|
|
139
|
+
args3?: FW.EventManagerArgs,
|
|
140
|
+
args4?: FW.EventManagerArgs,
|
|
141
|
+
args5?: FW.EventManagerArgs,
|
|
142
|
+
args6?: FW.EventManagerArgs,
|
|
143
|
+
args7?: FW.EventManagerArgs,
|
|
144
|
+
args8?: FW.EventManagerArgs,
|
|
145
|
+
args9?: FW.EventManagerArgs,
|
|
146
|
+
args10?: FW.EventManagerArgs,
|
|
147
|
+
) => void,
|
|
148
|
+
target: FW.TargetType,
|
|
149
|
+
options?: {
|
|
150
|
+
priority?: FWSystemDefine.FWPriorityOrder;
|
|
151
|
+
intercept?: boolean;
|
|
152
|
+
},
|
|
153
|
+
) {
|
|
154
|
+
const observers = this.listeners[eventName];
|
|
155
|
+
const define = FWSystemDefine.FWPriorityOrder;
|
|
156
|
+
const priority = options?.priority === undefined ? define.NORMAL : options.priority;
|
|
157
|
+
const intercept = options?.intercept === undefined ? false : options.intercept;
|
|
158
|
+
const observer = new FWObserver(eventName, cb, target, priority, intercept);
|
|
159
|
+
if (!observers) {
|
|
160
|
+
this.listeners[eventName] = [];
|
|
161
|
+
}
|
|
162
|
+
const order = Object.values(define);
|
|
163
|
+
const insertIndex = this.listeners[eventName].findIndex(
|
|
164
|
+
(o) => order[o.priority] > order[priority],
|
|
165
|
+
);
|
|
166
|
+
if (insertIndex === -1) {
|
|
167
|
+
this.listeners[eventName].push(observer);
|
|
168
|
+
} else {
|
|
169
|
+
this.listeners[eventName].splice(insertIndex, 0, observer);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* 注销事件
|
|
175
|
+
* @param eventName
|
|
176
|
+
* @param target
|
|
177
|
+
* @returns
|
|
178
|
+
*/
|
|
179
|
+
public unRegister(eventName: string, target: Comment | Object) {
|
|
180
|
+
const observers = this.listeners[eventName];
|
|
181
|
+
if (!observers) return;
|
|
182
|
+
for (const observer of observers) {
|
|
183
|
+
if (observer.getEventName() === eventName && observer.compar(target)) {
|
|
184
|
+
observers.splice(observers.indexOf(observer), 1);
|
|
185
|
+
if (observers.length == 0) {
|
|
186
|
+
delete this.listeners[eventName];
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* 目标对象是否注册了指定事件
|
|
194
|
+
* @param eventName
|
|
195
|
+
* @param target
|
|
196
|
+
* @returns
|
|
197
|
+
*/
|
|
198
|
+
has(eventName: string | number, target: Comment | Object): boolean {
|
|
199
|
+
const observers = this.listeners[eventName];
|
|
200
|
+
if (!observers) return false;
|
|
201
|
+
for (const observer of observers) {
|
|
202
|
+
if (observer.getEventName() === eventName && observer.compar(target)) {
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/** 关闭事件 */
|
|
210
|
+
public eventOff(eventName: string | number) {
|
|
211
|
+
const observers = this.listeners[eventName];
|
|
212
|
+
if (!observers) return;
|
|
213
|
+
for (const observer of observers) {
|
|
214
|
+
if (observer.getEventName() === eventName) {
|
|
215
|
+
observers.splice(observers.indexOf(observer), 1);
|
|
216
|
+
if (observers.length == 0) {
|
|
217
|
+
delete this.listeners[eventName];
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* 注销对象身上所有事件
|
|
225
|
+
* @param target
|
|
226
|
+
*/
|
|
227
|
+
public targetOff(target: FW.TargetType) {
|
|
228
|
+
Object.keys(this.listeners).forEach((eventName) => {
|
|
229
|
+
const observers = this.listeners[eventName];
|
|
230
|
+
for (const observer of observers) {
|
|
231
|
+
if (observer.compar(target)) {
|
|
232
|
+
observers.splice(observers.indexOf(observer), 1);
|
|
233
|
+
if (observers.length == 0) {
|
|
234
|
+
delete this.listeners[eventName];
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* 暂停所有已注册事件
|
|
243
|
+
* @param target
|
|
244
|
+
*/
|
|
245
|
+
public targetPause(target: Comment | Object | Node) {
|
|
246
|
+
Object.keys(this.listeners).forEach((eventName) => {
|
|
247
|
+
const observers = this.listeners[eventName];
|
|
248
|
+
for (const observer of observers) {
|
|
249
|
+
if (observer.compar(target)) {
|
|
250
|
+
observer.pauseObserver();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* 恢复所有已注册事件
|
|
258
|
+
* @param target
|
|
259
|
+
*/
|
|
260
|
+
public targetResume(target: Comment | Object | Node) {
|
|
261
|
+
Object.keys(this.listeners).forEach((eventName) => {
|
|
262
|
+
const observers = this.listeners[eventName];
|
|
263
|
+
for (const observer of observers) {
|
|
264
|
+
if (observer.compar(target)) {
|
|
265
|
+
observer.resumeObserver();
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/** 销毁 */
|
|
272
|
+
public onDestroy(): void {
|
|
273
|
+
this.listeners = cc.js.createMap();
|
|
274
|
+
}
|
|
275
|
+
}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import FWLog from '../log/FWLog';
|
|
2
|
+
import { FWManager } from './FWManager';
|
|
3
|
+
|
|
4
|
+
export default class FWHotUpdateManager extends FWManager implements FW.HotUpdateManager {
|
|
5
|
+
private listener: FW.HotUpdateListener;
|
|
6
|
+
private assetMgr: any;
|
|
7
|
+
private storePath: string;
|
|
8
|
+
private isUpdate: boolean;
|
|
9
|
+
private localManifest: cc.Asset;
|
|
10
|
+
private isRetry: boolean;
|
|
11
|
+
|
|
12
|
+
setListener(listener: FW.HotUpdateListener): void {
|
|
13
|
+
this.listener = listener;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public update(localManifest: cc.Asset) {
|
|
17
|
+
if (!localManifest) {
|
|
18
|
+
FWLog.error('没有找到本地Manifest文件!');
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
this.localManifest = localManifest;
|
|
22
|
+
this.assetMgr = new jsb.AssetsManager('', this.storePath, this.versionCompareHandle);
|
|
23
|
+
this.assetMgr.setVerifyCallback(function (path: string, asset: any) {
|
|
24
|
+
const compressed = asset.compressed;
|
|
25
|
+
const expectedMD5 = asset.md5;
|
|
26
|
+
const relativePath = asset.path;
|
|
27
|
+
const size = asset.size;
|
|
28
|
+
if (compressed) {
|
|
29
|
+
return true;
|
|
30
|
+
} else {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
this.checkHotUpdate();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private versionCompareHandle(currentVersion: string, newVersion: string): number {
|
|
38
|
+
this.listener.versionCompareHandle(currentVersion, newVersion);
|
|
39
|
+
var vA = currentVersion.split('.');
|
|
40
|
+
var vB = newVersion.split('.');
|
|
41
|
+
for (var i = 0; i < vA.length; ++i) {
|
|
42
|
+
var a = parseInt(vA[i]);
|
|
43
|
+
var b = parseInt(vB[i] || '0');
|
|
44
|
+
if (a === b) {
|
|
45
|
+
continue;
|
|
46
|
+
} else {
|
|
47
|
+
return a - b;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (vB.length > vA.length) {
|
|
51
|
+
return -1;
|
|
52
|
+
} else {
|
|
53
|
+
return 0;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
private retry() {
|
|
58
|
+
if (!this.isUpdate && this.isRetry) {
|
|
59
|
+
this.isRetry = false;
|
|
60
|
+
this.assetMgr.downloadFailedAssets();
|
|
61
|
+
this.listener.retryHandle?.();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
private checkHotUpdate() {
|
|
66
|
+
if (this.isUpdate) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (this.assetMgr.getState() === jsb.AssetsManager.State.UNINITED) {
|
|
70
|
+
this.assetMgr.loadLocalManifest(this.localManifest.nativeUrl);
|
|
71
|
+
}
|
|
72
|
+
if (!this.assetMgr.getLocalManifest() || !this.assetMgr.getLocalManifest().isLoaded()) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
this.assetMgr.setEventCallback(this.checkEventHandle.bind(this));
|
|
76
|
+
this.assetMgr.checkUpdate();
|
|
77
|
+
this.isUpdate = true;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private checkEventHandle(event: any) {
|
|
81
|
+
const code = event.getEventCode();
|
|
82
|
+
FWLog.debug('getEventCode -> ', code);
|
|
83
|
+
switch (code) {
|
|
84
|
+
case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
|
|
85
|
+
FWLog.debug('getEventCode -> ', 'ERROR_NO_LOCAL_MANIFEST');
|
|
86
|
+
break;
|
|
87
|
+
case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
|
|
88
|
+
FWLog.debug('getEventCode -> ', 'ERROR_DOWNLOAD_MANIFEST');
|
|
89
|
+
break;
|
|
90
|
+
case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:
|
|
91
|
+
FWLog.debug('getEventCode -> ', 'ERROR_PARSE_MANIFEST');
|
|
92
|
+
break;
|
|
93
|
+
case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:
|
|
94
|
+
FWLog.debug('getEventCode -> ', 'ALREADY_UP_TO_DATE');
|
|
95
|
+
break;
|
|
96
|
+
case jsb.EventAssetsManager.NEW_VERSION_FOUND:
|
|
97
|
+
FWLog.debug('getEventCode -> ', 'NEW_VERSION_FOUND');
|
|
98
|
+
break;
|
|
99
|
+
default:
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
this.listener.checkHotUpdateHandle?.(code);
|
|
104
|
+
this.assetMgr.setEventCallback(null!);
|
|
105
|
+
this.isUpdate = false;
|
|
106
|
+
|
|
107
|
+
if (event.getEventCode() == jsb.EventAssetsManager.NEW_VERSION_FOUND) {
|
|
108
|
+
this.hotUpdate();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
private hotUpdate() {
|
|
113
|
+
if (this.assetMgr && !this.isUpdate) {
|
|
114
|
+
this.assetMgr.setEventCallback(this.updateEventHandle.bind(this));
|
|
115
|
+
|
|
116
|
+
if (this.assetMgr.getState() === jsb.AssetsManager.State.UNINITED) {
|
|
117
|
+
this.assetMgr.loadLocalManifest(this.localManifest.nativeUrl);
|
|
118
|
+
}
|
|
119
|
+
this.isUpdate = true;
|
|
120
|
+
this.assetMgr.update();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
private updateEventHandle(event: any) {
|
|
125
|
+
let needRestart = false;
|
|
126
|
+
let failed = false;
|
|
127
|
+
let percent: number = 0;
|
|
128
|
+
let downloadedFiles: number = 0;
|
|
129
|
+
let totalFiles: number = 0;
|
|
130
|
+
let downloadedBytes: number = 0;
|
|
131
|
+
let totalBytes: number = 0;
|
|
132
|
+
let convertDownloadedBytes: string = '';
|
|
133
|
+
let convertTotalBytes: string = '';
|
|
134
|
+
const code = event.getEventCode();
|
|
135
|
+
const msg = event.getMessage();
|
|
136
|
+
switch (code) {
|
|
137
|
+
case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
|
|
138
|
+
failed = true;
|
|
139
|
+
break;
|
|
140
|
+
case jsb.EventAssetsManager.UPDATE_PROGRESSION:
|
|
141
|
+
if (event.getPercent() > 0) {
|
|
142
|
+
downloadedFiles = event.getDownloadedFiles();
|
|
143
|
+
totalFiles = event.getTotalFiles();
|
|
144
|
+
downloadedBytes = event.getDownloadedBytes();
|
|
145
|
+
totalBytes = event.getTotalBytes();
|
|
146
|
+
convertDownloadedBytes = this.convertBytes(downloadedBytes);
|
|
147
|
+
convertTotalBytes = this.convertBytes(totalBytes);
|
|
148
|
+
percent = event.getPercent();
|
|
149
|
+
}
|
|
150
|
+
break;
|
|
151
|
+
case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
|
|
152
|
+
break;
|
|
153
|
+
case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST:
|
|
154
|
+
failed = true;
|
|
155
|
+
break;
|
|
156
|
+
case jsb.EventAssetsManager.ALREADY_UP_TO_DATE:
|
|
157
|
+
failed = true;
|
|
158
|
+
break;
|
|
159
|
+
case jsb.EventAssetsManager.UPDATE_FINISHED:
|
|
160
|
+
needRestart = true;
|
|
161
|
+
break;
|
|
162
|
+
case jsb.EventAssetsManager.UPDATE_FAILED:
|
|
163
|
+
this.isUpdate = false;
|
|
164
|
+
this.isRetry = true;
|
|
165
|
+
break;
|
|
166
|
+
case jsb.EventAssetsManager.ERROR_UPDATING:
|
|
167
|
+
break;
|
|
168
|
+
case jsb.EventAssetsManager.ERROR_DECOMPRESS:
|
|
169
|
+
break;
|
|
170
|
+
default:
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
this.listener.hotUpdatingHandle?.(code, {
|
|
175
|
+
percent: percent,
|
|
176
|
+
downloadedFiles: downloadedFiles,
|
|
177
|
+
totalFiles: totalFiles,
|
|
178
|
+
downloadedBytes: downloadedBytes,
|
|
179
|
+
totalBytes: totalBytes,
|
|
180
|
+
convertDownloadedBytes: convertDownloadedBytes,
|
|
181
|
+
convertTotalBytes: convertTotalBytes,
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
if (failed) {
|
|
185
|
+
this.assetMgr.setEventCallback(null!);
|
|
186
|
+
this.isUpdate = false;
|
|
187
|
+
this.retry();
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
if (needRestart) {
|
|
191
|
+
this.assetMgr.setEventCallback(null!);
|
|
192
|
+
var searchPaths = jsb.fileUtils.getSearchPaths();
|
|
193
|
+
var newPaths = this.assetMgr.getLocalManifest().getSearchPaths();
|
|
194
|
+
Array.prototype.unshift.apply(searchPaths, newPaths);
|
|
195
|
+
jsb.fileUtils.setSearchPaths(searchPaths);
|
|
196
|
+
this.listener.completedHandle?.();
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
private convertBytes(bytes: number) {
|
|
201
|
+
const units = ['B', 'KB', 'MB', 'GB'];
|
|
202
|
+
let size = bytes,
|
|
203
|
+
unitIndex = 0;
|
|
204
|
+
while (size >= 1024 && unitIndex < units.length - 1) {
|
|
205
|
+
size /= 1024;
|
|
206
|
+
unitIndex++;
|
|
207
|
+
}
|
|
208
|
+
return `${size.toFixed(size < 10 ? 2 : 1)} ${units[unitIndex]}`;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
public initialize(): void {}
|
|
212
|
+
public onDestroy(): void {}
|
|
213
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import FWLog from '../log/FWLog';
|
|
2
|
+
import { FWEventDefine } from '../define/FWEventDefine';
|
|
3
|
+
import { FWManager } from './FWManager';
|
|
4
|
+
|
|
5
|
+
export default class FWLanguageManager extends FWManager implements FW.LanguageManager {
|
|
6
|
+
public initialize(): void {
|
|
7
|
+
this.bundles = [];
|
|
8
|
+
this.language = '';
|
|
9
|
+
this.languagePackageEnum = {};
|
|
10
|
+
this.languagePackageGetters = {};
|
|
11
|
+
this.supportedLanguages = [];
|
|
12
|
+
}
|
|
13
|
+
public onDestroy(): void {}
|
|
14
|
+
/** 语言包枚举 */
|
|
15
|
+
private languagePackageEnum: Record<string, any>;
|
|
16
|
+
/** 语言包获取的映射方法 */
|
|
17
|
+
private languagePackageGetters: Record<string, (key: string, language?: string) => string>;
|
|
18
|
+
/** 当前语言 */
|
|
19
|
+
private language: string;
|
|
20
|
+
/** 注册了语言包的bundle */
|
|
21
|
+
private bundles: string[];
|
|
22
|
+
/** 支持的所有语言代码数组 */
|
|
23
|
+
private supportedLanguages: string[];
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 获取当前语言
|
|
27
|
+
* @returns
|
|
28
|
+
*/
|
|
29
|
+
getLanguage(): string {
|
|
30
|
+
return this.language;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* 获取语言包
|
|
35
|
+
* @param bundleName
|
|
36
|
+
* @returns
|
|
37
|
+
*/
|
|
38
|
+
getLanguagePackageEnum<K extends keyof FW.ILanguageBundleAccessor>(
|
|
39
|
+
bundleName: K,
|
|
40
|
+
): FW.ILanguageBundleAccessor[K] {
|
|
41
|
+
return this.languagePackageEnum[bundleName as string];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
getBundles(): string[] {
|
|
45
|
+
return this.bundles;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* 注册语言包
|
|
50
|
+
* @param bundleName
|
|
51
|
+
* @param language
|
|
52
|
+
*/
|
|
53
|
+
registerLanguagePackageEnum(
|
|
54
|
+
bundleName: string,
|
|
55
|
+
languagePackage: any,
|
|
56
|
+
getter: (key: string, language?: string) => string,
|
|
57
|
+
): void {
|
|
58
|
+
const languageEnum = cc.Enum(languagePackage);
|
|
59
|
+
this.languagePackageEnum[bundleName] = languageEnum;
|
|
60
|
+
this.languagePackageGetters[bundleName] = getter;
|
|
61
|
+
!this.bundles.includes(bundleName) && this.bundles.push(bundleName);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public getLanguagePackageValue(bundleName: string, key: string, language?: string): string {
|
|
65
|
+
const getter = this.languagePackageGetters[bundleName];
|
|
66
|
+
if (getter) {
|
|
67
|
+
return getter(key, language);
|
|
68
|
+
}
|
|
69
|
+
if (CC_DEBUG) {
|
|
70
|
+
return key;
|
|
71
|
+
} else {
|
|
72
|
+
return '';
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
getLanguagePackageEnumKeys(bundleName: string) {
|
|
77
|
+
const languageEnum = this.languagePackageEnum[bundleName];
|
|
78
|
+
if (languageEnum) {
|
|
79
|
+
return Object.keys(languageEnum) as string[];
|
|
80
|
+
}
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
getLanguagePackageEnumValues(bundleName: string) {
|
|
85
|
+
const languageEnum = this.languagePackageEnum[bundleName];
|
|
86
|
+
if (languageEnum) {
|
|
87
|
+
return Object.values(languageEnum) as string[];
|
|
88
|
+
}
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async initializeLanguage(language: string) {
|
|
93
|
+
if (this.language == language) return;
|
|
94
|
+
this.language = language;
|
|
95
|
+
FW.Entry.evtMgr.dispatch(FWEventDefine.LanguageEvent.LANGUAGE_CHANGE);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
getLanguageIndex() {
|
|
99
|
+
return ['', ...this.getSupportedLanguages()].indexOf(this.language);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* 获取支持的所有语言
|
|
104
|
+
*/
|
|
105
|
+
getSupportedLanguages(): string[] {
|
|
106
|
+
return [...this.supportedLanguages]; // 返回副本
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* 设置支持的语言
|
|
111
|
+
* @param languages 语言代码数组
|
|
112
|
+
*/
|
|
113
|
+
setSupportedLanguages(languages: string[]): void {
|
|
114
|
+
this.supportedLanguages = [...new Set(languages)];
|
|
115
|
+
}
|
|
116
|
+
}
|