HOME / 第 7 部分 · 完整游戏项目实战 / 第 94 课
MODULE 7 · 完整游戏项目实战

第 94 课 · 太空射击完整项目(二):敌人与战斗

⏱ 预计时长 50 分钟📊 难度 进阶📚 模块 第 7 部分 · 完整游戏项目实战

🎯 本课学习目标

太空射击第二课:敌人、道具、战斗反馈。

📖 详细教学步骤

敌人类型搭建

三种敌人(场景复用 + 参数):

  • 陨石:直线下坠,血量低
  • 敌舰:缓慢移动 + 射击
  • 精英:血厚 + 三向弹幕

都用 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)
  • 子弹拖尾(粒子跟随)
  • 护盾效果(圆形发光)

测试测试

  1. 多种敌人出现、掉落道具
  2. 道具生效(三连发/护盾)
  3. 音效特效齐全
  4. 波次递增

🎉 战斗系统完成!

⚠️
敌人一次刷太多卡顿?

控制单屏敌人数量,或用对象池(重复利用实例)。

⚠️
道具没触发?

道具 Area2D 与玩家都要有碰撞形状,且判断 player 组。

🧪 动手试一试

🏋️ 课后练习

加入「护盾」道具:吃后玩家周围出现金色光圈,可抵挡一次撞击。

player 加 shield 布尔 + 可视化 + 受击时先扣护盾。

💡

敌人用类型枚举统一管理,加新类型只加枚举分支。

💡

掉落概率 10-20% 手感较好,可调。

🎓 本课小结

太空射击战斗:三种敌人(枚举) + 波次生成 + 道具掉落(三连发/护盾/生命) + AudioManager 音效 + 爆炸/闪白/震屏特效。