LevelSessionManager.ts 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import { resources, JsonAsset } from 'cc';
  2. export interface LevelRuntimeData {
  3. levelId: number; // 本局关卡
  4. wallHealth: number; // 当前墙血
  5. enemiesTotal: number; // 本关总敌人
  6. enemiesKilled: number; // 已击杀
  7. currentWave: number; // 当前波
  8. //drops: DropItemData[]; // 已掉落的道具
  9. startTime: number;
  10. sessionCoins: number; // 本局金币(购买方块)
  11. }
  12. export class LevelSessionManager {
  13. private static _inst: LevelSessionManager;
  14. public static get inst() { return this._inst || (this._inst = new LevelSessionManager()); }
  15. private data: LevelRuntimeData = null;
  16. /** 准备本关运行期数据 */
  17. public async initialize(levelId: number, wallHealth: number) {
  18. // 从关卡配置读取初始金币
  19. const initialCoins = await this.loadInitialCoins(levelId);
  20. this.data = {
  21. levelId,
  22. wallHealth,
  23. enemiesTotal: 0,
  24. enemiesKilled: 0,
  25. currentWave: 1,
  26. //drops: [],
  27. startTime: Date.now(),
  28. sessionCoins: initialCoins
  29. };
  30. console.log(`[LevelSessionManager] 初始化完成,关卡${levelId}初始金币设置为: ${this.data.sessionCoins}`);
  31. }
  32. /** 从关卡配置文件加载初始金币数量 */
  33. private async loadInitialCoins(levelId: number): Promise<number> {
  34. try {
  35. const jsonPath = `data/levels/Level${levelId}`;
  36. console.log(`[LevelSessionManager] 尝试加载关卡配置: ${jsonPath}`);
  37. return new Promise<number>((resolve) => {
  38. resources.load(jsonPath, JsonAsset, (err, asset) => {
  39. if (err) {
  40. console.warn(`[LevelSessionManager] 加载关卡${levelId}配置失败,使用默认初始金币45:`, err);
  41. resolve(45); // 默认值
  42. return;
  43. }
  44. const levelConfig = asset.json;
  45. if (levelConfig && typeof levelConfig.initialCoins === 'number') {
  46. console.log(`[LevelSessionManager] 关卡${levelId}初始金币配置: ${levelConfig.initialCoins}`);
  47. resolve(levelConfig.initialCoins);
  48. } else {
  49. console.warn(`[LevelSessionManager] 关卡${levelId}配置中未找到initialCoins字段,使用默认值45`);
  50. resolve(45); // 默认值
  51. }
  52. });
  53. });
  54. } catch (error) {
  55. console.error(`[LevelSessionManager] 加载关卡${levelId}初始金币配置时发生错误:`, error);
  56. return 45; // 默认值
  57. }
  58. }
  59. public get runtime() { return this.data; }
  60. /** 关卡结束后调用,让 GC 自动回收 */
  61. public clear() { this.data = null; }
  62. // ======== 本局金币接口 ========
  63. public getCoins(): number {
  64. const coins = this.data?.sessionCoins ?? 0;
  65. console.log(`[LevelSessionManager] getCoins() 返回: ${coins}, data存在: ${!!this.data}`);
  66. return coins;
  67. }
  68. public addCoins(amt:number){ if(this.data) this.data.sessionCoins += amt; }
  69. /** 成功返回true */
  70. public spendCoins(amt:number):boolean{ if(!this.data || amt<=0) return false; if(this.data.sessionCoins<amt) return false; this.data.sessionCoins-=amt; return true; }
  71. }