BackgroundManager.ts 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import { _decorator, Component, Node, Sprite, SpriteFrame, resources, find, assetManager } from 'cc';
  2. import { LevelConfigManager } from './LevelConfigManager';
  3. import { SaveDataManager } from './SaveDataManager';
  4. import EventBus, { GameEvents } from '../Core/EventBus';
  5. import { BundleLoader } from '../Core/BundleLoader';
  6. const { ccclass, property } = _decorator;
  7. /**
  8. * 背景管理器 - 负责根据关卡配置动态设置游戏背景
  9. */
  10. @ccclass('BackgroundManager')
  11. export class BackgroundManager extends Component {
  12. @property(Node)
  13. backgroundNode: Node = null; // Canvas/GameLevelUI/Background节点
  14. private backgroundSprite: Sprite = null;
  15. private levelConfigManager: LevelConfigManager = null;
  16. private saveDataManager: SaveDataManager = null;
  17. private bundleLoader: BundleLoader = null;
  18. onLoad() {
  19. // 获取关卡配置管理器
  20. this.levelConfigManager = LevelConfigManager.getInstance();
  21. // 获取SaveDataManager实例
  22. this.saveDataManager = SaveDataManager.getInstance();
  23. // 获取BundleLoader实例
  24. this.bundleLoader = BundleLoader.getInstance();
  25. // 监听关卡开始事件
  26. EventBus.getInstance().on(GameEvents.GAME_START, this.onGameStart, this);
  27. }
  28. start() {
  29. this.initBackgroundSprite();
  30. }
  31. /**
  32. * 初始化背景Sprite组件
  33. */
  34. private initBackgroundSprite() {
  35. // 如果编辑器中没有设置backgroundNode,尝试自动查找
  36. if (!this.backgroundNode) {
  37. this.backgroundNode = find('Canvas/GameLevelUI/Background');
  38. if (!this.backgroundNode) {
  39. console.warn('[BackgroundManager] 未找到Canvas/GameLevelUI/Background节点,请检查节点路径');
  40. return;
  41. }
  42. }
  43. // 获取Sprite组件
  44. this.backgroundSprite = this.backgroundNode.getComponent(Sprite);
  45. if (!this.backgroundSprite) {
  46. console.warn('[BackgroundManager] 背景节点上未找到Sprite组件,请为节点添加Sprite组件');
  47. } else {
  48. console.log('[BackgroundManager] 背景Sprite组件初始化成功');
  49. }
  50. }
  51. onDestroy() {
  52. // 移除事件监听
  53. EventBus.getInstance().off(GameEvents.GAME_START, this.onGameStart, this);
  54. }
  55. /**
  56. * 游戏开始时设置背景
  57. */
  58. private async onGameStart() {
  59. await this.setBackgroundForCurrentLevel();
  60. }
  61. /**
  62. * 根据当前关卡设置背景图片
  63. */
  64. public async setBackgroundForCurrentLevel() {
  65. if (!this.levelConfigManager || !this.saveDataManager) {
  66. console.warn('[BackgroundManager] LevelConfigManager或SaveDataManager未初始化');
  67. return;
  68. }
  69. const currentLevel = this.saveDataManager.getCurrentLevel();
  70. const levelConfig = await this.levelConfigManager.getLevelConfig(currentLevel);
  71. console.log(`[BackgroundManager] 当前关卡: ${currentLevel}`);
  72. console.log(`[BackgroundManager] 关卡配置:`, levelConfig);
  73. if (levelConfig && levelConfig.backgroundImage) {
  74. console.log(`[BackgroundManager] 关卡${currentLevel}配置的背景图片: ${levelConfig.backgroundImage}`);
  75. // 转换路径格式:从 "images/LevelBackground/BG1" 转换为 "LevelBackground/BG1"
  76. const bundlePath = levelConfig.backgroundImage.replace('images/', '');
  77. await this.setBackground(bundlePath);
  78. } else {
  79. // 使用默认背景
  80. await this.setBackground('LevelBackground/BG1');
  81. console.log(`[BackgroundManager] 关卡${currentLevel}未配置背景图片,使用默认背景`);
  82. if (levelConfig) {
  83. console.log(`[BackgroundManager] 关卡配置中backgroundImage字段值:`, levelConfig.backgroundImage);
  84. }
  85. }
  86. }
  87. /**
  88. * 设置背景图片
  89. * @param imagePath 图片路径(相对于images Bundle根目录)
  90. */
  91. public async setBackground(imagePath: string) {
  92. if (!this.backgroundSprite) {
  93. console.warn('[BackgroundManager] 背景Sprite组件未找到,无法设置背景');
  94. return;
  95. }
  96. console.log(`[BackgroundManager] 开始从images Bundle加载背景图片: ${imagePath}`);
  97. try {
  98. // 从images Bundle加载SpriteFrame
  99. const spriteFrame = await this.bundleLoader.loadSpriteFrame(`${imagePath}/spriteFrame`);
  100. if (spriteFrame && this.backgroundSprite && this.backgroundSprite.isValid) {
  101. this.backgroundSprite.spriteFrame = spriteFrame;
  102. console.log(`[BackgroundManager] 背景图片加载成功: ${imagePath}`);
  103. }
  104. } catch (error) {
  105. console.error(`[BackgroundManager] 背景图片加载失败: ${imagePath}`, error);
  106. // 如果不是默认背景,尝试加载默认背景
  107. if (imagePath !== 'LevelBackground/BG1') {
  108. console.log('[BackgroundManager] 尝试加载默认背景');
  109. await this.setBackground('LevelBackground/BG1');
  110. }
  111. }
  112. }
  113. /**
  114. * 根据指定关卡设置背景图片
  115. * @param levelId 关卡ID
  116. */
  117. public async setBackgroundForLevel(levelId: number) {
  118. if (!this.levelConfigManager) {
  119. console.warn('[BackgroundManager] LevelConfigManager未初始化');
  120. return;
  121. }
  122. const levelConfig = await this.levelConfigManager.getLevelConfig(levelId);
  123. if (levelConfig && levelConfig.backgroundImage) {
  124. // 转换路径格式:从 "images/LevelBackground/BG1" 转换为 "LevelBackground/BG1"
  125. const bundlePath = levelConfig.backgroundImage.replace('images/', '');
  126. await this.setBackground(bundlePath);
  127. } else {
  128. // 使用默认背景
  129. await this.setBackground('LevelBackground/BG1');
  130. console.log(`[BackgroundManager] 关卡${levelId}未配置背景图片,使用默认背景`);
  131. }
  132. }
  133. }