perf: 优化通关弹窗
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user