import { _decorator, Component, Node, Sprite, SpriteFrame, resources, find, assetManager } from 'cc'; import { LevelConfigManager } from './LevelConfigManager'; import { SaveDataManager } from './SaveDataManager'; import EventBus, { GameEvents } from '../Core/EventBus'; const { ccclass, property } = _decorator; /** * 背景管理器 - 负责根据关卡配置动态设置游戏背景 */ @ccclass('BackgroundManager') export class BackgroundManager extends Component { @property(Node) backgroundNode: Node = null; // Canvas/GameLevelUI/Background节点 private backgroundSprite: Sprite = null; private levelConfigManager: LevelConfigManager = null; private saveDataManager: SaveDataManager = null; onLoad() { // 获取关卡配置管理器 this.levelConfigManager = LevelConfigManager.getInstance(); // 获取SaveDataManager实例 this.saveDataManager = SaveDataManager.getInstance(); // 监听关卡开始事件 EventBus.getInstance().on(GameEvents.GAME_START, this.onGameStart, this); } start() { this.initBackgroundSprite(); } /** * 初始化背景Sprite组件 */ private initBackgroundSprite() { // 如果编辑器中没有设置backgroundNode,尝试自动查找 if (!this.backgroundNode) { this.backgroundNode = find('Canvas/GameLevelUI/Background'); if (!this.backgroundNode) { console.warn('[BackgroundManager] 未找到Canvas/GameLevelUI/Background节点,请检查节点路径'); return; } } // 获取Sprite组件 this.backgroundSprite = this.backgroundNode.getComponent(Sprite); if (!this.backgroundSprite) { console.warn('[BackgroundManager] 背景节点上未找到Sprite组件,请为节点添加Sprite组件'); } else { console.log('[BackgroundManager] 背景Sprite组件初始化成功'); } } onDestroy() { // 移除事件监听 EventBus.getInstance().off(GameEvents.GAME_START, this.onGameStart, this); } /** * 游戏开始时设置背景 */ private async onGameStart() { await this.setBackgroundForCurrentLevel(); } /** * 根据当前关卡设置背景图片 */ public async setBackgroundForCurrentLevel() { if (!this.levelConfigManager || !this.saveDataManager) { console.warn('[BackgroundManager] LevelConfigManager或SaveDataManager未初始化'); return; } const currentLevel = this.saveDataManager.getCurrentLevel(); const levelConfig = await this.levelConfigManager.getLevelConfig(currentLevel); console.log(`[BackgroundManager] 当前关卡: ${currentLevel}`); console.log(`[BackgroundManager] 关卡配置:`, levelConfig); if (levelConfig && levelConfig.backgroundImage) { console.log(`[BackgroundManager] 关卡${currentLevel}配置的背景图片: ${levelConfig.backgroundImage}`); this.setBackground(levelConfig.backgroundImage); } else { // 使用默认背景 this.setBackground('images/LevelBackground/BG1'); console.log(`[BackgroundManager] 关卡${currentLevel}未配置背景图片,使用默认背景`); if (levelConfig) { console.log(`[BackgroundManager] 关卡配置中backgroundImage字段值:`, levelConfig.backgroundImage); } } } /** * 设置背景图片 * @param imagePath 图片路径(相对于resources目录) */ public setBackground(imagePath: string) { if (!this.backgroundSprite) { console.warn('[BackgroundManager] 背景Sprite组件未找到,无法设置背景'); return; } console.log(`[BackgroundManager] 开始加载背景图片: ${imagePath}`); // 确保resources bundle已加载 const resourcesBundle = assetManager.getBundle('resources'); if (!resourcesBundle) { console.warn('[BackgroundManager] resources bundle未找到,尝试加载...'); assetManager.loadBundle('resources', (err, bundle) => { if (err) { console.error('[BackgroundManager] 加载resources bundle失败:', err); return; } this.loadBackgroundImage(bundle, imagePath); }); } else { this.loadBackgroundImage(resourcesBundle, imagePath); } } /** * 加载背景图片 */ private loadBackgroundImage(bundle: any, imagePath: string) { // 正确的SpriteFrame子资源路径 const spriteFramePath = `${imagePath}/spriteFrame`; bundle.load(spriteFramePath, SpriteFrame, (err: any, spriteFrame: SpriteFrame) => { if (!err && spriteFrame && this.backgroundSprite && this.backgroundSprite.isValid) { this.backgroundSprite.spriteFrame = spriteFrame; console.log(`[BackgroundManager] 背景图片加载成功: ${imagePath}`); } else if (err) { console.warn(`[BackgroundManager] 背景图片加载失败: ${spriteFramePath}`, err); // 尝试使用resources.load作为备用方案 resources.load(spriteFramePath, SpriteFrame, (fallbackErr, fallbackSpriteFrame) => { if (!fallbackErr && fallbackSpriteFrame && this.backgroundSprite && this.backgroundSprite.isValid) { this.backgroundSprite.spriteFrame = fallbackSpriteFrame; console.log(`[BackgroundManager] 使用备用方案加载背景成功: ${imagePath}`); } else { // 尝试加载默认背景 if (imagePath !== 'images/LevelBackground/BG1') { console.log('[BackgroundManager] 尝试加载默认背景'); this.setBackground('images/LevelBackground/BG1'); } } }); } }); } /** * 根据指定关卡设置背景图片 * @param levelId 关卡ID */ public async setBackgroundForLevel(levelId: number) { if (!this.levelConfigManager) { console.warn('[BackgroundManager] LevelConfigManager未初始化'); return; } const levelConfig = await this.levelConfigManager.getLevelConfig(levelId); if (levelConfig && levelConfig.backgroundImage) { this.setBackground(levelConfig.backgroundImage); } else { // 使用默认背景 this.setBackground('images/LevelBackground/BG1'); console.log(`[BackgroundManager] 关卡${levelId}未配置背景图片,使用默认背景`); } } }