LevelMgr.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import { Node, Prefab, _decorator, assetManager, find, instantiate } from 'cc';
  2. import { resLoader } from 'db://assets/core_tgx/base/ResLoader';
  3. import { EventDispatcher } from 'db://assets/core_tgx/easy_ui_framework/EventDispatcher';
  4. import { GlobalConfig } from '../../../start/Config/GlobalConfig';
  5. import { GameEvent } from '../Enum/GameEvent';
  6. import { LevelAction } from '../LevelAction';
  7. import { LevelModel } from '../Model/LevelModel';
  8. import { GameUtil } from '../GameUtil';
  9. const { ccclass, property } = _decorator;
  10. @ccclass('LevelManager')
  11. export class LevelManager {
  12. private static _instance: LevelManager | null = null;
  13. public static get instance(): LevelManager {
  14. if (!this._instance) this._instance = new LevelManager();
  15. return this._instance;
  16. }
  17. public levelModel: LevelModel = null;
  18. currentLevel: Node = null!;
  19. randomLevel: number = 0;
  20. initilizeModel(): void {
  21. this.levelModel = new LevelModel();
  22. this.preloadLevel();
  23. this.registerEvent();
  24. }
  25. private registerEvent(): void {
  26. // EventDispatcher.instance.on(GameEvent.EVENT_BATTLE_SUCCESS_LEVEL_UP, this.levelUpHandler, this);
  27. EventDispatcher.instance.on(GameEvent.EVENT_BATTLE_FAIL_LEVEL_RESET, this.restartLevelHandler, this);
  28. }
  29. async loadAsyncLevel(level: number): Promise<Prefab> {
  30. return new Promise((resolve, reject) => {
  31. const bundle = assetManager.getBundle(resLoader.gameBundleName);
  32. if (!bundle) {
  33. console.error("module_nut is null!");
  34. reject();
  35. }
  36. console.log('加载的level:', level);
  37. resLoader.loadAsync(resLoader.gameBundleName, `Prefabs/CarColorsLevels/lvl_${level}`, Prefab).then((prefab: Prefab) => {
  38. resolve(prefab);
  39. })
  40. })
  41. }
  42. /** 预加载关卡*/
  43. async preloadLevel() {
  44. const bundle = assetManager.getBundle(resLoader.gameBundleName);
  45. for (let i = 1; i <= GlobalConfig.levelTotal; i++) {
  46. bundle.preload(`Prefabs/CarColorsLevels/lvl_${i}`, Prefab, null, () => {
  47. console.log(`Level:${i} 预加载完成!`);
  48. })
  49. }
  50. }
  51. async levelUpHandler() {
  52. this.clearLevelData();
  53. this.upgradeLevel();
  54. await this.gameStart();
  55. }
  56. async restartLevelHandler() {
  57. this.clearLevelData();
  58. await this.gameStart();
  59. }
  60. public async gameStart() {
  61. const { level } = this.levelModel;
  62. await this.loadLevel(level);
  63. await GameUtil.delay(0.2);
  64. EventDispatcher.instance.emit(GameEvent.EVENT_UPDATE_LEFT_NAIL);
  65. }
  66. /** 清除关卡数据*/
  67. clearLevelData(): void {
  68. this.levelModel.clearLevel();
  69. }
  70. upgradeLevel(up: number = 1): void {
  71. this.levelModel.level += up;
  72. EventDispatcher.instance.emit(GameEvent.EVENT_BATTLE_SUCCESS_LEVEL_UP);
  73. }
  74. async loadLevel(level: number): Promise<Node> {
  75. let levelPrefab = null;
  76. levelPrefab = await this.loadAsyncLevel(level);
  77. if (this.currentLevel) {
  78. this.currentLevel.destroy();
  79. }
  80. if (!levelPrefab) {
  81. console.log(`关卡预设不存在 level: ${level}.`)
  82. return;
  83. }
  84. this.currentLevel = instantiate(levelPrefab);
  85. find("Canvas/Scene/Levels").removeAllChildren();
  86. find("Canvas/Scene/Levels").addChild(this.currentLevel);
  87. return this.currentLevel;
  88. }
  89. }