NewbieGuideManager.ts 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. import { _decorator, director, find } from 'cc';
  2. import { SaveDataManager } from '../LevelSystem/SaveDataManager';
  3. import EventBus, { GameEvents } from './EventBus';
  4. import { Audio, AudioManager } from '../AudioManager/AudioManager';
  5. import { GuideUIController } from '../../NewbieGuidePlugin-v1.0.0/NewbieGuidePlugin-v1.0.0/scripts/GuideUIController';
  6. const { ccclass } = _decorator;
  7. /**
  8. * 新手引导管理器
  9. * 负责管理新手引导的状态和自动触发机制
  10. */
  11. @ccclass('NewbieGuideManager')
  12. export class NewbieGuideManager {
  13. private static _instance: NewbieGuideManager;
  14. private saveDataManager: SaveDataManager;
  15. private isInProgress: boolean = false;
  16. private hasCheckedOnSceneLoad: boolean = false;
  17. private constructor() {
  18. this.saveDataManager = SaveDataManager.getInstance();
  19. this.setupEventListeners();
  20. }
  21. public static getInstance(): NewbieGuideManager {
  22. if (!NewbieGuideManager._instance) {
  23. NewbieGuideManager._instance = new NewbieGuideManager();
  24. }
  25. return NewbieGuideManager._instance;
  26. }
  27. /**
  28. * 设置事件监听器
  29. */
  30. private setupEventListeners(): void {
  31. // 监听游戏开始事件,检查是否需要启动新手引导
  32. EventBus.getInstance().on(GameEvents.GAME_START, this.onGameStart, this);
  33. }
  34. /**
  35. * 在GameLevel场景加载时检查并自动启动新手引导
  36. * 这个方法应该在MainUIController的onLoad中调用
  37. */
  38. public checkAndStartNewbieGuideOnSceneLoad(): void {
  39. if (this.hasCheckedOnSceneLoad) {
  40. return; // 避免重复检查
  41. }
  42. this.hasCheckedOnSceneLoad = true;
  43. console.log('[NewbieGuideManager] 场景加载时检查新手引导状态');
  44. const currentLevel = this.saveDataManager?.getCurrentLevel?.() ?? 1;
  45. if (currentLevel === 1) {
  46. console.log('[NewbieGuideManager] 读取第1关,启动新手引导流程');
  47. this.startNewbieGuide();
  48. } else {
  49. this.isInProgress = false;
  50. console.log('[NewbieGuideManager] 非第1关,关闭新手引导');
  51. }
  52. }
  53. /**
  54. * 启动新手引导流程
  55. */
  56. private startNewbieGuide(): void {
  57. this.isInProgress = true;
  58. console.log('[NewbieGuideManager] 新手引导开始,自动触发战斗流程');
  59. // 确保主界面音乐已停止
  60. Audio.stopMusic();
  61. console.log('[NewbieGuideManager] 已停止主界面音乐');
  62. // 立即触发战斗流程
  63. this.triggerBattleFlow();
  64. }
  65. /**
  66. * 检查用户是否是新用户(第一次游戏)
  67. * @returns true表示是新用户,需要新手引导
  68. */
  69. public isNewUser(): boolean {
  70. // 重写显示逻辑:仅当当前关卡为第1关时视为需要新手引导
  71. if (!this.saveDataManager || typeof this.saveDataManager.getCurrentLevel !== 'function') return false;
  72. const currentLevel = this.saveDataManager.getCurrentLevel();
  73. return currentLevel === 1;
  74. }
  75. /**
  76. * 检查玩家是否是新手(第一次游戏)
  77. * @returns true表示是新手,需要新手引导
  78. */
  79. public isNewPlayer(): boolean {
  80. if (!this.saveDataManager) {
  81. console.warn('[NewbieGuideManager] SaveDataManager未初始化');
  82. return false;
  83. }
  84. const playerData = this.saveDataManager.getPlayerData();
  85. // 检查是否有新手引导完成标记
  86. if (playerData.settings && playerData.settings.newbieGuideCompleted !== undefined) {
  87. return !playerData.settings.newbieGuideCompleted;
  88. }
  89. // 如果没有设置,检查其他指标判断是否是新手
  90. // 比如当前关卡是否为1,总游戏时间是否为0等
  91. const isNewbie = playerData.currentLevel === 1 &&
  92. playerData.statistics.totalPlayTime === 0 &&
  93. playerData.statistics.totalGamesPlayed === 0;
  94. console.log('[NewbieGuideManager] 新手检查结果:', {
  95. currentLevel: playerData.currentLevel,
  96. totalPlayTime: playerData.statistics.totalPlayTime,
  97. totalGamesPlayed: playerData.statistics.totalGamesPlayed,
  98. isNewbie: isNewbie
  99. });
  100. return isNewbie;
  101. }
  102. /**
  103. * 标记新手引导已完成
  104. */
  105. public markNewbieGuideCompleted(): void {
  106. if (!this.saveDataManager) {
  107. console.warn('[NewbieGuideManager] SaveDataManager未初始化');
  108. return;
  109. }
  110. const playerData = this.saveDataManager.getPlayerData();
  111. if (!playerData.settings) {
  112. playerData.settings = {
  113. soundEnabled: true,
  114. musicEnabled: true,
  115. soundVolume: 0.8,
  116. musicVolume: 0.6,
  117. vibrationEnabled: true,
  118. autoSaveEnabled: true,
  119. language: 'zh-CN',
  120. graphics: 'medium',
  121. newbieGuideCompleted: false
  122. };
  123. }
  124. playerData.settings.newbieGuideCompleted = true;
  125. this.saveDataManager.savePlayerData(true);
  126. this.isInProgress = false;
  127. console.log('[NewbieGuideManager] 新手引导已标记为完成');
  128. }
  129. /**
  130. * 重置新手引导状态(用于测试)
  131. */
  132. public resetNewbieGuideStatus(): void {
  133. if (!this.saveDataManager) {
  134. console.warn('[NewbieGuideManager] SaveDataManager未初始化');
  135. return;
  136. }
  137. const playerData = this.saveDataManager.getPlayerData();
  138. if (!playerData.settings) {
  139. playerData.settings = {
  140. soundEnabled: true,
  141. musicEnabled: true,
  142. soundVolume: 0.8,
  143. musicVolume: 0.6,
  144. vibrationEnabled: true,
  145. autoSaveEnabled: true,
  146. language: 'zh-CN',
  147. graphics: 'medium',
  148. newbieGuideCompleted: false
  149. };
  150. }
  151. playerData.settings.newbieGuideCompleted = false;
  152. this.saveDataManager.savePlayerData();
  153. console.log('[NewbieGuideManager] 新手引导状态已重置');
  154. }
  155. /**
  156. * 检查当前是否正在进行新手引导
  157. */
  158. public isNewbieGuideInProgress(): boolean {
  159. return this.isInProgress;
  160. }
  161. /**
  162. * 自动触发战斗流程
  163. * 模拟玩家点击战斗按钮的行为
  164. */
  165. private triggerBattleFlow(): void {
  166. console.log('[NewbieGuideManager] 新手引导:自动触发战斗流程');
  167. // 发送新手引导开始事件
  168. EventBus.getInstance().emit('NEWBIE_GUIDE_BATTLE_START');
  169. // 这里我们不直接调用MainUIController的onBattle方法
  170. // 而是通过事件系统通知MainUIController执行战斗流程
  171. // 这样可以保持代码的解耦
  172. //
  173. // 注意:音频播放控制已移除,现在由IN_game.ts的UI显隐控制统一管理
  174. // 当GameLevelUI显示时会自动播放战斗音乐,当MainUI显示时会自动播放主界面音乐
  175. }
  176. /**
  177. * 游戏开始时的处理逻辑
  178. */
  179. private onGameStart(): void {
  180. console.log('[NewbieGuideManager] 游戏开始,检查新手引导状态');
  181. if (this.isNewUser() && !this.isInProgress) {
  182. console.log('[NewbieGuideManager] 检测到新用户,但新手引导未启动,这可能是正常游戏流程');
  183. }
  184. // 如果是新手引导模式,启动GuideUIController
  185. if (this.isInProgress) {
  186. this.startGuideUIController();
  187. }
  188. }
  189. /**
  190. * 启动GuideUIController
  191. */
  192. private startGuideUIController(): void {
  193. console.log('[NewbieGuideManager] 启动GuideUIController');
  194. // 查找Canvas上的GuideUIController组件
  195. const canvas = find('Canvas');
  196. if (!canvas) {
  197. console.warn('[NewbieGuideManager] 未找到Canvas节点');
  198. return;
  199. }
  200. const guideUIController = canvas.getComponent(GuideUIController);
  201. if (!guideUIController) {
  202. console.warn('[NewbieGuideManager] Canvas上未找到GuideUIController组件');
  203. return;
  204. }
  205. // 启动引导序列
  206. guideUIController.startGuideSequence();
  207. console.log('[NewbieGuideManager] GuideUIController已启动');
  208. }
  209. /**
  210. * 获取新手引导进度
  211. * 可以用于显示引导进度或判断引导阶段
  212. */
  213. public getNewbieGuideProgress(): number {
  214. if (!this.isInProgress) {
  215. return this.isNewPlayer() ? 0 : 100;
  216. }
  217. // 这里可以根据具体的引导步骤来计算进度
  218. // 暂时返回50表示正在进行中
  219. return 50;
  220. }
  221. }