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

第 82 课 · 像素风游戏实战(三):敌人、收集与完成

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

🎯 本课学习目标

像素勇者收官:敌人、宝石、通关判定,做成完整可玩的小游戏。

📖 详细教学步骤

制作敌人搭建

  1. 新建 enemy.tscn,根 CharacterBody2D
  2. AnimatedSprite2D(史莱姆动画)+ CollisionShape2D
  3. 脚本实现巡逻 + 碰玩家扣血(第 24/26 课复用)
GDSCRIPTextends CharacterBody2D

@export var speed: float = 40.0
var dir: int = -1
@onready var anim: AnimatedSprite2D = $AnimatedSprite2D

func _physics_process(delta):
    velocity.x = dir * speed
    move_and_slide()
    if is_on_wall():
        dir *= -1
    anim.flip_h = dir > 0

敌人攻击玩家代码

敌人碰到玩家扣血:

GDSCRIPTfunc _on_AttackArea_body_entered(body):
    if body.has_method("take_damage"):
        body.take_damage(1)

宝石收集搭建

  1. 新建 gem.tscn,根 Area2D + AnimatedSprite2D(宝石动画)+ CollisionShape2D
  2. body_entered → 加分 + 音效 + 删除
GDSCRIPTextends Area2D

@onready var sfx: AudioStreamPlayer = $AudioStreamPlayer

func _ready():
    body_entered.connect(_on_body_entered)

func _on_body_entered(body):
    if body.is_in_group("player"):
        Globals.gems += 1
        sfx.play()
        hide()          # 先隐藏(等音效播完再删)
        await sfx.finished
        queue_free()

通关判定搭建

  1. 地图尽头放 Area2D(终点)
  2. 玩家进入 → 显示「通关!」+ 宝石数 + 返回菜单按钮

HUD 与全局集成

宝石数放 Globals 单例(第 67 课),HUD 实时显示:

GDSCRIPT# Globals.gd (Autoload)
var gems: int = 0

# hud.gd
func _process(delta):
    $GemsLabel.text = "宝石: " + str(Globals.gems)

收尾:音效、菜单、发布准备收尾

  1. 加主菜单(开始/退出)
  2. 加音效:跳跃、吃宝石、敌人受击(第 44 课)
  3. 加游戏结束/重开(第 28 课)
  4. 测试完整流程:菜单 → 游戏 → 通关 → 重开
  5. 把项目导出(第 96-98 课)

🎉 像素勇者完成!这是你第一个完整的独立小游戏。

⚠️
敌人踩到玩家没扣血?

攻击 Area2D 要设置好碰撞层,且玩家脚本有 take_damage 方法。

⚠️
宝石吃了没计数?

确认 Globals 单例注册、gem 脚本调用 Globals.gems += 1、HUD 在 _process 刷新。

🧪 动手试一试

🏋️ 课后练习

给像素游戏加 3 个关卡:每关宝石数不同,全部通关后显示「全部通关!」结算画面。

Globals.level 记录关卡,通关时递增并切换场景。

💡

一个小而完整的游戏比大而残缺的更值钱,把它打磨到「能给别人玩」。

💡

发布前让朋友试玩,收集反馈再改。

🎓 本课小结

像素勇者完整版:敌人巡逻攻击 + 宝石收集计分 + 通关判定 + 音效 UI + 菜单;一个完整可发布的小游戏诞生。