perf: 优化通关弹窗

This commit is contained in:
richarjiang
2026-05-06 15:53:08 +08:00
parent 84f45ebfdf
commit 32adc7c467
6 changed files with 957 additions and 335 deletions

View File

@@ -217,6 +217,9 @@ export class PageLevel extends BaseView {
/** 本次通关弹窗使用的已通关数量 */
private _passModalCompletedLevelCount: number | null = null;
/** 本次通关弹窗动画起点(通关前)的已通关数量;为 null 表示不播动画 */
private _passModalPreviousCompletedLevelCount: number | null = null;
/** 错误弹窗实例 */
private _wrongModalNode: Node | null = null;
@@ -1570,8 +1573,11 @@ export class PageLevel extends BaseView {
private reportLevelCompleted(levelId: string, timeSpent: number): void {
if (!this._isShareMode) {
// 乐观更新通关计数(用于称号展示)
const previousCount = AuthManager.instance.completedLevelCount;
AuthManager.instance.addCompletedLevelCount();
this._passModalCompletedLevelCount = AuthManager.instance.completedLevelCount;
// 本次预期为首次通关,起点 = 通关前计数;如果回调回退,则清掉避免误播动画
this._passModalPreviousCompletedLevelCount = previousCount;
void StaminaManager.instance.completeLevel(levelId, timeSpent).then((result) => {
if (result) {
@@ -1582,6 +1588,7 @@ export class PageLevel extends BaseView {
// 非首次通关,回退乐观更新
AuthManager.instance.addCompletedLevelCount(-1);
this._passModalCompletedLevelCount = AuthManager.instance.completedLevelCount;
this._passModalPreviousCompletedLevelCount = null;
}
console.log(`[PageLevel] 通关上报成功,首次通关: ${result.firstClear}, 有下一关: ${!!result.nextLevel}`);
}
@@ -1590,6 +1597,7 @@ export class PageLevel extends BaseView {
}
this._passModalCompletedLevelCount = null;
this._passModalPreviousCompletedLevelCount = null;
// fire-and-forget: errors are logged inside reportLevelProgress
void ShareManager.instance.reportLevelProgress(levelId, true, timeSpent);
}
@@ -1631,9 +1639,17 @@ export class PageLevel extends BaseView {
// 获取 PassModal 组件并设置回调
const passModal = modalNode.getComponent(PassModal);
if (passModal) {
const completedCount = this._getPassModalCompletedLevelCount();
const titleInfo = AchievementTitleManager.getTitleInfo(completedCount);
const previousCompletedCount = this._passModalPreviousCompletedLevelCount;
const previousTitleInfo = (previousCompletedCount !== null && previousCompletedCount !== completedCount)
? AchievementTitleManager.getTitleInfo(previousCompletedCount)
: undefined;
passModal.setParams({
levelIndex: this.getDisplayLevelNumber(),
titleInfo: AchievementTitleManager.getTitleInfo(this._getPassModalCompletedLevelCount())
titleInfo,
previousTitleInfo
});
passModal.setCallbacks({
onNextLevel: () => {
@@ -1645,6 +1661,8 @@ export class PageLevel extends BaseView {
console.log('[PageLevel] 分享完成');
}
});
// 动画消费完一次后清除起点,避免弹窗多次打开时复用
this._passModalPreviousCompletedLevelCount = null;
// 手动调用 onViewLoad 和 onViewShow
passModal.onViewLoad();
passModal.onViewShow();