|
|
@@ -1,4 +1,5 @@
|
|
|
import { _decorator, Component, Node, Button, Label, Sprite, SpriteFrame, Texture2D, resources, ScrollView, Layout, Prefab, instantiate, find, UIOpacity, Color } from 'cc';
|
|
|
+import { BundleLoader } from '../../Core/BundleLoader';
|
|
|
import { SaveDataManager, WeaponData } from '../../LevelSystem/SaveDataManager';
|
|
|
import EventBus, { GameEvents } from '../../Core/EventBus';
|
|
|
import { UpgradeAni } from './UpgradeAni';
|
|
|
@@ -74,12 +75,14 @@ export class UpgradeController extends Component {
|
|
|
private weaponsConfig: { weapons: WeaponConfig[] } = null;
|
|
|
private currentSelectedWeapon: string = null;
|
|
|
private levelConfigs: any[] = [];
|
|
|
+ private bundleLoader: BundleLoader = null;
|
|
|
|
|
|
// 武器节点列表
|
|
|
private weaponNodes: Node[] = [];
|
|
|
|
|
|
onLoad() {
|
|
|
this.saveDataManager = SaveDataManager.getInstance();
|
|
|
+ this.bundleLoader = BundleLoader.getInstance();
|
|
|
this.bindEvents();
|
|
|
}
|
|
|
|
|
|
@@ -107,7 +110,7 @@ export class UpgradeController extends Component {
|
|
|
this.checkInitialWeaponUnlocks();
|
|
|
|
|
|
// 刷新UI
|
|
|
- this.refreshWeaponList();
|
|
|
+ await this.refreshWeaponList();
|
|
|
|
|
|
// 初始化升级面板状态
|
|
|
if (this.upgradeAni) {
|
|
|
@@ -141,12 +144,8 @@ export class UpgradeController extends Component {
|
|
|
*/
|
|
|
private async loadWeaponsConfig() {
|
|
|
try {
|
|
|
- const jsonAsset = await new Promise<any>((resolve, reject) => {
|
|
|
- resources.load('data/weapons', (err, asset) => {
|
|
|
- if (err) reject(err);
|
|
|
- else resolve(asset);
|
|
|
- });
|
|
|
- });
|
|
|
+ const bundleLoader = BundleLoader.getInstance();
|
|
|
+ const jsonAsset = await bundleLoader.loadDataJson('weapons');
|
|
|
|
|
|
this.weaponsConfig = jsonAsset.json;
|
|
|
console.log('[UpgradeController] 武器配置加载成功:', this.weaponsConfig);
|
|
|
@@ -161,19 +160,16 @@ export class UpgradeController extends Component {
|
|
|
private async loadLevelConfigs() {
|
|
|
try {
|
|
|
this.levelConfigs = [];
|
|
|
+ const bundleLoader = BundleLoader.getInstance();
|
|
|
+
|
|
|
// 加载Level1到Level5的配置
|
|
|
for (let i = 1; i <= 5; i++) {
|
|
|
try {
|
|
|
- const levelData = await new Promise<any>((resolve, reject) => {
|
|
|
- resources.load(`data/levels/Level${i}`, (err, asset) => {
|
|
|
- if (err) reject(err);
|
|
|
- else resolve(asset);
|
|
|
- });
|
|
|
- });
|
|
|
+ const levelData = await bundleLoader.loadDataJson(`levels/Level${i}`);
|
|
|
|
|
|
this.levelConfigs.push({
|
|
|
level: i,
|
|
|
- ...levelData
|
|
|
+ ...levelData.json
|
|
|
});
|
|
|
} catch (error) {
|
|
|
console.warn(`加载Level${i}配置失败:`, error);
|
|
|
@@ -243,7 +239,7 @@ export class UpgradeController extends Component {
|
|
|
/**
|
|
|
* 刷新武器列表UI
|
|
|
*/
|
|
|
- private refreshWeaponList() {
|
|
|
+ private async refreshWeaponList() {
|
|
|
if (!this.weaponsConfig || !this.weaponLayout) {
|
|
|
console.warn('武器配置或武器布局未初始化');
|
|
|
return;
|
|
|
@@ -253,15 +249,16 @@ export class UpgradeController extends Component {
|
|
|
this.clearWeaponNodes();
|
|
|
|
|
|
// 为每个武器创建UI节点
|
|
|
- this.weaponsConfig.weapons.forEach((weaponConfig, index) => {
|
|
|
- this.createWeaponNode(weaponConfig, index);
|
|
|
- });
|
|
|
+ for (let index = 0; index < this.weaponsConfig.weapons.length; index++) {
|
|
|
+ const weaponConfig = this.weaponsConfig.weapons[index];
|
|
|
+ await this.createWeaponNode(weaponConfig, index);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 切换武器节点状态(从锁定到解锁或反之)
|
|
|
*/
|
|
|
- private switchWeaponNodeState(weaponId: string) {
|
|
|
+ private async switchWeaponNodeState(weaponId: string) {
|
|
|
const weaponConfig = this.weaponsConfig.weapons.find(w => w.id === weaponId);
|
|
|
if (!weaponConfig) {
|
|
|
console.warn(`未找到武器配置: ${weaponId}`);
|
|
|
@@ -284,7 +281,7 @@ export class UpgradeController extends Component {
|
|
|
if (isUnlocked) {
|
|
|
if (this.unlockedWeaponPrefab) {
|
|
|
newNode = instantiate(this.unlockedWeaponPrefab);
|
|
|
- this.setupUnlockedWeaponNode(newNode, weaponConfig, weaponData);
|
|
|
+ await this.setupUnlockedWeaponNode(newNode, weaponConfig, weaponData);
|
|
|
}
|
|
|
} else {
|
|
|
if (this.lockedWeaponPrefab) {
|
|
|
@@ -327,7 +324,7 @@ export class UpgradeController extends Component {
|
|
|
/**
|
|
|
* 创建武器节点
|
|
|
*/
|
|
|
- private createWeaponNode(weaponConfig: WeaponConfig, index: number) {
|
|
|
+ private async createWeaponNode(weaponConfig: WeaponConfig, index: number) {
|
|
|
// 获取武器数据
|
|
|
const weaponData = this.saveDataManager.getWeapon(weaponConfig.id);
|
|
|
const isUnlocked = this.saveDataManager.isWeaponUnlocked(weaponConfig.id);
|
|
|
@@ -339,7 +336,7 @@ export class UpgradeController extends Component {
|
|
|
if (isUnlocked) {
|
|
|
if (this.unlockedWeaponPrefab) {
|
|
|
weaponNode = instantiate(this.unlockedWeaponPrefab);
|
|
|
- this.setupUnlockedWeaponNode(weaponNode, weaponConfig, weaponData);
|
|
|
+ await this.setupUnlockedWeaponNode(weaponNode, weaponConfig, weaponData);
|
|
|
}
|
|
|
} else {
|
|
|
if (this.lockedWeaponPrefab) {
|
|
|
@@ -365,17 +362,21 @@ export class UpgradeController extends Component {
|
|
|
/**
|
|
|
* 加载武器图标
|
|
|
*/
|
|
|
- private loadWeaponSprite(sprite: Sprite, spritePath: string) {
|
|
|
- // 参考WeaponBullet.ts的正确加载方式,在路径后添加'/spriteFrame'
|
|
|
- const framePath = `${spritePath}/spriteFrame`;
|
|
|
- resources.load(framePath, SpriteFrame, (err, spriteFrame) => {
|
|
|
- if (!err && spriteFrame && sprite && sprite.isValid) {
|
|
|
+ private async loadWeaponSprite(sprite: Sprite, spritePath: string) {
|
|
|
+ // 转换路径格式,去除"images/"前缀
|
|
|
+ const bundlePath = spritePath.replace(/^images\//, '');
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 使用BundleLoader从images Bundle加载SpriteFrame
|
|
|
+ const spriteFrame = await this.bundleLoader.loadSpriteFrame('images', bundlePath);
|
|
|
+
|
|
|
+ if (spriteFrame && sprite && sprite.isValid) {
|
|
|
sprite.spriteFrame = spriteFrame;
|
|
|
console.log(`武器图标加载成功: ${spritePath}`);
|
|
|
- } else if (err) {
|
|
|
- console.warn(`加载武器图标失败: ${spritePath}`, err);
|
|
|
}
|
|
|
- });
|
|
|
+ } catch (err) {
|
|
|
+ console.warn(`加载武器图标失败: ${spritePath}`, err);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -383,7 +384,7 @@ export class UpgradeController extends Component {
|
|
|
/**
|
|
|
* 设置已解锁武器节点(适配Unlock.prefab)
|
|
|
*/
|
|
|
- private setupUnlockedWeaponNode(weaponNode: Node, weaponConfig: WeaponConfig, weaponData: any) {
|
|
|
+ private async setupUnlockedWeaponNode(weaponNode: Node, weaponConfig: WeaponConfig, weaponData: any) {
|
|
|
// 获取公共的Sprite节点,避免重复查找
|
|
|
const spriteNode = weaponNode.getChildByName('Sprite');
|
|
|
if (!spriteNode) {
|
|
|
@@ -407,7 +408,7 @@ export class UpgradeController extends Component {
|
|
|
weaponConfig.visualConfig.weaponSprites['D-T'];
|
|
|
}
|
|
|
if (spritePath) {
|
|
|
- this.loadWeaponSprite(weaponSprite, spritePath);
|
|
|
+ await this.loadWeaponSprite(weaponSprite, spritePath);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -709,7 +710,7 @@ export class UpgradeController extends Component {
|
|
|
/**
|
|
|
* 升级武器
|
|
|
*/
|
|
|
- private onUpgradeWeapon() {
|
|
|
+ private async onUpgradeWeapon() {
|
|
|
console.log(`[UpgradeController] onUpgradeWeapon方法被调用`);
|
|
|
|
|
|
if (!this.currentSelectedWeapon) {
|
|
|
@@ -787,7 +788,7 @@ export class UpgradeController extends Component {
|
|
|
}
|
|
|
|
|
|
// 使用新的状态切换方法更新武器节点
|
|
|
- this.switchWeaponNodeState(this.currentSelectedWeapon);
|
|
|
+ await this.switchWeaponNodeState(this.currentSelectedWeapon);
|
|
|
|
|
|
// 更新升级按钮闪烁状态(升级后钞票可能不足继续升级)
|
|
|
this.updateUpgradeBtnBlinkState();
|
|
|
@@ -826,14 +827,14 @@ export class UpgradeController extends Component {
|
|
|
/**
|
|
|
* 解锁武器
|
|
|
*/
|
|
|
- public unlockWeapon(weaponId: string): boolean {
|
|
|
+ public async unlockWeapon(weaponId: string): Promise<boolean> {
|
|
|
const success = this.saveDataManager.unlockWeapon(weaponId);
|
|
|
|
|
|
if (success) {
|
|
|
console.log(`武器 ${weaponId} 解锁成功`);
|
|
|
|
|
|
// 使用新的状态切换方法更新武器节点
|
|
|
- this.switchWeaponNodeState(weaponId);
|
|
|
+ await this.switchWeaponNodeState(weaponId);
|
|
|
|
|
|
// 保存数据
|
|
|
this.saveDataManager.savePlayerData();
|
|
|
@@ -859,14 +860,14 @@ export class UpgradeController extends Component {
|
|
|
/**
|
|
|
* 刷新UI
|
|
|
*/
|
|
|
- public refreshUI() {
|
|
|
- this.refreshWeaponList();
|
|
|
+ public async refreshUI() {
|
|
|
+ await this.refreshWeaponList();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 处理关卡完成事件,自动解锁相应武器
|
|
|
*/
|
|
|
- private onLevelComplete() {
|
|
|
+ private async onLevelComplete() {
|
|
|
if (!this.saveDataManager || !this.weaponsConfig) return;
|
|
|
|
|
|
// 获取当前关卡数据
|
|
|
@@ -923,7 +924,7 @@ export class UpgradeController extends Component {
|
|
|
|
|
|
// 如果有新解锁的武器,刷新UI并保存数据
|
|
|
if (hasNewUnlocks) {
|
|
|
- this.refreshWeaponList();
|
|
|
+ await this.refreshWeaponList();
|
|
|
this.saveDataManager.savePlayerData();
|
|
|
|
|
|
console.log(`[UpgradeController] 关卡完成后解锁了 ${newlyUnlockedWeapons.length} 个武器:`, newlyUnlockedWeapons);
|
|
|
@@ -967,9 +968,9 @@ export class UpgradeController extends Component {
|
|
|
/**
|
|
|
* 手动检查并解锁武器(用于调试或特殊情况)
|
|
|
*/
|
|
|
- public checkAndUnlockWeapons() {
|
|
|
+ public async checkAndUnlockWeapons() {
|
|
|
console.log('[UpgradeController] 手动检查武器解锁状态');
|
|
|
- this.onLevelComplete();
|
|
|
+ await this.onLevelComplete();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -1018,7 +1019,7 @@ export class UpgradeController extends Component {
|
|
|
/**
|
|
|
* 强制同步所有武器解锁状态(用于修复数据不一致问题)
|
|
|
*/
|
|
|
- public forceSyncWeaponUnlocks() {
|
|
|
+ public async forceSyncWeaponUnlocks() {
|
|
|
if (!this.saveDataManager || !this.weaponsConfig) {
|
|
|
console.error('[UpgradeController] 无法强制同步:数据管理器或武器配置未初始化');
|
|
|
return false;
|
|
|
@@ -1047,7 +1048,7 @@ export class UpgradeController extends Component {
|
|
|
|
|
|
if (syncCount > 0) {
|
|
|
this.saveDataManager.savePlayerData();
|
|
|
- this.refreshWeaponList();
|
|
|
+ await this.refreshWeaponList();
|
|
|
console.log(`[UpgradeController] 强制同步完成,解锁了 ${syncCount} 个武器`);
|
|
|
} else {
|
|
|
console.log(`[UpgradeController] 强制同步完成,没有需要更新的武器`);
|