LevelManager.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import { sys } from 'cc';
  2. /**
  3. * 关卡管理器
  4. * 负责关卡数据的保存、加载和切换
  5. * 注意:这是一个纯数据管理类,不需要挂载到节点上
  6. */
  7. export class LevelManager {
  8. private static instance: LevelManager = null;
  9. private currentLevel: number = 1;
  10. private maxUnlockedLevel: number = 1;
  11. private levelData: any = {};
  12. private initialized: boolean = false;
  13. private constructor() {
  14. // 私有构造函数,确保单例模式
  15. }
  16. public static getInstance(): LevelManager {
  17. if (LevelManager.instance === null) {
  18. LevelManager.instance = new LevelManager();
  19. LevelManager.instance.initialize();
  20. }
  21. return LevelManager.instance;
  22. }
  23. // 初始化关卡管理器
  24. private initialize() {
  25. if (this.initialized) return;
  26. this.loadLevelData();
  27. this.initialized = true;
  28. }
  29. // 加载关卡数据
  30. private loadLevelData() {
  31. const savedData = sys.localStorage.getItem('levelData');
  32. if (savedData) {
  33. try {
  34. const data = JSON.parse(savedData);
  35. this.currentLevel = data.currentLevel || 1;
  36. this.maxUnlockedLevel = data.maxUnlockedLevel || 1;
  37. this.levelData = data.levelData || {};
  38. } catch (error) {
  39. this.resetLevelData();
  40. }
  41. } else {
  42. this.resetLevelData();
  43. }
  44. }
  45. // 保存关卡数据
  46. private saveLevelData() {
  47. const data = {
  48. currentLevel: this.currentLevel,
  49. maxUnlockedLevel: this.maxUnlockedLevel,
  50. levelData: this.levelData
  51. };
  52. try {
  53. sys.localStorage.setItem('levelData', JSON.stringify(data));
  54. } catch (error) {
  55. // 静默处理保存错误
  56. }
  57. }
  58. // 重置关卡数据
  59. private resetLevelData() {
  60. this.currentLevel = 1;
  61. this.maxUnlockedLevel = 1;
  62. this.levelData = {};
  63. this.saveLevelData();
  64. }
  65. // 获取当前关卡
  66. public getCurrentLevel(): number {
  67. return this.currentLevel;
  68. }
  69. // 获取最大解锁关卡
  70. public getMaxUnlockedLevel(): number {
  71. return this.maxUnlockedLevel;
  72. }
  73. // 设置当前关卡
  74. public setCurrentLevel(level: number) {
  75. if (level <= this.maxUnlockedLevel && level >= 1) {
  76. this.currentLevel = level;
  77. this.saveLevelData();
  78. }
  79. }
  80. // 完成关卡
  81. public completeLevel(level: number, score: number = 0) {
  82. // 解锁下一关
  83. if (level === this.maxUnlockedLevel) {
  84. this.maxUnlockedLevel = level + 1;
  85. }
  86. // 保存关卡成绩
  87. if (!this.levelData[level]) {
  88. this.levelData[level] = {};
  89. }
  90. const currentData = this.levelData[level];
  91. if (!currentData.bestScore || score > currentData.bestScore) {
  92. currentData.bestScore = score;
  93. }
  94. currentData.completed = true;
  95. currentData.completionTime = Date.now();
  96. this.saveLevelData();
  97. }
  98. // 获取关卡数据
  99. public getLevelData(level: number): any {
  100. return this.levelData[level] || {
  101. completed: false,
  102. bestScore: 0
  103. };
  104. }
  105. // 检查关卡是否已解锁
  106. public isLevelUnlocked(level: number): boolean {
  107. return level <= this.maxUnlockedLevel;
  108. }
  109. // 检查关卡是否已完成
  110. public isLevelCompleted(level: number): boolean {
  111. const data = this.getLevelData(level);
  112. return data.completed || false;
  113. }
  114. // 获取关卡最佳成绩
  115. public getLevelBestScore(level: number): number {
  116. const data = this.getLevelData(level);
  117. return data.bestScore || 0;
  118. }
  119. // 重置所有关卡进度
  120. public resetAllProgress() {
  121. this.resetLevelData();
  122. }
  123. // 解锁所有关卡(调试用)
  124. public unlockAllLevels(maxLevel: number = 100) {
  125. this.maxUnlockedLevel = maxLevel;
  126. this.saveLevelData();
  127. }
  128. }