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