From 165fef318f32aff3e095d7a2648c727c91ec1d77 Mon Sep 17 00:00:00 2001 From: richarjiang Date: Tue, 19 May 2026 19:30:37 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=88=86=E4=BA=AB?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E8=BF=9B=E5=85=A5=E4=B8=BB=E7=BA=BF=E5=86=B2?= =?UTF-8?q?=E7=AA=81=E7=9A=84=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/prefabs/PageHome.ts | 13 ++++++-- assets/prefabs/PageLevel.ts | 63 +++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/assets/prefabs/PageHome.ts b/assets/prefabs/PageHome.ts index 1828f69..ea5953b 100644 --- a/assets/prefabs/PageHome.ts +++ b/assets/prefabs/PageHome.ts @@ -7,6 +7,7 @@ import { ToastManager } from 'db://assets/scripts/utils/ToastManager'; import { StaminaInfo } from 'db://assets/scripts/types/ApiTypes'; import { AuthManager } from 'db://assets/scripts/utils/AuthManager'; import { AchievementTitleManager } from 'db://assets/scripts/utils/AchievementTitleManager'; +import { ShareManager } from 'db://assets/scripts/utils/ShareManager'; const { ccclass, property } = _decorator; /** @@ -110,15 +111,23 @@ export class PageHome extends BaseView { return; } + // 兜底:清空可能残留的好友分享挑战状态,确保进入的是纯主线挑战 + // 场景:用户从微信好友分享卡片进入挑战 → 退出回首页 → 再次点击开始游戏 + // 若不清理,缓存的 PageLevel 仍会读到 ShareManager 的分享态数据 + if (ShareManager.instance.isShareMode) { + console.log('[PageHome] 检测到残留的分享挑战状态,清理后再进入主线挑战'); + ShareManager.instance.clearShareMode(); + } + this._isAnimating = true; this._playStaminaCostAnimation() .then(() => { - ViewManager.instance.open('PageLevel'); + ViewManager.instance.open('PageLevel', { params: { shareMode: false } }); }) .catch(err => { console.error('[PageHome] 体力消耗动画异常:', err); // 异常兜底:直接进入关卡 - ViewManager.instance.open('PageLevel'); + ViewManager.instance.open('PageLevel', { params: { shareMode: false } }); }) .finally(() => { this._isAnimating = false; diff --git a/assets/prefabs/PageLevel.ts b/assets/prefabs/PageLevel.ts index 21ee5dc..2a7df61 100644 --- a/assets/prefabs/PageLevel.ts +++ b/assets/prefabs/PageLevel.ts @@ -365,6 +365,19 @@ export class PageLevel extends BaseView { */ onViewShow(): void { console.log('[PageLevel] onViewShow'); + + // PageLevel 注册时 cache: true,缓存实例会被复用。 + // 必须根据本次进入时携带的 params 重新派生 _isShareMode, + // 否则上一场分享挑战的状态会残留到下一次主线挑战进入。 + const params = this.getParams(); + const desiredShareMode = params?.shareMode === true; + + if (desiredShareMode !== this._isShareMode) { + console.log(`[PageLevel] 检测到模式切换 ${this._isShareMode} → ${desiredShareMode},重新初始化关卡会话`); + this._reinitLevelSession(desiredShareMode); + return; + } + this._refreshModeUI(); this.updateStaminaLabel(); if (!this._isShareMode) { @@ -372,6 +385,56 @@ export class PageLevel extends BaseView { } } + /** + * 跨模式切换时(例如分享挑战 → 主线挑战)重置会话状态并重新加载关卡。 + * 仅在 onViewShow 检测到模式发生变化时调用,避免对正常的同模式连续作答产生副作用。 + */ + private _reinitLevelSession(shareMode: boolean): void { + this._isShareMode = shareMode; + + // 上一场可能遗留的弹窗 / 倒计时一并清掉,避免主线模式还看到分享态弹窗 + this._closePassModal(); + this._closeWrongModal(); + this._closeTimeoutModal(); + this._closeCommonModal(); + this.stopCountdown(); + this._stopStaminaRecoverTimer(); + + // 复位分享态相关字段(无论切换到哪个模式,分享态都不应残留) + this._shareLevelIndex = 0; + this._shareSubmissions.clear(); + this._isSubmittingShareResult = false; + this._hasRequestedShareUserInfo = false; + + if (this._isShareMode) { + console.log('[PageLevel] 切换到分享挑战模式'); + } else { + // 主线模式:从 AuthManager 拉取最新的 nextLevel + this._nextLevelData = null; + const nextLevel = AuthManager.instance.nextLevel; + if (nextLevel) { + this._currentLevelId = nextLevel.id; + this._currentLevelNumber = nextLevel.level; + console.log(`[PageLevel] 切换到主线挑战,进入关卡: 第 ${nextLevel.level} 关 (${nextLevel.id})`); + } else { + this._currentLevelId = ''; + this._currentLevelNumber = 0; + console.warn('[PageLevel] 切换到主线挑战,但没有可用关卡'); + } + } + + this._refreshModeUI(); + this.updateStaminaLabel(); + if (!this._isShareMode) { + this._startStaminaRecoverTimer(); + } + + // 异步加载关卡资源并调用进入关卡接口,完成后启动倒计时 + this._enterAndInitLevel().catch(err => { + console.error('[PageLevel] 模式切换后重新进入关卡失败:', err); + }); + } + /** * 页面隐藏时调用 */