97 lines
4.8 KiB
TypeScript
97 lines
4.8 KiB
TypeScript
import { coinMadnessMockEnabled, coinMadnessMockKey } from './CoinMadnessProgress';
|
|
import { MiniGameSdk } from './Sdk/MiniGameSdk';
|
|
import HomePopupQueue from '../home_popup_queue/HomePopupQueue';
|
|
const { ccclass } = cc._decorator;
|
|
const BUNDLE = 'coin_madness';
|
|
|
|
/** Resident bridge only: never import the bundle's UI class or preload its assets. */
|
|
@ccclass
|
|
export default class CoinMadnessHost extends cc.Component {
|
|
private static occupied = false;
|
|
private bundle: cc.AssetManager.Bundle = null;
|
|
private panel: cc.Node = null;
|
|
private entry: cc.Node = null;
|
|
private loading = false;
|
|
private releasing = false;
|
|
private requestId = 0;
|
|
private finishQueue: () => void = null;
|
|
private alive = true;
|
|
start() { if (coinMadnessMockEnabled()) this.updateEntry(); }
|
|
private updateEntry() {
|
|
const visible = coinMadnessMockEnabled();
|
|
if (!visible) { if (this.entry) this.entry.destroy(); this.entry = null; return; }
|
|
if (!this.entry) {
|
|
this.entry = new cc.Node('CoinMadnessEntry');
|
|
(this.node.getChildByName('Load') || this.node).addChild(this.entry);
|
|
this.entry.setContentSize(146, 112);
|
|
const widget = this.entry.addComponent(cc.Widget);
|
|
widget.isAlignLeft = true; widget.left = 24; widget.isAlignBottom = true; widget.bottom = 425;
|
|
const g = this.entry.addComponent(cc.Graphics);
|
|
g.fillColor = new cc.Color(231, 121, 24); g.roundRect(-73, -56, 146, 112, 22); g.fill();
|
|
const title = new cc.Node('Title'); this.entry.addChild(title);
|
|
const label = title.addComponent(cc.Label); label.string = '金币狂热'; label.fontSize = 27;
|
|
label.useSystemFont = true;
|
|
label.lineHeight = 31;
|
|
title.color = cc.Color.WHITE;
|
|
this.entry.on(cc.Node.EventType.TOUCH_END, this.open, this);
|
|
}
|
|
this.entry.getChildByName('Title').getComponent(cc.Label).string = '金币狂热\n模拟联调';
|
|
this.entry.active = true;
|
|
}
|
|
open() {
|
|
if (!coinMadnessMockEnabled() || this.loading || this.releasing || this.panel) return;
|
|
HomePopupQueue.get(this.node).enqueue('coinMadness', 55, done => {
|
|
if (!this.alive) { done(); return; }
|
|
this.finishQueue = done; this.load();
|
|
});
|
|
}
|
|
private load() {
|
|
if (CoinMadnessHost.occupied) { this.close(); this.toast('活动资源释放中,请稍后重试'); return; }
|
|
CoinMadnessHost.occupied = true;
|
|
this.loading = true;
|
|
const requestId = ++this.requestId;
|
|
cc.assetManager.loadBundle(BUNDLE, (error, bundle) => {
|
|
if (error) { CoinMadnessHost.occupied = false; this.loading = false; this.close(); this.toast('活动加载失败,请重试'); return; }
|
|
if (!this.alive || requestId !== this.requestId) { this.release(bundle); return; }
|
|
this.bundle = bundle;
|
|
bundle.load('CoinMadness', cc.Prefab, (loadError, prefab: cc.Prefab) => {
|
|
this.loading = false;
|
|
if (!this.alive || requestId !== this.requestId) { this.release(bundle); return; }
|
|
if (loadError) { this.close(); this.toast('活动资源加载失败,请重试'); return; }
|
|
this.panel = cc.instantiate(prefab); this.node.addChild(this.panel);
|
|
this.panel.zIndex = cc.macro.MAX_ZINDEX - 1;
|
|
const key = coinMadnessMockKey();
|
|
this.panel.getComponent('CoinMadnessPanel').initialize(null, {
|
|
close: () => this.close(),
|
|
read: () => cc.fx.StorageMessage.getStorage(key),
|
|
write: value => cc.fx.StorageMessage.setStorage(key, value),
|
|
level: () => cc.fx.GameConfig.GM_INFO.level,
|
|
});
|
|
});
|
|
});
|
|
}
|
|
close() {
|
|
++this.requestId;
|
|
const wasLoading = this.loading; this.loading = false;
|
|
if (this.panel) { this.panel.destroy(); this.panel = null; }
|
|
const bundle = this.bundle; this.bundle = null;
|
|
if (bundle && !wasLoading) this.release(bundle);
|
|
const done = this.finishQueue; this.finishQueue = null; if (done) done();
|
|
}
|
|
private release(bundle: cc.AssetManager.Bundle) {
|
|
this.releasing = true;
|
|
cc.director.once(cc.Director.EVENT_AFTER_DRAW, () => {
|
|
bundle.releaseAll();
|
|
if (cc.assetManager.getBundle(BUNDLE) === bundle) cc.assetManager.removeBundle(bundle);
|
|
this.releasing = false;
|
|
CoinMadnessHost.occupied = false;
|
|
});
|
|
}
|
|
private toast(message: string) { if (this.alive) MiniGameSdk.API.showToast(message); }
|
|
onDestroy() {
|
|
this.alive = false; this.unscheduleAllCallbacks();
|
|
this.close();
|
|
if (this.entry) this.entry.destroy(); this.entry = null;
|
|
}
|
|
}
|