NewbieGuideManager.ts 8.4 KB

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