50 lines
2.2 KiB
TypeScript
50 lines
2.2 KiB
TypeScript
const { ccclass } = cc._decorator;
|
|
|
|
/** HomeScene 共用队列。显示中的活动及其奖励窗口关闭后才推进下一项。 */
|
|
@ccclass
|
|
export default class HomePopupQueue extends cc.Component {
|
|
private tasks: Array<{ key: string; priority: number; run: (done: () => void) => void }> = [];
|
|
private running = "";
|
|
|
|
public static get(canvas: cc.Node): HomePopupQueue {
|
|
return canvas.getComponent(HomePopupQueue) || canvas.addComponent(HomePopupQueue);
|
|
}
|
|
|
|
public enqueue(key: string, priority: number, run: (done: () => void) => void) {
|
|
if (this.running === key || this.tasks.some(task => task.key === key)) return;
|
|
this.tasks.push({ key, priority, run });
|
|
this.tasks.sort((a, b) => a.priority - b.priority);
|
|
}
|
|
|
|
update() {
|
|
if (this.running || !this.tasks.length || this.hasVisiblePopup()) return;
|
|
const task = this.tasks.shift();
|
|
this.running = task.key;
|
|
let finished = false;
|
|
const done = () => {
|
|
if (finished) return;
|
|
finished = true;
|
|
this.running = "";
|
|
};
|
|
try { task.run(done); }
|
|
catch (error) { done(); cc.error("[HomePopupQueue] " + task.key, error); }
|
|
}
|
|
|
|
private hasVisiblePopup(): boolean {
|
|
const visible = (node: cc.Node) => node && cc.isValid(node, true) && node.activeInHierarchy;
|
|
// JiaZai hides this node when the home-entry transition animation completes.
|
|
if (visible(this.node.getChildByName("zhuanchang"))) return true;
|
|
if (visible(this.node.getChildByName("Transfer"))) return true;
|
|
if (visible(this.node.getChildByName("CloudRisePanel"))) return true;
|
|
const seven = this.node.getChildByName("sevenDayGift");
|
|
if (seven && seven.children.some(visible)) return true;
|
|
const home: any = this.node.getComponent("JiaZai");
|
|
if (!home) return false;
|
|
if (home.passContentLoading) return true;
|
|
return ["RewardNode", "getcard", "monthlyCardNode", "actionpNode", "winStreakNode", "passCheckNode", "passIntroNode", "jungleTreasureNode"]
|
|
.some(key => visible(home[key]));
|
|
}
|
|
|
|
onDestroy() { this.tasks.length = 0; this.running = ""; }
|
|
}
|