|
|
@@ -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();
|
|
|
+ }
|
|
|
}
|
|
|
}
|