181404010226 4 luni în urmă
părinte
comite
e49280e23d

+ 6 - 0
assets/Scenes/GameLevel.scene

@@ -30476,6 +30476,12 @@
     "canvasNode": {
       "__id__": 2
     },
+    "coinTargetNode": {
+      "__id__": 778
+    },
+    "diamondTargetNode": {
+      "__id__": 794
+    },
     "_id": "39/4KS4NhICInIwaV8T+2d"
   },
   {

+ 64 - 26
assets/scripts/Animations/MoneyAni.ts

@@ -1,4 +1,4 @@
-import { _decorator, Component, Node, Vec3, tween, instantiate, Prefab, find, math, Label } from 'cc';
+import { _decorator, Component, Node, Vec3, tween, instantiate, Prefab, math, Label, director } from 'cc';
 import { SaveDataManager } from '../LevelSystem/SaveDataManager';
 import { TopBarController } from '../FourUI/TopBarController';
 const { ccclass, property } = _decorator;
@@ -34,6 +34,18 @@ export class MoneyAni extends Component {
     })
     public canvasNode: Node = null;
     
+    @property({
+        type: Node,
+        tooltip: '金币目标节点(TopBar中的金币标签)'
+    })
+    public coinTargetNode: Node = null;
+    
+    @property({
+        type: Node,
+        tooltip: '钻石目标节点(TopBar中的钻石标签)'
+    })
+    public diamondTargetNode: Node = null;
+    
     private saveDataManager: SaveDataManager = null;
     
     onLoad() {
@@ -50,11 +62,7 @@ export class MoneyAni extends Component {
         console.log(`[MoneyAni] 开始播放奖励动画 - 金币: ${coinAmount}, 钻石: ${diamondAmount}`);
         
         if (!this.canvasNode) {
-            this.canvasNode = find('Canvas');
-        }
-        
-        if (!this.canvasNode) {
-            console.error('[MoneyAni] 找不到Canvas节点');
+            console.error('[MoneyAni] Canvas节点未设置,请在编辑器中拖拽Canvas节点到canvasNode属性');
             if (onComplete) onComplete();
             return;
         }
@@ -98,16 +106,15 @@ export class MoneyAni extends Component {
             return;
         }
         
-        // 获取目标位置(TopBar中的金币图标)
-        const targetNode = find('Canvas/TopBar')?.getChildByName('moneyLabel') || 
-                          find('Canvas/TopBar/moneyLabel');
-        
-        if (!targetNode) {
-            console.error('[MoneyAni] 找不到金币目标节点');
+        // 使用装饰器引用的金币目标节点
+        if (!this.coinTargetNode) {
+            console.error('[MoneyAni] 金币目标节点未设置,请在编辑器中拖拽TopBar中的金币标签节点');
             if (onComplete) onComplete();
             return;
         }
         
+        const targetNode = this.coinTargetNode;
+        
         // 生成金币数量(最多10个,超过则按比例显示)
         const coinCount = Math.min(amount, 10);
         const startPos = this.getRewardStartPosition();
@@ -142,16 +149,15 @@ export class MoneyAni extends Component {
             return;
         }
         
-        // 获取目标位置(TopBar中的钻石图标)
-        const targetNode = find('Canvas/TopBar')?.getChildByName('diamondLabel') || 
-                          find('Canvas/TopBar/diamondLabel');
-        
-        if (!targetNode) {
-            console.error('[MoneyAni] 找不到钻石目标节点');
+        // 使用装饰器引用的钻石目标节点
+        if (!this.diamondTargetNode) {
+            console.error('[MoneyAni] 钻石目标节点未设置,请在编辑器中拖拽TopBar中的钻石标签节点');
             if (onComplete) onComplete();
             return;
         }
         
+        const targetNode = this.diamondTargetNode;
+        
         // 生成钻石数量(最多5个)
         const diamondCount = Math.min(amount, 5);
         const startPos = this.getRewardStartPosition();
@@ -288,21 +294,53 @@ export class MoneyAni extends Component {
     }
     
     /**
-     * 静态方法:播放奖励动画
-     * 供外部调用的便捷接口
+     * 静态方法:播放奖励动画(需要传入实例)
+     * @param moneyAniInstance MoneyAni组件实例
+     * @param coinAmount 金币数量
+     * @param diamondAmount 钻石数量
+     * @param onComplete 完成回调
+     */
+    public static playRewardWithInstance(moneyAniInstance: MoneyAni, coinAmount: number, diamondAmount: number, onComplete?: () => void) {
+        if (!moneyAniInstance) {
+            console.error('[MoneyAni] MoneyAni实例为空,请传入有效的MoneyAni组件实例');
+            if (onComplete) onComplete();
+            return;
+        }
+        
+        moneyAniInstance.playRewardAnimation(coinAmount, diamondAmount, onComplete);
+    }
+    
+    /**
+     * 静态方法:播放奖励动画(简化版本)
+     * 自动查找场景中的MoneyAni组件
+     * @param coinAmount 金币数量
+     * @param diamondAmount 钻石数量
+     * @param onComplete 完成回调
      */
     public static playReward(coinAmount: number, diamondAmount: number, onComplete?: () => void) {
-        // 查找MoneyAni组件
-        const moneyAniNode = find('Canvas/MoneyAni') || find('MoneyAni');
-        if (!moneyAniNode) {
-            console.error('[MoneyAni] 找不到MoneyAni节点');
+        // 尝试从director获取场景中的MoneyAni组件
+        const scene = director.getScene();
+        if (!scene) {
+            console.error('[MoneyAni] 无法获取当前场景');
             if (onComplete) onComplete();
             return;
         }
         
-        const moneyAni = moneyAniNode.getComponent(MoneyAni);
+        // 递归查找MoneyAni组件
+        const findMoneyAni = (node: Node): MoneyAni | null => {
+            const moneyAni = node.getComponent(MoneyAni);
+            if (moneyAni) return moneyAni;
+            
+            for (const child of node.children) {
+                const result = findMoneyAni(child);
+                if (result) return result;
+            }
+            return null;
+        };
+        
+        const moneyAni = findMoneyAni(scene);
         if (!moneyAni) {
-            console.error('[MoneyAni] 找不到MoneyAni组件');
+            console.error('[MoneyAni] 场景中未找到MoneyAni组件,请确保场景中存在MoneyAni组件');
             if (onComplete) onComplete();
             return;
         }

+ 9 - 19
assets/scripts/CombatSystem/BlockSelection/GameBlockSelection.ts

@@ -259,26 +259,16 @@ export class GameBlockSelection extends Component {
 
     // 增加金币按钮点击
     private onAddCoinClicked() {
-        // 应用便宜技能效果计算实际费用
-        const actualCost = this.getActualCost(this.ADD_COIN_AMOUNT);
+        // 免费增加金币(模拟看广告获得奖励)
+        const coinsToAdd = 80; // 免费获得的金币数量
+        this.session.addCoins(coinsToAdd);
+        console.log(`通过观看广告免费获得${coinsToAdd}金币`);
         
-        if (!this.canSpendCoins(actualCost)) {
-            this.showInsufficientCoinsUI();
-            return;
-        }
-
-        // 扣除金币
-        if (this.session.spendCoins(actualCost)) {
-            this.updateCoinDisplay();
-            
-            // 添加金币(这里可以根据需要调整添加的金币数量)
-            const coinsToAdd = 100; // 可以根据需要调整
-            this.session.addCoins(coinsToAdd);
-            console.log(`花费${actualCost}金币,获得${coinsToAdd}金币`);
-            
-            // 更新显示
-            this.updateCoinDisplay();
-        }
+        // 更新显示
+        this.updateCoinDisplay();
+        
+        // 可以在这里添加播放奖励动画的逻辑
+        // MoneyAni.playReward(coinsToAdd, 0);
     }
 
     // 刷新方块按钮点击

+ 7 - 14
assets/scripts/FourUI/MainSystem/MainUIControlller.ts

@@ -308,26 +308,19 @@ export class MainUIController extends Component {
       if (isGameSuccess) {
         // 游戏成功,获取完整奖励
         console.log('游戏成功,获取完整奖励');
-        rewards = await this.sdm.getLevelRewardsFromConfig(currentLevel);
+        rewards = this.sdm.getLastRewards();
       } else {
-        // 游戏失败,计算部分奖励
-        console.log('游戏失败,计算部分奖励');
-        const baseRewards = await this.sdm.getLevelRewardsFromConfig(currentLevel);
+        // 游戏失败,直接获取已经计算好的失败奖励
+        console.log('游戏失败,获取已计算部分奖励');
+        rewards = this.sdm.getLastRewards();
         
-        // 计算波数完成比例
+        // 记录波数完成情况用于调试
         const currentWave = gameManager?.getCurrentWave() || 0;
         const inGameManager = gameManager?.getInGameManager();
         const totalWaves = inGameManager?.levelWaves?.length || 1;
-        const completionRatio = Math.max(0, Math.min(1, Math.max(0, currentWave - 1) / totalWaves));
-        
-        console.log(`波数完成情况: ${Math.max(0, currentWave - 1)}/${totalWaves} = ${(completionRatio * 100).toFixed(1)}%`);
-        
-        // 失败奖励:基础奖励 × 完成比例 × 失败系数
-        rewards = {
-          coins: Math.floor((baseRewards?.coins || 100) * completionRatio * 0.5), // 50%系数
-          diamonds: Math.floor((baseRewards?.diamonds || 10) * completionRatio * 0.3) // 30%系数
-        };
+        const completedWaves = Math.max(0, currentWave - 1);
         
+        console.log(`波数完成情况: ${completedWaves}/${totalWaves} = ${(completedWaves / totalWaves * 100).toFixed(1)}%`);
         console.log('计算出的失败奖励:', rewards);
       }
       

+ 1 - 1
assets/scripts/LevelSystem/GameManager.ts

@@ -446,7 +446,7 @@ export class GameManager extends Component {
             console.log(`[GameManager] 游戏失败 - 完成波数: ${completedWaves}/${totalWaves}, 比例: ${(waveCompletionRatio * 100).toFixed(1)}%`);
             
             // 给予基于波数比例的失败奖励
-            await this.saveDataManager.giveFailureRewards(currentLevel, waveCompletionRatio, this.getGameDuration());
+            await this.saveDataManager.giveFailureRewards(currentLevel, completedWaves, totalWaves);
             
             // 更新统计数据
             this.saveDataManager.updateStatistic('totalTimePlayed', this.getGameDuration());

+ 33 - 2
assets/scripts/LevelSystem/SaveDataManager.ts

@@ -142,6 +142,9 @@ export class SaveDataManager {
     private autoSaveInterval: number = 30; // 自动保存间隔(秒)
     private lastSaveTime: number = 0;
     
+    // 最近的奖励记录(用于UI显示)
+    private lastRewards: {coins: number, diamonds: number} = {coins: 0, diamonds: 0};
+    
     // 存档文件键名
     private readonly SAVE_KEY = 'pong_game_save_data';
     private readonly BACKUP_KEY = 'pong_game_save_data_backup';
@@ -816,13 +819,18 @@ export class SaveDataManager {
         // 尝试从JSON配置文件获取奖励数据
         const configRewards = await this.getLevelRewardsFromConfig(levelId);
         
+        let actualCoins = 0;
+        let actualDiamonds = 0;
+        
         if (configRewards) {
             // 使用JSON配置中的奖励数据
             if (configRewards.coins > 0) {
                 this.addCoins(configRewards.coins, `level_${levelId}_complete`);
+                actualCoins = configRewards.coins;
             }
             if (configRewards.diamonds > 0) {
                 this.addDiamonds(configRewards.diamonds, `level_${levelId}_complete`);
+                actualDiamonds = configRewards.diamonds;
             }
         }
         
@@ -830,13 +838,20 @@ export class SaveDataManager {
         if (levelId % 10 === 0) {
             this.addGems(1, `level_${levelId}_milestone`);
         }
+        
+        // 存储最近的奖励记录
+        this.lastRewards = {coins: actualCoins, diamonds: actualDiamonds};
     }
     
     /**
      * 根据波数比例给予失败奖励
      */
     public async giveFailureRewards(levelId: number, completedWaves: number, totalWaves: number): Promise<void> {
-        if (completedWaves <= 0 || totalWaves <= 0) return;
+        if (completedWaves <= 0 || totalWaves <= 0) {
+            // 重置最近奖励为0
+            this.lastRewards = {coins: 0, diamonds: 0};
+            return;
+        }
         
         // 获取完整奖励数据
         const configRewards = await this.getLevelRewardsFromConfig(levelId);
@@ -844,6 +859,9 @@ export class SaveDataManager {
         // 计算波数完成比例
         const waveRatio = Math.min(completedWaves / totalWaves, 1.0);
         
+        let actualCoins = 0;
+        let actualDiamonds = 0;
+        
         if (configRewards) {
             // 基于JSON配置计算比例奖励(取整)
             const partialCoins = Math.floor(configRewards.coins * waveRatio);
@@ -851,9 +869,11 @@ export class SaveDataManager {
             
             if (partialCoins > 0) {
                 this.addCoins(partialCoins, `level_${levelId}_partial_${completedWaves}/${totalWaves}`);
+                actualCoins = partialCoins;
             }
             if (partialDiamonds > 0) {
                 this.addDiamonds(partialDiamonds, `level_${levelId}_partial_${completedWaves}/${totalWaves}`);
+                actualDiamonds = partialDiamonds;
             }
         } else {
             // 回退到默认计算
@@ -862,10 +882,21 @@ export class SaveDataManager {
             
             if (partialCoins > 0) {
                 this.addCoins(partialCoins, `level_${levelId}_partial_${completedWaves}/${totalWaves}`);
+                actualCoins = partialCoins;
             }
         }
+        
+        // 存储最近的奖励记录
+        this.lastRewards = {coins: actualCoins, diamonds: actualDiamonds};
     }
-    
+
+    /**
+     * 获取最近的奖励记录(用于UI显示)
+     */
+    public getLastRewards(): {coins: number, diamonds: number} {
+        return {...this.lastRewards};
+    }
+
     // === 统计数据更新 ===
     
     public updateStatistic(key: keyof GameStatistics, value: number): void {