| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- 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 {
- if (this.hasCheckedOnSceneLoad) {
- return; // 避免重复检查
- }
-
- this.hasCheckedOnSceneLoad = true;
- 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关,关闭新手引导');
- }
- }
- /**
- * 启动新手引导流程
- */
- 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;
- }
- }
|