BackgroundManager.ts 6.8 KB

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