LevelMgr.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import { Node, Prefab, _decorator, assetManager, find, instantiate, sys } 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. import { TakeGobletGlobalInstance, WaterColors } from '../TakeGobletGlobalInstance';
  10. import { CocktailCup } from '../Component/CocktailCup';
  11. const { ccclass, property } = _decorator;
  12. @ccclass('LevelManager')
  13. export class LevelManager {
  14. private static _instance: LevelManager | null = null;
  15. public static get instance(): LevelManager {
  16. if (!this._instance) this._instance = new LevelManager();
  17. return this._instance;
  18. }
  19. public levelModel: LevelModel = null;
  20. currentLevel: Node = null!;
  21. randomLevel: number = 0;
  22. currentCups: CocktailCup[] = [];
  23. initilizeModel(): void {
  24. this.levelModel = new LevelModel();
  25. this.preloadLevel();
  26. this.registerEvent();
  27. }
  28. private registerEvent(): void {
  29. EventDispatcher.instance.on(GameEvent.EVENT_BATTLE_SUCCESS_LEVEL_UP, this.levelUpHandler, this);
  30. EventDispatcher.instance.on(GameEvent.EVENT_BATTLE_FAIL_LEVEL_RESET, this.restartLevelHandler, this);
  31. }
  32. async loadAsyncLevel(level: number): Promise<Prefab> {
  33. return new Promise((resolve, reject) => {
  34. const bundle = assetManager.getBundle(resLoader.gameBundleName);
  35. if (!bundle) {
  36. console.error("module_nut is null!");
  37. reject();
  38. }
  39. console.log('加载的level:', level);
  40. resLoader.loadAsync(resLoader.gameBundleName, `Prefabs/Levels/lvl_${level}`, Prefab).then((prefab: Prefab) => {
  41. resolve(prefab);
  42. })
  43. })
  44. }
  45. /** 预加载关卡*/
  46. async preloadLevel() {
  47. const bundle = assetManager.getBundle(resLoader.gameBundleName);
  48. for (let i = 1; i <= GlobalConfig.levelTotal; i++) {
  49. bundle.preload(`Prefabs/CarColorsLevels/lvl_${i}`, Prefab, null, () => {
  50. // console.log(`Level:${i} 预加载完成!`);
  51. })
  52. }
  53. }
  54. async levelUpHandler() {
  55. this.clearLevelData();
  56. this.upgradeLevel();
  57. this.levelModel.initLevelColors();
  58. await this.gameStart();
  59. }
  60. async restartLevelHandler() {
  61. this.clearLevelData();
  62. this.levelModel.initLevelColors();
  63. console.log('重新开始关卡 levelColors: ', this.levelModel.levelColors);
  64. await this.gameStart();
  65. }
  66. public async gameStart() {
  67. const { level } = this.levelModel;
  68. await this.loadLevel(level);
  69. }
  70. /** 清除关卡数据*/
  71. clearLevelData(): void {
  72. this.levelModel.clearLevel();
  73. }
  74. upgradeLevel(up: number = 1): void {
  75. this.levelModel.level += up;
  76. sys.localStorage.setItem('level', this.levelModel.level.toString());
  77. if (this.levelModel.level > GlobalConfig.levelTotal) {
  78. const randomLevelList = this.levelModel.randomLevelList;
  79. // 随机选择一个值
  80. let randomIndex = Math.floor(Math.random() * randomLevelList.length);
  81. let randomLevel = randomLevelList[randomIndex];
  82. // 如果随机到的关卡和当前关卡相同,则重新随机
  83. while (randomLevel === this.randomLevel && randomLevelList.length > 1) {
  84. randomIndex = Math.floor(Math.random() * randomLevelList.length);
  85. randomLevel = randomLevelList[randomIndex];
  86. }
  87. this.randomLevel = randomLevel;
  88. console.log(`随机真实关卡level: ${this.randomLevel}`);
  89. this.levelModel.levelConfig.init(this.randomLevel);
  90. }
  91. else {
  92. this.levelModel.levelConfig.init(this.levelModel.level);
  93. }
  94. EventDispatcher.instance.emit(GameEvent.EVENT_BATTLE_SUCCESS_LEVEL_UP);
  95. }
  96. async loadLevel(level: number): Promise<Node> {
  97. let levelPrefab = null;
  98. if (this.levelModel.level > GlobalConfig.levelTotal) {
  99. console.log('随机关卡加载 this.randomLevel: ' + this.randomLevel);
  100. levelPrefab = await this.loadAsyncLevel(this.randomLevel);
  101. } else {
  102. levelPrefab = await this.loadAsyncLevel(level);
  103. }
  104. if (this.currentLevel) {
  105. this.currentLevel.destroy();
  106. }
  107. if (!levelPrefab) {
  108. console.log(`关卡预设不存在 level: ${level}.`)
  109. return;
  110. }
  111. this.currentLevel = instantiate(levelPrefab);
  112. find("Canvas/Scene/Levels").removeAllChildren();
  113. find("Canvas/Scene/Levels").addChild(this.currentLevel);
  114. return this.currentLevel;
  115. }
  116. }