HOME / 第 7 部分 · 完整游戏项目实战 / 第 94 课
MODULE 7 · 完整游戏项目实战
第 94 课 · 太空射击完整项目(二):敌人与战斗
🎯 本课学习目标
- 实现多种敌人与波次
- 实现道具系统
- 实现音效与特效
太空射击第二课:敌人、道具、战斗反馈。
📖 详细教学步骤
敌人类型搭建
三种敌人(场景复用 + 参数):
- 陨石:直线下坠,血量低
- 敌舰:缓慢移动 + 射击
- 精英:血厚 + 三向弹幕
都用 enemy.tscn,脚本里用 @export 区分类型。
敌人脚本代码
统一敌人行为:
GDSCRIPTextends Area2D
enum Type { METEOR, SHIP, ELITE }
@export var type: Type = Type.METEOR
@export var speed: float = 120.0
var hp: int = 1
func _ready():
match type:
Type.METEOR:
hp = 1
Type.SHIP:
hp = 3
fire_timer = randf_range(0.5, 2.0)
Type.ELITE:
hp = 10
func _physics_process(delta):
global_position.y += speed * delta
if global_position.y > 700:
queue_free() # 飞出屏幕
if type != Type.METEOR:
try_fire(delta)
func take_damage(dmg: int):
hp -= dmg
flash_white()
if hp <= 0:
die()
func die():
Globals.add_score(score_value)
GameAudio.explosion()
spawn_explosion()
maybe_drop_powerup()
queue_free()
道具系统代码
敌机随机掉落道具(三连发/护盾/生命):
GDSCRIPTenum Powerup { TRIPLE, SHIELD, HEART }
func maybe_drop_powerup():
if randf() < 0.15:
var p = powerup_scene.instantiate()
p.type = [Powerup.TRIPLE, Powerup.SHIELD, Powerup.HEART][randi() % 3]
p.global_position = global_position
get_parent().add_child(p)
# powerup.gd
func _on_body_entered(body):
if body.is_in_group("player"):
match type:
Powerup.TRIPLE:
body.activate_triple()
Powerup.SHIELD:
body.activate_shield()
Powerup.HEART:
body.add_life()
queue_free()
波次生成代码
波次管理:
GDSCRIPTfunc start_wave(n: int):
Globals.wave = n
for i in range(4 + n * 2):
spawn_enemy(randi() % 3) # 随机类型
await get_tree().create_timer(0.6).timeout
# 波次结束(清完敌人后下一波)
音效与反馈集成
AudioManager 单例统一播放(第 44/45 课):
GDSCRIPT# GameAudio.gd (Autoload)
func explosion():
sfx.stream = load("res://audio/explosion.wav")
sfx.pitch_scale = randf_range(0.9, 1.1)
sfx.play()
func powerup():
...
战斗特效集成
- 爆炸粒子(第 42 课)
- 受击闪白(第 43 课着色器)
- 相机震动(第 23 课 shake)
- 子弹拖尾(粒子跟随)
- 护盾效果(圆形发光)
测试测试
- 多种敌人出现、掉落道具
- 道具生效(三连发/护盾)
- 音效特效齐全
- 波次递增
🎉 战斗系统完成!
⚠️
敌人一次刷太多卡顿?
控制单屏敌人数量,或用对象池(重复利用实例)。
⚠️
道具没触发?
道具 Area2D 与玩家都要有碰撞形状,且判断 player 组。
🧪 动手试一试
🏋️ 课后练习
加入「护盾」道具:吃后玩家周围出现金色光圈,可抵挡一次撞击。
player 加 shield 布尔 + 可视化 + 受击时先扣护盾。
💡
敌人用类型枚举统一管理,加新类型只加枚举分支。
💡
掉落概率 10-20% 手感较好,可调。
🎓 本课小结
太空射击战斗:三种敌人(枚举) + 波次生成 + 道具掉落(三连发/护盾/生命) + AudioManager 音效 + 爆炸/闪白/震屏特效。