import { _decorator, director, find } from 'cc'; import { SaveDataManager } from '../LevelSystem/SaveDataManager'; import EventBus, { GameEvents } from './EventBus'; import { Audio, AudioManager } from '../AudioManager/AudioManager'; import { GuideUIController } from '../../NewbieGuidePlugin-v1.0.0/NewbieGuidePlugin-v1.0.0/scripts/GuideUIController'; const { ccclass } = _decorator; /** * 新手引导管理器 * 负责管理新手引导的状态和自动触发机制 */ @ccclass('NewbieGuideManager') export class NewbieGuideManager { private static _instance: NewbieGuideManager; private saveDataManager: SaveDataManager; private isInProgress: boolean = false; private hasCheckedOnSceneLoad: boolean = false; private constructor() { this.saveDataManager = SaveDataManager.getInstance(); this.setupEventListeners(); } public static getInstance(): NewbieGuideManager { if (!NewbieGuideManager._instance) { NewbieGuideManager._instance = new NewbieGuideManager(); } return NewbieGuideManager._instance; } /** * 设置事件监听器 */ private setupEventListeners(): void { // 监听游戏开始事件,检查是否需要启动新手引导 EventBus.getInstance().on(GameEvents.GAME_START, this.onGameStart, this); } /** * 在GameLevel场景加载时检查并自动启动新手引导 * 这个方法应该在MainUIController的onLoad中调用 */ public checkAndStartNewbieGuideOnSceneLoad(): void { // 每次场景加载都重新评估引导状态,避免状态在后续关卡残留 console.log('[NewbieGuideManager] 场景加载时检查新手引导状态'); const currentLevel = this.saveDataManager?.getCurrentLevel?.() ?? 1; if (currentLevel === 1) { console.log('[NewbieGuideManager] 读取第1关,启动新手引导流程'); this.startNewbieGuide(); } else { this.isInProgress = false; console.log('[NewbieGuideManager] 非第1关,关闭新手引导'); // 确保引导遮罩与层级被关闭,避免残留阻挡 try { const guideMaskAreas = find('Canvas/GuideMaskAreas'); if (guideMaskAreas) { guideMaskAreas.active = false; console.log('[NewbieGuideManager] 已隐藏Canvas/GuideMaskAreas'); } const guideLayer = find('Canvas/GuideLayer'); if (guideLayer) { guideLayer.active = false; console.log('[NewbieGuideManager] 已隐藏Canvas/GuideLayer'); } } catch (e) { console.warn('[NewbieGuideManager] 隐藏引导遮罩层失败:', e); } } } /** * 启动新手引导流程 */ private startNewbieGuide(): void { this.isInProgress = true; console.log('[NewbieGuideManager] 新手引导开始,自动触发战斗流程'); // 确保主界面音乐已停止 Audio.stopMusic(); console.log('[NewbieGuideManager] 已停止主界面音乐'); // 立即触发战斗流程 this.triggerBattleFlow(); } /** * 检查用户是否是新用户(第一次游戏) * @returns true表示是新用户,需要新手引导 */ public isNewUser(): boolean { // 重写显示逻辑:仅当当前关卡为第1关时视为需要新手引导 if (!this.saveDataManager || typeof this.saveDataManager.getCurrentLevel !== 'function') return false; const currentLevel = this.saveDataManager.getCurrentLevel(); return currentLevel === 1; } /** * 检查玩家是否是新手(第一次游戏) * @returns true表示是新手,需要新手引导 */ public isNewPlayer(): boolean { if (!this.saveDataManager) { console.warn('[NewbieGuideManager] SaveDataManager未初始化'); return false; } const playerData = this.saveDataManager.getPlayerData(); // 检查是否有新手引导完成标记 if (playerData.settings && playerData.settings.newbieGuideCompleted !== undefined) { return !playerData.settings.newbieGuideCompleted; } // 如果没有设置,检查其他指标判断是否是新手 // 比如当前关卡是否为1,总游戏时间是否为0等 const isNewbie = playerData.currentLevel === 1 && playerData.statistics.totalPlayTime === 0 && playerData.statistics.totalGamesPlayed === 0; console.log('[NewbieGuideManager] 新手检查结果:', { currentLevel: playerData.currentLevel, totalPlayTime: playerData.statistics.totalPlayTime, totalGamesPlayed: playerData.statistics.totalGamesPlayed, isNewbie: isNewbie }); return isNewbie; } /** * 标记新手引导已完成 */ public markNewbieGuideCompleted(): void { if (!this.saveDataManager) { console.warn('[NewbieGuideManager] SaveDataManager未初始化'); return; } const playerData = this.saveDataManager.getPlayerData(); if (!playerData.settings) { playerData.settings = { soundEnabled: true, musicEnabled: true, soundVolume: 0.8, musicVolume: 0.6, vibrationEnabled: true, autoSaveEnabled: true, language: 'zh-CN', graphics: 'medium', newbieGuideCompleted: false }; } playerData.settings.newbieGuideCompleted = true; this.saveDataManager.savePlayerData(true); this.isInProgress = false; console.log('[NewbieGuideManager] 新手引导已标记为完成'); } /** * 重置新手引导状态(用于测试) */ public resetNewbieGuideStatus(): void { if (!this.saveDataManager) { console.warn('[NewbieGuideManager] SaveDataManager未初始化'); return; } const playerData = this.saveDataManager.getPlayerData(); if (!playerData.settings) { playerData.settings = { soundEnabled: true, musicEnabled: true, soundVolume: 0.8, musicVolume: 0.6, vibrationEnabled: true, autoSaveEnabled: true, language: 'zh-CN', graphics: 'medium', newbieGuideCompleted: false }; } playerData.settings.newbieGuideCompleted = false; this.saveDataManager.savePlayerData(); console.log('[NewbieGuideManager] 新手引导状态已重置'); } /** * 检查当前是否正在进行新手引导 */ public isNewbieGuideInProgress(): boolean { return this.isInProgress; } /** * 自动触发战斗流程 * 模拟玩家点击战斗按钮的行为 */ private triggerBattleFlow(): void { console.log('[NewbieGuideManager] 新手引导:自动触发战斗流程'); // 发送新手引导开始事件 EventBus.getInstance().emit('NEWBIE_GUIDE_BATTLE_START'); // 这里我们不直接调用MainUIController的onBattle方法 // 而是通过事件系统通知MainUIController执行战斗流程 // 这样可以保持代码的解耦 // // 注意:音频播放控制已移除,现在由IN_game.ts的UI显隐控制统一管理 // 当GameLevelUI显示时会自动播放战斗音乐,当MainUI显示时会自动播放主界面音乐 } /** * 游戏开始时的处理逻辑 */ private onGameStart(): void { console.log('[NewbieGuideManager] 游戏开始,检查新手引导状态'); if (this.isNewUser() && !this.isInProgress) { console.log('[NewbieGuideManager] 检测到新用户,但新手引导未启动,这可能是正常游戏流程'); } // 如果是新手引导模式,启动GuideUIController if (this.isInProgress) { this.startGuideUIController(); } } /** * 启动GuideUIController */ private startGuideUIController(): void { console.log('[NewbieGuideManager] 启动GuideUIController'); // 查找Canvas上的GuideUIController组件 const canvas = find('Canvas'); if (!canvas) { console.warn('[NewbieGuideManager] 未找到Canvas节点'); return; } const guideUIController = canvas.getComponent(GuideUIController); if (!guideUIController) { console.warn('[NewbieGuideManager] Canvas上未找到GuideUIController组件'); return; } // 启动引导序列 guideUIController.startGuideSequence(); console.log('[NewbieGuideManager] GuideUIController已启动'); } /** * 获取新手引导进度 * 可以用于显示引导进度或判断引导阶段 */ public getNewbieGuideProgress(): number { if (!this.isInProgress) { return this.isNewPlayer() ? 0 : 100; } // 这里可以根据具体的引导步骤来计算进度 // 暂时返回50表示正在进行中 return 50; } }