HOME / 第 7 部分 · 完整游戏项目实战 / 第 87 课
MODULE 7 · 完整游戏项目实战
第 87 课 · 弹幕射击游戏(二):完善与特效
🎯 本课学习目标
- 实现 BOSS 与血条
- 粒子爆炸特效
- 计分与结束界面
弹幕游戏收官:BOSS 战、爆炸特效、计分结算。
📖 详细教学步骤
爆炸特效代码
敌机被击落时的爆炸:
GDSCRIPT# 爆炸场景 explosion.tscn: GPUParticles2D
func spawn_explosion(pos: Vector2):
var fx = explosion_scene.instantiate()
fx.global_position = pos
get_parent().add_child(fx)
fx.emitting = true
# 播完自动删除
fx.finished.connect(fx.queue_free)
计分系统代码
击落敌机得分 + HUD 显示:
GDSCRIPT# Globals.gd
var score: int = 0
# enemy.gd 死亡时
func die():
Globals.score += 100
spawn_explosion(global_position)
queue_free()
# hud.gd
func _process(delta):
$ScoreLabel.text = "得分: " + str(Globals.score)
BOSS 敌人搭建
大型敌机 + 血条:
GDSCRIPTextends Area2D
var hp: int = 200
@onready var hp_bar: ProgressBar = $HpBar
func _ready():
body_entered.connect(_on_body_entered)
func take_damage(amount: int):
hp -= amount
hp_bar.value = hp
if hp <= 0:
die()
func die():
Globals.score += 1000
spawn_explosion(global_position)
get_tree().current_scene.show_win() # 击败 BOSS 通关
queue_free()
BOSS 弹幕(进阶)代码
BOSS 螺旋弹幕(旋转扇形):
GDSCRIPTvar spin_angle: float = 0.0
func _physics_process(delta):
spin_angle += 2.0 * delta
# 每 0.3 秒发射一圈
timer -= delta
if timer <= 0:
timer = 0.3
for i in range(8):
var angle = spin_angle + i * TAU / 8
var b = enemy_bullet.instantiate()
b.global_position = global_position
b.dir = Vector2(1, 0).rotated(angle)
get_parent().add_child(b)
生命与结束界面集成
- 玩家生命:被弹幕击中扣 1 命(3 命),短暂无敌闪烁
- 命尽 → 游戏结束界面(得分 + 重开)
- BOSS 死 → 通关界面
- 都从第 28/66 课复用逻辑
完整测试与打磨收尾
- 流程:开局 → 小怪波 → BOSS 战 → 通关/失败 → 结算
- 加音效:射击、爆炸、命中
- 粒子:爆炸、子弹拖尾、背景星点
- 手感:子弹速度、弹幕密度
- 完整玩 3 遍
🎉 完整弹幕射击游戏完成!
⚠️
BOSS 血条不动?
确认 take_damage 每帧调用 hp_bar.value 更新,且 BOSS 的 take_damage 真的被子弹调用。
⚠️
爆炸特效不同步?
特效播完用 finished 信号删除,别手动定时删(会有残留或早删)。
🧪 动手试一试
🏋️ 课后练习
给 BOSS 设计 2 阶段:血量低于 50% 时弹幕加密 + BOSS 加速变色。
hp < max_hp/2 时切换 fire_interval 和颜色。
💡
BOSS 战是弹幕游戏的高潮,多设计几套弹幕更有趣。
💡
粒子爆炸 + 屏幕震动(第 23 课 shake)组合打击感强。
🎓 本课小结
弹幕游戏完整版:爆炸粒子 + 计分 HUD + BOSS 血条与螺旋弹幕 + 生命/结束界面;特效与反馈齐全。