HOME / 第 7 部分 · 完整游戏项目实战 / 第 92 课
MODULE 7 · 完整游戏项目实战
第 92 课 · 2D RPG 实战(三):战斗、背包与完成
🎯 本课学习目标
- 实现简单回合制战斗
- 实现背包系统
- 整合成完整 RPG 原型
RPG 收官:回合制战斗 + 背包 + 完成整合。
📖 详细教学步骤
战斗设计设计
- 接触怪物进入战斗场景
- 回合制:玩家攻击/技能/使用道具/逃跑
- 敌人行动 → 玩家行动 循环
- 胜利得经验/金币
战斗场景搭建
- 新建 battle.tscn:背景 + 敌人显示 + 玩家状态 + 操作按钮
- 传入敌人数据(从 Globals 或参数)
- 回合流程脚本
回合制逻辑代码
核心回合循环:
GDSCRIPTextends Node
var enemy_hp: int = 50
var player_hp: int = 100
var player_turn: bool = true
func _on_attack_pressed():
if not player_turn: return
# 玩家攻击
enemy_hp -= 10
update_display()
if enemy_hp <= 0:
win()
return
player_turn = false
await get_tree().create_timer(0.8).timeout
enemy_turn()
func enemy_turn():
player_hp -= 8 # 敌人攻击
update_display()
if player_hp <= 0:
lose()
return
player_turn = true
背包系统代码
背包数据(第 68 课物品资源):
GDSCRIPT# Globals.gd
var inventory: Array[ItemData] = []
var gold: int = 50
func add_item(item: ItemData):
inventory.append(item)
func use_item(item: ItemData):
match item.type:
"potion":
player_hp = min(player_hp + item.heal_amount, max_hp)
"weapon":
attack += item.power
inventory.erase(item)
背包 UI搭建
- 按 B/I 打开背包面板
- 物品列表(VBoxContainer + 图标 + 数量)
- 选中物品 → 使用/丢弃按钮
- 第 68 课的资源驱动物品直接可用
战斗奖励与经验代码
胜利后:
GDSCRIPTfunc win():
Globals.gold += 30
Globals.exp += 20
# 掉落物品
if randf() < 0.5:
Globals.add_item(potion_item)
show_result("胜利! 获得金币和经验")
await get_tree().create_timer(1.5).timeout
get_tree().change_scene_to_file("res://scenes/world.tscn")
整合与完成收尾
- 世界场景:接触怪物 Area2D → 切战斗场景
- 主菜单 + 存档(第 62 课)
- 音效与特效:攻击、受伤、胜利
- 完整流程:村庄接任务 → 打怪 → 交任务 → 商店买装备 → 挑战 BOSS
- 测试全流程
🎉 完整 RPG 原型完成!你已经具备制作完整游戏的能力。
⚠️
战斗回合乱?
用 player_turn 布尔锁定回合,敌人行动用 await 延时,别在信号里嵌套混乱。
⚠️
背包物品不会消失?
使用后 inventory.erase(item),注意数组 erase 的是同一个资源引用。
🧪 动手试一试
🏋️ 课后练习
加入「技能系统」:战斗中除了普攻,还能用技能(消耗 MP,伤害更高)。
Globals.mp 变量 + 技能按钮 + 消耗判断。
💡
RPG 系统多,用 Globals 单例统一管理玩家状态。
💡
先做「最小的完整循环」:接任务→打怪→奖励,再扩展。
🎓 本课小结
RPG 完整版:回合制战斗(攻/技/道具)+ 背包物品 + 战斗奖励 + 世界探索 + 存档;一个五脏俱全的 RPG 原型。