HOME / 第 7 部分 · 完整游戏项目实战 / 第 82 课
MODULE 7 · 完整游戏项目实战
第 82 课 · 像素风游戏实战(三):敌人、收集与完成
🎯 本课学习目标
- 制作巡逻敌人
- 实现收集宝石与通关
- 整合音效、UI 并发布准备
像素勇者收官:敌人、宝石、通关判定,做成完整可玩的小游戏。
📖 详细教学步骤
制作敌人搭建
- 新建 enemy.tscn,根 CharacterBody2D
- AnimatedSprite2D(史莱姆动画)+ CollisionShape2D
- 脚本实现巡逻 + 碰玩家扣血(第 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)
宝石收集搭建
- 新建 gem.tscn,根 Area2D + AnimatedSprite2D(宝石动画)+ CollisionShape2D
- 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()
通关判定搭建
- 地图尽头放 Area2D(终点)
- 玩家进入 → 显示「通关!」+ 宝石数 + 返回菜单按钮
HUD 与全局集成
宝石数放 Globals 单例(第 67 课),HUD 实时显示:
GDSCRIPT# Globals.gd (Autoload)
var gems: int = 0
# hud.gd
func _process(delta):
$GemsLabel.text = "宝石: " + str(Globals.gems)
收尾:音效、菜单、发布准备收尾
- 加主菜单(开始/退出)
- 加音效:跳跃、吃宝石、敌人受击(第 44 课)
- 加游戏结束/重开(第 28 课)
- 测试完整流程:菜单 → 游戏 → 通关 → 重开
- 把项目导出(第 96-98 课)
🎉 像素勇者完成!这是你第一个完整的独立小游戏。
⚠️
敌人踩到玩家没扣血?
攻击 Area2D 要设置好碰撞层,且玩家脚本有 take_damage 方法。
⚠️
宝石吃了没计数?
确认 Globals 单例注册、gem 脚本调用 Globals.gems += 1、HUD 在 _process 刷新。
🧪 动手试一试
🏋️ 课后练习
给像素游戏加 3 个关卡:每关宝石数不同,全部通关后显示「全部通关!」结算画面。
Globals.level 记录关卡,通关时递增并切换场景。
💡
一个小而完整的游戏比大而残缺的更值钱,把它打磨到「能给别人玩」。
💡
发布前让朋友试玩,收集反馈再改。
🎓 本课小结
像素勇者完整版:敌人巡逻攻击 + 宝石收集计分 + 通关判定 + 音效 UI + 菜单;一个完整可发布的小游戏诞生。