NewbieGuideManager.ts 6.9 KB

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