| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- 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}未配置背景图片,使用默认背景`);
- }
- }
- }
|