8. Boss战设计
2026/4/14大约 3 分钟
8. Boss战设计
8.1 Boss战是什么感觉?
Boss战是每一关的高潮时刻。一个好的Boss让玩家感觉:
- 震撼:它很大,很强,进场有特效
- 公平:它的攻击有规律可循,不是无脑乱打
- 多阶段:血量减少后变得更凶,玩家需要适应
Boss的核心设计原则:有规律的强大,不是无规律的随机。
8.2 Boss 阶段设计
以第一关Boss"黑铁守卫"为例,它有两个阶段:
阶段1(HP > 50%) 阶段2(HP ≤ 50%)
────────────── ──────────────────
普通攻击 普通攻击(更快)
冲锋 冲锋
砸地(范围攻击)
愤怒模式(速度+20%)8.3 Boss 基类
C
using Godot;
/// <summary>
/// Boss基类——多阶段战斗,有特殊攻击模式
/// </summary>
public partial class BossBase : EnemyBase
{
public enum BossPhase { Phase1, Phase2 }
[Export] public int BaseMaxHp { get; set; } = 500;
protected BossPhase _phase = BossPhase.Phase1;
protected int _maxHp;
protected bool _phaseTransitioned = false;
[Signal] public delegate void BossPhaseChangedEventHandler(int phase);
[Signal] public delegate void BossDiedEventHandler();
public override void _Ready()
{
// Boss血量也根据玩家人数缩放
_maxHp = DifficultyManager.Instance?.ScaleEnemyHp(BaseMaxHp) ?? BaseMaxHp;
_hp = _maxHp;
// Boss不缩放攻击力,而是用自己的攻击模式
_attack = BaseAttack;
}
public override void _PhysicsProcess(double delta)
{
base._PhysicsProcess(delta);
CheckPhaseTransition();
}
/// <summary>
/// 检查是否需要进入第二阶段
/// </summary>
private void CheckPhaseTransition()
{
if (_phaseTransitioned) return;
if (_phase == BossPhase.Phase1 && _hp <= _maxHp / 2)
{
_phase = BossPhase.Phase2;
_phaseTransitioned = true;
OnEnterPhase2();
}
}
/// <summary>
/// 进入第二阶段时的特效和变化
/// </summary>
protected virtual void OnEnterPhase2()
{
MoveSpeed *= 1.2f; // 速度提升20%
AttackRange *= 1.1f; // 攻击范围扩大10%
EmitSignal(SignalName.BossPhaseChanged, (int)BossPhase.Phase2);
GD.Print("Boss进入第二阶段!愤怒了!");
}
/// <summary>
/// Boss的攻击模式(根据阶段不同)
/// </summary>
protected override void PerformAttack()
{
if (_phase == BossPhase.Phase1)
Phase1Attack();
else
Phase2Attack();
}
protected virtual void Phase1Attack()
{
// 普通近战攻击
GD.Print($"{Name} 普通攻击!伤害:{_attack}");
}
protected virtual void Phase2Attack()
{
// 随机选择:普通攻击或特殊技能
if (GD.Randf() < 0.4f)
GroundSmash(); // 40% 概率砸地
else
Phase1Attack();
}
/// <summary>
/// 砸地技能——范围攻击,带地面震动效果
/// </summary>
protected virtual void GroundSmash()
{
GD.Print($"{Name} 砸地!范围伤害:{_attack * 2}");
// 实际项目中:激活范围攻击区域,播放震动效果
}
/// <summary>
/// 重写受伤,Boss死亡时发信号
/// </summary>
public new void TakeDamage(int damage)
{
_hp -= damage;
if (_hp <= 0)
{
_hp = 0;
EmitSignal(SignalName.BossDied);
QueueFree();
}
}
}GDScript
extends EnemyBase
class_name BossBase
## Boss基类——多阶段战斗,有特殊攻击模式
enum BossPhase { PHASE1, PHASE2 }
@export var base_max_hp: int = 500
var _phase: BossPhase = BossPhase.PHASE1
var _max_hp: int
var _phase_transitioned: bool = false
signal boss_phase_changed(phase: int)
signal boss_died
func _ready() -> void:
if DifficultyManager.instance:
_max_hp = DifficultyManager.instance.scale_enemy_hp(base_max_hp)
else:
_max_hp = base_max_hp
_hp = _max_hp
_attack = base_attack
func _physics_process(delta: float) -> void:
super._physics_process(delta)
_check_phase_transition()
## 检查是否需要进入第二阶段
func _check_phase_transition() -> void:
if _phase_transitioned:
return
if _phase == BossPhase.PHASE1 and _hp <= _max_hp / 2:
_phase = BossPhase.PHASE2
_phase_transitioned = true
_on_enter_phase2()
## 进入第二阶段
func _on_enter_phase2() -> void:
move_speed *= 1.2
attack_range *= 1.1
boss_phase_changed.emit(BossPhase.PHASE2)
print("Boss进入第二阶段!愤怒了!")
## 根据阶段执行不同攻击
func _perform_attack() -> void:
if _phase == BossPhase.PHASE1:
_phase1_attack()
else:
_phase2_attack()
func _phase1_attack() -> void:
print("%s 普通攻击!伤害:%d" % [name, _attack])
func _phase2_attack() -> void:
if randf() < 0.4:
_ground_smash()
else:
_phase1_attack()
## 砸地技能
func _ground_smash() -> void:
print("%s 砸地!范围伤害:%d" % [name, _attack * 2])
## 重写受伤
func take_damage(damage: int) -> void:
_hp -= damage
if _hp <= 0:
_hp = 0
boss_died.emit()
queue_free()8.4 Boss战的HUD
Boss战期间,屏幕顶部或底部需要显示Boss的血条:
┌─────────────────────────────────────────────┐
│ 黑铁守卫 │
│ ████████████████████░░░░░░░░░░ 60% │ ← Boss血条
│ │
│ [阶段1] 标准战斗模式 │
└─────────────────────────────────────────────┘Boss血条在普通关卡不显示,进入Boss房间时才滑入屏幕。
8.5 本章小结
| 概念 | 说明 |
|---|---|
| 多阶段 | HP降到50%时进入第二阶段,速度和技能改变 |
| 阶段信号 | 发出 BossPhaseChanged 信号,HUD更新显示 |
| 规律攻击 | 技能有冷却时间,玩家能观察规律 |
| 难度缩放 | Boss血量也根据玩家人数调整 |
| Boss血条 | 进入Boss房间时显示,死亡后隐藏 |
下一章我们将添加音效,让战斗更有打击感。
