181404010226 5 сар өмнө
parent
commit
540e4d7008

+ 1 - 1
assets/assets/Prefabs/Enemy.prefab

@@ -578,7 +578,7 @@
     "tag": 4,
     "_group": 16,
     "_density": 1,
-    "_sensor": false,
+    "_sensor": true,
     "_friction": 0.2,
     "_restitution": 0,
     "_offset": {

+ 2 - 2
assets/scripts/CombatSystem/BallController.ts

@@ -559,12 +559,12 @@ export class BallController extends Component {
     
     // 碰撞预处理事件 - 简化版本
     onPreSolve(selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {
-        console.log('⚙️ 碰撞预处理:', otherCollider.node.name);
+        // console.log('⚙️ 碰撞预处理:', otherCollider.node.name);
     }
     
     // 碰撞后处理事件 - 简化版本
     onPostSolve(selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {
-        console.log('✅ 碰撞后处理:', otherCollider.node.name);
+        // console.log('✅ 碰撞后处理:', otherCollider.node.name);
     }
 
     // 计算反射向量

+ 1 - 1
assets/scripts/CombatSystem/BulletController.ts

@@ -182,7 +182,7 @@ export class BulletController extends Component {
         const targetPos = this.targetEnemy.worldPosition;
         const currentPos = this.node.worldPosition;
         
-        this.direction = targetPos.subtract(currentPos).normalize();
+        this.direction = targetPos.clone().subtract(currentPos).normalize();
         console.log('🎯 方向已设置,朝向目标敌人');
     }
 

+ 12 - 1
assets/scripts/CombatSystem/EnemyController.ts

@@ -330,7 +330,7 @@ export class EnemyController extends BaseSingleton {
                 this.activeEnemies.splice(index, 1);
             }
             
-            // 销毁敌人
+            // 销毁敌人(在 onDestroy 中由 EnemyInstance -> notifyEnemyDead 计数)
             enemy.destroy();
         }
     }
@@ -421,4 +421,15 @@ export class EnemyController extends BaseSingleton {
             this.gameManager = gameManagerNode.getComponent('GameManager');
         }
     }
+
+    /** 供 EnemyInstance 在 onDestroy 中调用 */
+    public notifyEnemyDead(enemyNode?: Node) {
+        if (enemyNode) {
+            const idx = this.activeEnemies.indexOf(enemyNode);
+            if (idx !== -1) this.activeEnemies.splice(idx, 1);
+        }
+        if (this.gameManager && this.gameManager.onEnemyKilled) {
+            this.gameManager.onEnemyKilled();
+        }
+    }
 } 

+ 9 - 2
assets/scripts/CombatSystem/EnemyInstance.ts

@@ -143,12 +143,19 @@ export class EnemyInstance extends Component {
         
         // 如果血量低于等于0,销毁敌人
         if (this.health <= 0) {
-            // 移除递归调用 controller.damageEnemy,避免堆栈溢出。
-            // 如果需要让 EnemyController 统计死亡数量,可在 EnemyController.update 中自动清理无效节点,或另行实现 onEnemyDead 事件。
+            // 通知控制器即将死亡,由 controller 统一通知 GameManager
+            // 避免重复调用 onEnemyKilled
             this.node.destroy();
         }
     }
 
+    onDestroy() {
+        // 通知控制器 & GameManager
+        if (this.controller && typeof (this.controller as any).notifyEnemyDead === 'function') {
+            (this.controller as any).notifyEnemyDead(this.node);
+        }
+    }
+
     update(deltaTime: number) {
         if (this.state === EnemyState.MOVING) {
             this.updateMovement(deltaTime);

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

@@ -23,13 +23,13 @@ export class PhysicsManager extends BaseSingleton {
         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;
     }
 
     /**

+ 56 - 24
assets/scripts/LevelSystem/GameManager.ts

@@ -117,6 +117,9 @@ export class GameManager extends Component {
     private currentWave: number = 1;
     private currentWaveEnemyCount: number = 0;
     private currentWaveTotalEnemies: number = 0; // 当前波次总敌人数
+    private levelWaves: any[] = [];              // 关卡波次配置
+    private levelTotalEnemies: number = 0;       // 本关卡总敌人数
+    private enemiesKilled: number = 0;           // 已击杀敌人数量
     
     // 游戏计时器
     private gameStartTime: number = 0;
@@ -356,22 +359,22 @@ export class GameManager extends Component {
 
     // === 游戏状态检查 ===
     private checkGameState() {
-        // 检查血量
+        // 更新血量
         this.updateHealthFromUI();
-        
+
         if (this.currentHealth <= 0) {
             this.triggerGameDefeat();
             return;
         }
 
-        // 更新当前敌人数量(用于胜利检测,不影响UI显示
+        // 更新当前敌人数量(用于波次UI显示等,不影响胜利逻辑
         if (this.enemyController) {
-            const currentEnemyCount = this.enemyController.getCurrentEnemyCount ? 
+            const currentEnemyCount = this.enemyController.getCurrentEnemyCount ?
                 this.enemyController.getCurrentEnemyCount() : 0;
             this.updateCurrentWaveEnemyCount(currentEnemyCount);
         }
 
-        // 检查敌人状态
+        // 检查是否全部击败
         if (this.checkAllEnemiesDefeated()) {
             this.triggerGameSuccess();
             return;
@@ -398,13 +401,11 @@ export class GameManager extends Component {
             return false;
         }
 
-        // 检查敌人是否已开始生成
+        // 检查敌人是否已开始生成(避免开局就胜利)
         if (!this.enemySpawningStarted) {
-            // 检查游戏是否已开始(EnemyController的gameStarted属性)
-            if (this.enemyController.isGameStarted()) {
+            if (this.enemyController.isGameStarted && this.enemyController.isGameStarted()) {
                 this.enemySpawningStarted = true;
             } else {
-                // 敌人还未开始生成,不算胜利
                 return false;
             }
         }
@@ -413,15 +414,19 @@ export class GameManager extends Component {
         const currentEnemyCount = this.enemyController.getCurrentEnemyCount ? 
             this.enemyController.getCurrentEnemyCount() : 0;
 
+        // 如果关卡总敌人数已知,以击杀数为准判定胜利
+        if (this.levelTotalEnemies > 0) {
+            // 当击杀数达到或超过总敌数且场上没有存活敌人时胜利
+            return this.enemiesKilled >= this.levelTotalEnemies && currentEnemyCount === 0;
+        }
+
+        // 否则退化到旧逻辑:依赖于是否曾经生成过敌人
+
         // 更新已生成敌人总数(记录曾经达到的最大值)
         if (currentEnemyCount > this.totalEnemiesSpawned) {
             this.totalEnemiesSpawned = currentEnemyCount;
         }
 
-        // 只有在以下情况下才算胜利:
-        // 1. 敌人生成已开始
-        // 2. 当前敌人数量为0
-        // 3. 曾经生成过敌人(避免游戏刚开始就判定胜利)
         const shouldCheckVictory = this.enemySpawningStarted && 
                                  currentEnemyCount === 0 && 
                                  this.totalEnemiesSpawned > 0;
@@ -903,6 +908,7 @@ export class GameManager extends Component {
         this.gameEndTime = 0;
         this.currentHealth = this.initialHealth;
         this.totalEnemiesSpawned = 0;
+        this.enemiesKilled = 0;
         this.currentWave = 1;
         this.currentWaveEnemyCount = 0;
         
@@ -1087,15 +1093,23 @@ export class GameManager extends Component {
 
         // 记录敌人波次配置信息并初始化第一波
         if (levelConfig.waves && levelConfig.waves.length > 0) {
-            console.log('关卡敌人波次配置:', levelConfig.waves);
-            
-            // 设置第一波的信息
-            const firstWave = levelConfig.waves[0];
+            this.levelWaves = levelConfig.waves;
+            console.log('关卡敌人波次配置:', this.levelWaves);
+
+            // 计算整关卡总敌人数
+            this.levelTotalEnemies = this.levelWaves.reduce((levelTotal: number, wave: any) => {
+                if (!wave || !wave.enemies) return levelTotal;
+                const waveTotal = wave.enemies.reduce((t: number, g: any) => t + (g.count || 0), 0);
+                return levelTotal + waveTotal;
+            }, 0);
+            console.log(`📊 本关卡共有敌人: ${this.levelTotalEnemies}`);
+
+            // 初始化第一波
+            const firstWave = this.levelWaves[0];
             if (firstWave && firstWave.enemies) {
-                const totalEnemiesInFirstWave = firstWave.enemies.reduce((total, enemyGroup) => {
+                const totalEnemiesInFirstWave = firstWave.enemies.reduce((total: number, enemyGroup: any) => {
                     return total + (enemyGroup.count || 0);
                 }, 0);
-                
                 this.setCurrentWave(1, totalEnemiesInFirstWave);
             }
         }
@@ -1182,10 +1196,28 @@ export class GameManager extends Component {
     // === 进入下一波 ===
     public nextWave() {
         this.currentWave++;
-        this.updateWaveDisplay();
-        
-        // 这里可以根据关卡配置设置下一波的敌人数量
-        // 暂时设置为0,等待具体的波次系统实现
-        this.setCurrentWave(this.currentWave, 0);
+
+        // 根据关卡配置获取下一波敌人数
+        let enemyTotal = 0;
+        if (this.levelWaves && this.levelWaves.length >= this.currentWave) {
+            const waveCfg = this.levelWaves[this.currentWave - 1];
+            if (waveCfg && waveCfg.enemies) {
+                enemyTotal = waveCfg.enemies.reduce((t: number, g: any) => t + (g.count || 0), 0);
+            }
+        }
+
+        this.setCurrentWave(this.currentWave, enemyTotal);
+    }
+
+    /** 敌人被消灭时由 EnemyController 调用 */
+    public onEnemyKilled() {
+        this.enemiesKilled++;
+        const remaining = Math.max(0, this.levelTotalEnemies - this.enemiesKilled);
+        console.log(`⚔️ 已击杀: ${this.enemiesKilled}, 剩余敌人数量: ${remaining}`);
+
+        // 如果需要在 UI 上实时显示剩余敌人数量,可在此赋值
+        if (this.enemyNumberLabel) {
+            this.enemyNumberLabel.string = remaining.toString();
+        }
     }
 }