You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

225 lines
7.7 KiB

3 weeks ago
import { _decorator, director } from 'cc';
import { Auto_MainUI } from './Auto_MainUI';
import { UIPanelHomeOld } from '../PanelHome/UIPanelHomeOld';
import { UIConfigs, UIID, GAudioPath } from '../../game/ConfigRes';
import { GEvent } from 'db://assets/mx/module/event/GEvent';
import { PreloadPredictor } from 'db://assets/mx/module/res/PreloadPredictor';
import { BundleLifecycle } from 'db://assets/mx/module/res/BundleLifecycle';
import { MemoryProfile } from '../../game/MemoryProfile';
import { DailyShopDataManager } from '../../manager/DailyShopDataManager';
import { HeadIconManager } from '../../manager/HeadIconManager';
const { ccclass } = _decorator;
@ccclass('UIMainUI')
export class UIMainUI extends Auto_MainUI {
private static readonly MAIN_TAB_IDS: number[] = [
UIID.Shop,
UIID.Role,
UIID.Home,
UIID.Weapon,
];
onEnable(): void {
GEvent.Ins.on(GEvent.UpdateMainUI, this.updateUI, this);
GEvent.Ins.on(GEvent.TiaoZhuanShop, this._onTiaoZhuanShop, this);
GEvent.Ins.on(GEvent.UpdateHeadIcon, this._refreshHeadIcon, this);
this.schedule(this._tickRedDot, 1);
super.onEnable();
this._refreshHeadIcon();
}
onDisable(): void {
GEvent.Ins.off(GEvent.UpdateMainUI, this.updateUI, this);
GEvent.Ins.off(GEvent.TiaoZhuanShop, this._onTiaoZhuanShop, this);
GEvent.Ins.off(GEvent.UpdateHeadIcon, this._refreshHeadIcon, this);
this.unschedule(this._tickRedDot);
super.onDisable();
}
/** 刷新顶栏头像 */
private _refreshHeadIcon(): void {
void HeadIconManager.refreshUiHeadAsync(this.ui_head);
}
private _tickRedDot(): void {
gg.dot.updateRedDot();
}
onInit(): void {
gg.audio.playMusic({ name: '首页背景音', path: GAudioPath.Bgm });
this.updateUI();
let pageID = UIID.Home;
if (this.prema != null && this.prema != undefined) {
pageID = this.prema;
}
this.showPage(pageID).then(() => {
this._onMainUiFirstPageReady();
}).catch((e) => console.error('[UIMainUI] onInit', String(e)));
}
private _onMainUiFirstPageReady(): void {
gg.game.hideLoading();
gg.game.onMainUiReady();
gg.sdk.notifyFeedGameInteractive();
gg.sdk.storeFeedData();
gg.sdk.PlatformFeedSubscribe();
this._tryPopDailyShopBuy();
}
1 week ago
/** 战斗胜利/失败领取奖励回大厅后,自动弹出每日商店翻牌窗 */
3 weeks ago
private _tryPopDailyShopBuy(): void {
DailyShopDataManager.popSettleShopPanelIfNeeded();
}
private _curentID: UIID = null;
/** 切 Tab 世代,过期的 showPage 不得再开 */
private _pageEpoch = 0;
isHomeTabSelected(): boolean {
return this._curentID === UIID.Home || this._curentID === null;
}
private _showPageChain: Promise<void> = Promise.resolve();
showPage(pageID: UIID, notCheck = false): Promise<void> {
if (pageID == this._curentID && gg.ui.panelIsShow(pageID)) {
return Promise.resolve();
}
const epoch = ++this._pageEpoch;
this._curentID = pageID;
this._setTabSelected(pageID);
PreloadPredictor.getInstance().onTabIntent(pageID);
this._showPageChain = this._showPageChain
.then(() => {
if (epoch !== this._pageEpoch) return;
return this._showPageImpl(pageID);
})
.catch((e) => console.error('[UIMainUI] showPage', String(e)));
return this._showPageChain;
}
/** 先打开目标 Tab,成功后再隐藏/关闭其它 Tab */
private _showPageImpl(pageID: UIID): Promise<void> {
if (this._curentID !== pageID) return Promise.resolve();
return gg.ui.openPanel(pageID).then((ok) => {
if (this._curentID !== pageID) return;
if (!ok) {
this._restoreTabAfterOpenFail(pageID);
gg.ui.showToast('页面加载失败', false);
return;
}
this.hideOtherMainTabPagesExcept(pageID);
return this._closeInactiveMainTabs(pageID).then(() => {
if (this._curentID !== pageID) return;
this._releaseInactiveTabBundles(pageID);
});
});
}
/** 刷新底栏 Tab 选中态 */
private _setTabSelected(pageID: UIID | null): void {
this.ui_btns.children.map(c => c.find('select').active = false);
if (pageID == null) return;
const btn = this.ui_btns.find('btn' + pageID);
if (!btn) return;
btn.find('select').active = true;
}
/** 目标 Tab 打开失败时,把选中态恢复到仍在显示的 Tab */
private _restoreTabAfterOpenFail(failedId: UIID): void {
if (this._curentID !== failedId) return;
let restore: UIID = null;
for (const id of UIMainUI.MAIN_TAB_IDS) {
if (id === failedId) continue;
if (gg.ui.panelIsShow(id)) {
restore = id;
break;
}
}
this._curentID = restore;
this._setTabSelected(restore);
}
private getMainUiContentLayer() {
const scene = director.getScene();
if (!scene?.isValid) return null;
const canvas = scene.getChildByName('Canvas');
const root = canvas?.getChildByName('root');
return root?.getChildByName('MainUI') ?? null;
}
private hideOtherMainTabPagesExcept(showId: UIID) {
const layer = this.getMainUiContentLayer();
if (!layer?.isValid) return;
for (const id of UIMainUI.MAIN_TAB_IDS) {
const conf = UIConfigs[id];
if (!conf) continue;
const page = layer.getChildByName(conf.name);
if (page?.isValid) {
page.active = id === showId;
}
}
}
private _closeInactiveMainTabs(showId: UIID): Promise<void> {
let chain = Promise.resolve();
for (const id of UIMainUI.MAIN_TAB_IDS) {
if (id === showId || id === UIID.Home) continue;
if (!gg.ui.hasPanel(id)) continue;
const panelId = id;
chain = chain.then(() => gg.ui.closePanel(panelId));
}
return chain;
}
private _releaseInactiveTabBundles(showId: UIID): void {
if (!MemoryProfile.current.enableTabBundleUnloadOnSwitch) return;
const keep = PreloadPredictor.getTabBundlesForPage(showId);
BundleLifecycle.getInstance().releaseTabBundlesExcept(keep);
const unloaded: string[] = [];
for (const id of UIMainUI.MAIN_TAB_IDS) {
if (id === showId || id === UIID.Home) continue;
for (const bundle of PreloadPredictor.getTabBundlesForPage(id)) {
unloaded.push(bundle);
}
}
PreloadPredictor.getInstance().clearTabPreloadForBundles(unloaded);
}
private _onTiaoZhuanShop = (tabIndex: number): void => {
const tabPages: UIID[] = [UIID.Shop, UIID.Role, UIID.Home, UIID.Weapon];
const pageID = tabPages[tabIndex];
if (pageID == null) return;
void this.showPage(pageID);
};
updateUI() {
this.btn204.active = false;
this.btn200.find('lock').active = false;
this.btn201.find('lock').active = true;
this.btn203.find('lock').active = false;
this.btn204.find('lock').active = true;
this.btn101.find('lock').active = false;
}
click_btn200(): void {
this.showPage(UIID.Shop);
}
click_btn201(): void {
this.showPage(UIID.Role);
}
click_btn101(): void {
this.showPage(UIID.Home);
}
click_btn203(): void {
this.showPage(UIID.Weapon);
}
click_btn204(): void {
}
}