LevelSessionManager.ts 2.9 KB

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