LevelManager.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import { _decorator, Component, sys } from 'cc';
  2. const { ccclass, property } = _decorator;
  3. /**
  4. * 关卡管理器
  5. * 负责关卡数据的保存、加载和切换
  6. */
  7. @ccclass('LevelManager')
  8. export class LevelManager extends Component {
  9. private static instance: LevelManager = null;
  10. private currentLevel: number = 1;
  11. private maxUnlockedLevel: number = 1;
  12. private levelData: any = {};
  13. onLoad() {
  14. if (LevelManager.instance === null) {
  15. LevelManager.instance = this;
  16. this.loadLevelData();
  17. } else if (LevelManager.instance !== this) {
  18. this.destroy();
  19. return;
  20. }
  21. }
  22. onDestroy() {
  23. if (LevelManager.instance === this) {
  24. LevelManager.instance = null;
  25. }
  26. }
  27. public static getInstance(): LevelManager {
  28. return LevelManager.instance;
  29. }
  30. // 加载关卡数据
  31. private loadLevelData() {
  32. const savedData = sys.localStorage.getItem('levelData');
  33. if (savedData) {
  34. try {
  35. const data = JSON.parse(savedData);
  36. this.currentLevel = data.currentLevel || 1;
  37. this.maxUnlockedLevel = data.maxUnlockedLevel || 1;
  38. this.levelData = data.levelData || {};
  39. console.log('关卡数据加载成功');
  40. } catch (error) {
  41. console.error('关卡数据解析失败:', error);
  42. this.resetLevelData();
  43. }
  44. } else {
  45. this.resetLevelData();
  46. }
  47. }
  48. // 保存关卡数据
  49. private saveLevelData() {
  50. const data = {
  51. currentLevel: this.currentLevel,
  52. maxUnlockedLevel: this.maxUnlockedLevel,
  53. levelData: this.levelData
  54. };
  55. try {
  56. sys.localStorage.setItem('levelData', JSON.stringify(data));
  57. console.log('关卡数据保存成功');
  58. } catch (error) {
  59. console.error('关卡数据保存失败:', error);
  60. }
  61. }
  62. // 重置关卡数据
  63. private resetLevelData() {
  64. this.currentLevel = 1;
  65. this.maxUnlockedLevel = 1;
  66. this.levelData = {};
  67. this.saveLevelData();
  68. }
  69. // 获取当前关卡
  70. public getCurrentLevel(): number {
  71. return this.currentLevel;
  72. }
  73. // 获取最大解锁关卡
  74. public getMaxUnlockedLevel(): number {
  75. return this.maxUnlockedLevel;
  76. }
  77. // 设置当前关卡
  78. public setCurrentLevel(level: number) {
  79. if (level <= this.maxUnlockedLevel && level >= 1) {
  80. this.currentLevel = level;
  81. this.saveLevelData();
  82. console.log(`切换到关卡 ${level}`);
  83. } else {
  84. console.warn(`关卡 ${level} 未解锁或无效`);
  85. }
  86. }
  87. // 完成关卡
  88. public completeLevel(level: number, score: number = 0, stars: number = 1) {
  89. // 解锁下一关
  90. if (level === this.maxUnlockedLevel) {
  91. this.maxUnlockedLevel = level + 1;
  92. }
  93. // 保存关卡成绩
  94. if (!this.levelData[level]) {
  95. this.levelData[level] = {};
  96. }
  97. const currentData = this.levelData[level];
  98. if (!currentData.bestScore || score > currentData.bestScore) {
  99. currentData.bestScore = score;
  100. }
  101. if (!currentData.bestStars || stars > currentData.bestStars) {
  102. currentData.bestStars = stars;
  103. }
  104. currentData.completed = true;
  105. currentData.completionTime = Date.now();
  106. this.saveLevelData();
  107. console.log(`关卡 ${level} 完成,得分: ${score},星级: ${stars}`);
  108. }
  109. // 获取关卡数据
  110. public getLevelData(level: number): any {
  111. return this.levelData[level] || {
  112. completed: false,
  113. bestScore: 0,
  114. bestStars: 0
  115. };
  116. }
  117. // 检查关卡是否已解锁
  118. public isLevelUnlocked(level: number): boolean {
  119. return level <= this.maxUnlockedLevel;
  120. }
  121. // 检查关卡是否已完成
  122. public isLevelCompleted(level: number): boolean {
  123. const data = this.getLevelData(level);
  124. return data.completed || false;
  125. }
  126. // 获取关卡最佳成绩
  127. public getLevelBestScore(level: number): number {
  128. const data = this.getLevelData(level);
  129. return data.bestScore || 0;
  130. }
  131. // 获取关卡最佳星级
  132. public getLevelBestStars(level: number): number {
  133. const data = this.getLevelData(level);
  134. return data.bestStars || 0;
  135. }
  136. // 重置所有关卡进度
  137. public resetAllProgress() {
  138. this.resetLevelData();
  139. console.log('所有关卡进度已重置');
  140. }
  141. // 解锁所有关卡(调试用)
  142. public unlockAllLevels(maxLevel: number = 100) {
  143. this.maxUnlockedLevel = maxLevel;
  144. this.saveLevelData();
  145. console.log(`已解锁所有关卡(最大关卡: ${maxLevel})`);
  146. }
  147. }