Browse Source

解决物理系统冲突

181404010226 3 months ago
parent
commit
25572fbbb6

+ 2 - 8
assets/resources/data/excel/weapon_config_manager.py

@@ -602,7 +602,7 @@ class WeaponConfigManager:
             'hitEffects': [{'type': 'normal_damage', 'priority': 1, 'damage': damage}],
             'lifecycle': {'type': 'hit_destroy', 'maxLifetime': 5.0, 'penetration': 1, 'ricochetCount': 0, 'returnToOrigin': False},
             'visual': {
-                'bulletPrefab': f'bullets/{weapon_id.title()}Bullet',
+                'bulletImages': f'images/PlantsSprite/{sprite_id}',
                 'hitEffect': 'Animation/WeaponTx/tx0002/tx0002',
                 'trailEffect': True
             }
@@ -643,13 +643,7 @@ class WeaponConfigManager:
         sprite_id = weapon_sprite_map.get(weapon_id, '001')
         
         return {
-            'weaponSprites': {
-                'I': f'images/PlantsSprite/{sprite_id}',
-                'H-I': f'images/PlantsSprite/{sprite_id}',
-                'L': f'images/PlantsSprite/{sprite_id}',
-                'S': f'images/PlantsSprite/{sprite_id}',
-                'D-T': f'images/PlantsSprite/{sprite_id}'
-            },
+            'weaponSprites': f'images/PlantsSprite/{sprite_id}',
             'fireSound': f'audio/{weapon_id}_shot'
         }
     

+ 16 - 64
assets/resources/data/weapons.json

@@ -43,19 +43,13 @@
           "returnToOrigin": false
         },
         "visual": {
-          "bulletPrefab": "bullets/Pea_ShooterBullet",
+          "bulletImages": "images/PlantsSprite/001-1",
           "hitEffect": "Animation/WeaponTx/tx0002/tx0002",
           "trailEffect": true
         }
       },
       "visualConfig": {
-        "weaponSprites": {
-          "I": "images/PlantsSprite/001-1",
-          "H-I": "images/PlantsSprite/001-1",
-          "L": "images/PlantsSprite/001-1",
-          "S": "images/PlantsSprite/001-1",
-          "D-T": "images/PlantsSprite/001-1"
-        },
+        "weaponSprites": "images/PlantsSprite/001-1",
         "fireSound": "audio/pea_shooter_shot"
       },
       "upgradeConfig": {
@@ -159,19 +153,13 @@
           "maxRange": 800
         },
         "visual": {
-          "bulletPrefab": "bullets/Sharp_CarrotBullet",
+          "bulletImages": "images/PlantsSprite/002",
           "hitEffect": "Animation/WeaponTx/tx0002/tx0002",
           "trailEffect": "Animation/WeaponTx/tx0001/tx0001"
         }
       },
       "visualConfig": {
-        "weaponSprites": {
-          "I": "images/PlantsSprite/002",
-          "H-I": "images/PlantsSprite/002",
-          "L": "images/PlantsSprite/002",
-          "S": "images/PlantsSprite/002",
-          "D-T": "images/PlantsSprite/002"
-        },
+        "weaponSprites": "images/PlantsSprite/002",
         "fireSound": "audio/sharp_carrot_shot"
       },
       "upgradeConfig": {
@@ -281,19 +269,13 @@
           "returnToOrigin": false
         },
         "visual": {
-          "bulletPrefab": "bullets/Saw_GrassBullet",
+          "bulletImages": "images/PlantsSprite/003",
           "hitEffect": "Animation/WeaponTx/tx0002/tx0002",
           "trailEffect": true
         }
       },
       "visualConfig": {
-        "weaponSprites": {
-          "I": "images/PlantsSprite/003",
-          "H-I": "images/PlantsSprite/003",
-          "L": "images/PlantsSprite/003",
-          "S": "images/PlantsSprite/003",
-          "D-T": "images/PlantsSprite/003"
-        },
+        "weaponSprites": "images/PlantsSprite/003",
         "fireSound": "audio/saw_grass_shot"
       },
       "upgradeConfig": {
@@ -397,20 +379,14 @@
           "returnToOrigin": false
         },
         "visual": {
-          "bulletPrefab": "bullets/Watermelon_BombBullet",
+          "bulletImages": "images/PlantsSprite/007",
           "hitEffect": "Animation/WeaponTx/tx0007/tx0007",
           "trailEffect": true,
           "explosionEffect": "Animation/WeaponTx/tx0007/tx0007"
         }
       },
       "visualConfig": {
-        "weaponSprites": {
-          "I": "images/PlantsSprite/007",
-          "H-I": "images/PlantsSprite/007",
-          "L": "images/PlantsSprite/007",
-          "S": "images/PlantsSprite/007",
-          "D-T": "images/PlantsSprite/007"
-        },
+        "weaponSprites": "images/PlantsSprite/007",
         "fireSound": "audio/watermelon_bomb_shot"
       },
       "upgradeConfig": {
@@ -513,19 +489,13 @@
           "returnDelay": 1.0
         },
         "visual": {
-          "bulletPrefab": "bullets/Boomerang_PlantBullet",
+          "bulletImages": "images/PlantsSprite/004",
           "hitEffect": "Animation/WeaponTx/tx0002/tx0002",
           "trailEffect": true
         }
       },
       "visualConfig": {
-        "weaponSprites": {
-          "I": "images/PlantsSprite/004",
-          "H-I": "images/PlantsSprite/004",
-          "L": "images/PlantsSprite/004",
-          "S": "images/PlantsSprite/004",
-          "D-T": "images/PlantsSprite/004"
-        },
+        "weaponSprites": "images/PlantsSprite/004",
         "fireSound": "audio/boomerang_plant_shot"
       },
       "upgradeConfig": {
@@ -634,20 +604,14 @@
           "returnToOrigin": false
         },
         "visual": {
-          "bulletPrefab": "bullets/Hot_PepperBullet",
+          "bulletImages": "images/PlantsSprite/005",
           "hitEffect": "Animation/WeaponTx/tx0002/tx0002",
           "trailEffect": true,
           "burnEffect": "Animation/WeaponTx/tx0006/tx0006"
         }
       },
       "visualConfig": {
-        "weaponSprites": {
-          "I": "images/PlantsSprite/005",
-          "H-I": "images/PlantsSprite/005",
-          "L": "images/PlantsSprite/005",
-          "S": "images/PlantsSprite/005",
-          "D-T": "images/PlantsSprite/005"
-        },
+        "weaponSprites": "images/PlantsSprite/005",
         "fireSound": "audio/hot_pepper_shot"
       },
       "upgradeConfig": {
@@ -750,19 +714,13 @@
           "maxRange": 1000
         },
         "visual": {
-          "bulletPrefab": "bullets/Cactus_ShotgunBullet",
+          "bulletImages": "images/PlantsSprite/008",
           "hitEffect": "Animation/WeaponTx/tx0002/tx0002",
           "trailEffect": true
         }
       },
       "visualConfig": {
-        "weaponSprites": {
-          "I": "images/PlantsSprite/008",
-          "H-I": "images/PlantsSprite/008",
-          "L": "images/PlantsSprite/008",
-          "S": "images/PlantsSprite/008",
-          "D-T": "images/PlantsSprite/008"
-        },
+        "weaponSprites": "images/PlantsSprite/008",
         "fireSound": "audio/cactus_shotgun_shot"
       },
       "upgradeConfig": {
@@ -866,20 +824,14 @@
           "returnToOrigin": false
         },
         "visual": {
-          "bulletPrefab": "bullets/Okra_MissileBullet",
+          "bulletImages": "images/PlantsSprite/006",
           "hitEffect": "Animation/WeaponTx/tx0002/tx0002",
           "trailEffect": true,
           "explosionEffect": "Animation/WeaponTx/tx0007/tx0007"
         }
       },
       "visualConfig": {
-        "weaponSprites": {
-          "I": "images/PlantsSprite/006",
-          "H-I": "images/PlantsSprite/006",
-          "L": "images/PlantsSprite/006",
-          "S": "images/PlantsSprite/006",
-          "D-T": "images/PlantsSprite/006"
-        },
+        "weaponSprites": "images/PlantsSprite/006",
         "fireSound": "audio/okra_missile_shot"
       },
       "upgradeConfig": {

+ 3 - 19
assets/scripts/CombatSystem/BlockManager.ts

@@ -1376,25 +1376,9 @@ export class BlockManager extends Component {
         }
         
         // 获取武器配置中的图片路径
-        const spriteConfig = weaponConfig.visualConfig?.weaponSprites;
-        if (!spriteConfig) {
-            console.warn(`武器 ${weaponConfig.name} 没有配置图片信息`);
-            return;
-        }
-        
-        // 获取方块的形状ID
-        const blockShapeId = this.getBlockShape(block);
-        
-        // 根据方块形状选择合适的图片路径
-        let spritePath = null;
-        if (blockShapeId && spriteConfig[blockShapeId]) {
-            spritePath = spriteConfig[blockShapeId];
-        } else {
-            // 如果没有找到对应形状的图片,使用备用顺序
-            spritePath = spriteConfig['I'] || spriteConfig['H-I'] || spriteConfig['L'] || spriteConfig['S'] || spriteConfig['D-T'];
-        }
+        const spritePath = weaponConfig.visualConfig?.weaponSprites;
         if (!spritePath) {
-            console.warn(`武器 ${weaponConfig.name} 没有可用的图片路径`);
+            console.warn(`武器 ${weaponConfig.name} 没有配置图片信息`);
             return;
         }
         
@@ -1423,7 +1407,7 @@ export class BlockManager extends Component {
             }
             
             // 应用武器图标的位置偏移和旋转
-            this.rotateWeaponIconByShape(weaponNode, blockShapeId, weaponConfig.id);
+            this.rotateWeaponIconByShape(weaponNode, weaponConfig.id);
         }
         });
     }

+ 4 - 2
assets/scripts/CombatSystem/BulletEffects/GroundBurnAreaManager.ts

@@ -110,8 +110,8 @@ export class GroundBurnAreaManager extends Component {
         try {
             // 实例化预制体
             const burnAreaNode = instantiate(this.groundBurnAreaPrefab);
-            
-            // 添加到游戏区域
+
+             // 添加到游戏区域
             this.gameArea.addChild(burnAreaNode);
             
             // 获取地面燃烧区域组件
@@ -138,6 +138,8 @@ export class GroundBurnAreaManager extends Component {
             
             console.log(`[GroundBurnAreaManager] 地面燃烧区域已创建,位置: (${position.x.toFixed(1)}, ${position.y.toFixed(1)})`);
             
+     
+            
             return burnAreaNode;
             
         } catch (error) {

+ 7 - 4
assets/scripts/CombatSystem/EnemyController.ts

@@ -835,8 +835,12 @@ export class EnemyController extends BaseSingleton {
             }
             
             // 敌人死亡时不在这里更新数量显示,由GameManager统一管理
-            // 销毁敌人
-            enemy.destroy();
+            // 延迟销毁敌人,避免在物理碰撞监听器中直接销毁导致的刚体激活错误
+            this.scheduleOnce(() => {
+                if (enemy && enemy.isValid) {
+                    enemy.destroy();
+                }
+            }, 0);
         }
     }
 
@@ -913,13 +917,12 @@ export class EnemyController extends BaseSingleton {
             if (idx !== -1) {
                 this.activeEnemies.splice(idx, 1);
             } else {
-                console.warn(`[EnemyController] 警告:尝试移除的敌人不在activeEnemies数组中!`);
+                console.log(`[EnemyController] 警告:尝试移除的敌人不在activeEnemies数组中!`);
             }
             // 移除EnemyController内部的击杀计数,统一由GameManager管理
             // this.currentWaveEnemiesKilled++;
             // 敌人死亡通知时不更新数量显示,由GameManager统一管理
         }
-        
         // 直接通过事件总线发送ENEMY_KILLED事件,避免通过GamePause的双重调用
         const eventBus = EventBus.getInstance();
         eventBus.emit('ENEMY_KILLED');

+ 5 - 12
assets/scripts/CombatSystem/WeaponBullet.ts

@@ -571,21 +571,14 @@ export class WeaponBullet extends Component {
             return;
         }
 
-        // weaponConfig.visualConfig.weaponSprites 中存储了各尺寸的SpriteFrame路径
-        const spriteConfig = (this.weaponConfig as any)?.visualConfig?.weaponSprites;
-        if (!spriteConfig) {
-            console.log("未找到武器Sprite配置");
+        // 使用武器配置中的bulletConfig.visual.bulletImages字段获取子弹图像路径
+        const bulletImagePath = this.weaponConfig?.bulletConfig?.visual?.bulletImages;
+        if (!bulletImagePath) {
+            console.log("未找到子弹图像配置 (bulletConfig.visual.bulletImages)");
             return;
         }
 
-        // 依次尝试新的形状ID键值
-        const spritePath = spriteConfig['I'] || spriteConfig['H-I'] || spriteConfig['L'] || spriteConfig['S'] || spriteConfig['D-T'];
-        if (!spritePath) {
-            console.log("未找到匹配的SpriteFrame路径");
-            return;
-        }
-
-        const framePath = `${spritePath}/spriteFrame`;
+        const framePath = `${bulletImagePath}/spriteFrame`;
         resources.load(framePath, SpriteFrame, (err, spriteFrame) => {
             if (err) {
                 console.error(`加载子弹SpriteFrame失败: ${err}`);

+ 2 - 2
assets/scripts/Core/ConfigManager.ts

@@ -76,7 +76,7 @@ export interface WeaponConfig {
         hitEffects: HitEffectConfig[];
         lifecycle: BulletLifecycleConfig;
         visual: {
-            bulletPrefab: string;
+            bulletImages: string;
             hitEffect: string;
             trailEffect?: string;
             explosionEffect?: string;
@@ -213,7 +213,7 @@ export interface EnemyConfig {
         };
     };
     projectileConfig?: {
-        bulletPrefab: string;
+        bulletImages: string;
         hitEffect: string;
         trailEffect?: string;
     };

+ 8 - 8
assets/scripts/Core/PhysicsManager.ts

@@ -22,14 +22,14 @@ export class PhysicsManager extends BaseSingleton {
         // 设置物理系统的重力为零(因为是2D平面游戏)
         PhysicsSystem2D.instance.gravity = new Vec2(0, 0);
         
-        // // // 调试绘制
-        PhysicsSystem2D.instance.debugDrawFlags = this.debugDraw ?
-            (EPhysics2DDrawFlags.Aabb |
-             EPhysics2DDrawFlags.Pair |
-             EPhysics2DDrawFlags.CenterOfMass |
-             EPhysics2DDrawFlags.Joint |
-             EPhysics2DDrawFlags.Shape) :
-            EPhysics2DDrawFlags.None;
+        // // // // 调试绘制
+        // PhysicsSystem2D.instance.debugDrawFlags = this.debugDraw ?
+        //     (EPhysics2DDrawFlags.Aabb |
+        //      EPhysics2DDrawFlags.Pair |
+        //      EPhysics2DDrawFlags.CenterOfMass |
+        //      EPhysics2DDrawFlags.Joint |
+        //      EPhysics2DDrawFlags.Shape) :
+        //     EPhysics2DDrawFlags.None;
     }
 
     /**

+ 3 - 9
assets/scripts/FourUI/UpgradeSystem/UpgradeController.ts

@@ -22,13 +22,7 @@ interface WeaponConfig {
         bulletSpeed: number;
     };
     visualConfig: {
-        weaponSprites: {
-            "I": string;
-            "H-I": string;
-            "L": string;
-            "S": string;
-            "D-T": string;
-        };
+        weaponSprites: string;
     };
     upgradeConfig?: {
         maxLevel: number;
@@ -375,7 +369,7 @@ export class UpgradeController extends Component {
         // 设置武器图标 - 查找专门的武器图标Sprite节点,避免影响背景
         const weaponSprite = spriteNode.getChildByName('WeaponSprite')?.getComponent(Sprite);
         if (weaponSprite && weaponConfig.visualConfig.weaponSprites) {
-            const spritePath = weaponConfig.visualConfig.weaponSprites['I'] || weaponConfig.visualConfig.weaponSprites['H-I'] || weaponConfig.visualConfig.weaponSprites['L'] || weaponConfig.visualConfig.weaponSprites['S'] || weaponConfig.visualConfig.weaponSprites['D-T'];
+            const spritePath = weaponConfig.visualConfig.weaponSprites;
             this.loadWeaponSprite(weaponSprite, spritePath);
         }
         
@@ -532,7 +526,7 @@ export class UpgradeController extends Component {
         
         // 设置武器图标 - Canvas/UpgradeUI/UpgradePanel/WeaponSprite
         if (this.panelWeaponSprite && weaponConfig.visualConfig.weaponSprites) {
-            const spritePath = weaponConfig.visualConfig.weaponSprites['I'] || weaponConfig.visualConfig.weaponSprites['H-I'] || weaponConfig.visualConfig.weaponSprites['L'] || weaponConfig.visualConfig.weaponSprites['S'] || weaponConfig.visualConfig.weaponSprites['D-T'];
+            const spritePath = weaponConfig.visualConfig.weaponSprites;
             this.loadWeaponSprite(this.panelWeaponSprite, spritePath);
         }
         

+ 0 - 87
test_burn_effect_merge.py

@@ -1,87 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-"""
-测试burnEffect字段深度合并功能
-"""
-
-import json
-import copy
-from pathlib import Path
-
-def deep_merge_weapon_config(existing_weapon, new_weapon):
-    """深度合并武器配置,保留现有武器中表格没有的字段"""
-    # 创建新武器的深拷贝作为基础
-    merged = copy.deepcopy(new_weapon)
-    
-    # 递归合并函数,将现有武器中新武器没有的字段添加到合并结果中
-    def preserve_existing_fields(target, existing):
-        for key, value in existing.items():
-            if key not in target:
-                # 现有武器有但新武器没有的字段,保留
-                target[key] = copy.deepcopy(value)
-            elif isinstance(target[key], dict) and isinstance(value, dict):
-                # 如果两者都是字典,递归处理
-                preserve_existing_fields(target[key], value)
-    
-    # 执行深度合并,保留现有武器中的额外字段
-    preserve_existing_fields(merged, existing_weapon)
-    return merged
-
-def test_burn_effect_merge():
-    """测试burnEffect字段合并"""
-    print("=== 测试burnEffect字段深度合并 ===")
-    
-    # 模拟现有武器配置(包含burnEffect)
-    existing_weapon = {
-        "id": "saw_grass",
-        "name": "锯齿草",
-        "bulletConfig": {
-            "visual": {
-                "bulletPrefab": "bullets/Saw_GrassBullet",
-                "hitEffect": "Animation/WeaponTx/tx0002/tx0002",
-                "trailEffect": None,
-                "burnEffect": "Animation/Effects/burn_effect"  # 现有的额外字段
-            }
-        }
-    }
-    
-    # 模拟新武器配置(来自Excel,没有burnEffect)
-    new_weapon = {
-        "id": "saw_grass",
-        "name": "锯齿草",
-        "bulletConfig": {
-            "visual": {
-                "bulletPrefab": "bullets/Saw_GrassBullet",
-                "hitEffect": "Animation/WeaponTx/tx0002/tx0002",
-                "trailEffect": None
-            }
-        }
-    }
-    
-    print("现有武器visual字段:")
-    print(json.dumps(existing_weapon["bulletConfig"]["visual"], indent=2, ensure_ascii=False))
-    
-    print("\n新武器visual字段:")
-    print(json.dumps(new_weapon["bulletConfig"]["visual"], indent=2, ensure_ascii=False))
-    
-    # 执行深度合并
-    merged_weapon = deep_merge_weapon_config(existing_weapon, new_weapon)
-    
-    print("\n合并后visual字段:")
-    print(json.dumps(merged_weapon["bulletConfig"]["visual"], indent=2, ensure_ascii=False))
-    
-    # 检查burnEffect是否被保留
-    if "burnEffect" in merged_weapon["bulletConfig"]["visual"]:
-        print("\n✓ 成功!burnEffect字段已保留")
-        print(f"burnEffect值: {merged_weapon['bulletConfig']['visual']['burnEffect']}")
-        return True
-    else:
-        print("\n✗ 失败!burnEffect字段丢失")
-        return False
-
-if __name__ == "__main__":
-    success = test_burn_effect_merge()
-    if success:
-        print("\n深度合并功能正常工作")
-    else:
-        print("\n深度合并功能存在问题")