HOME / 第 7 部分 · 完整游戏项目实战 / 第 89 课
MODULE 7 · 完整游戏项目实战
第 89 课 · 解谜游戏实战(二):关卡与完成
🎯 本课学习目标
- 设计多关卡
- 实现关卡切换
- 完成解谜游戏
解谜收官:把机制做成多关卡可玩的小游戏。
📖 详细教学步骤
关卡数据驱动进阶
把关卡用数据描述(瓦片布局):
GDSCRIPT# levels.json 中的一关
{
"map": [
"##########",
"#P...#.B.#", # P=玩家, B=箱子, .=目标, #=墙
"#..G..B..#", # G=开关
"##########"
]
}
关卡加载器代码
按字符生成关卡:
GDSCRIPTconst TILE = 32
func load_level(data: Dictionary):
clear_level() # 清空旧关卡
var rows = data["map"]
for y in range(rows.size()):
for x in range(rows[y].length()):
var c = rows[y][x]
var pos = Vector2(x * TILE, y * TILE)
match c:
"#":
spawn_wall(pos)
"P":
player.position = pos + Vector2(TILE/2, TILE/2)
"B":
spawn_box(pos)
"G":
spawn_goal(pos)
"S":
spawn_switch(pos)
切换关卡代码
过关 → 加载下一关:
GDSCRIPTvar level_index: int = 0
func next_level():
level_index += 1
if level_index >= levels.size():
show_all_clear() # 全部通关
else:
load_level(levels[level_index])
hud.show_level(level_index + 1)
重置与步数统计代码
解谜游戏常统计步数:
GDSCRIPTvar steps: int = 0
func _on_player_moved():
steps += 1
hud.update_steps(steps)
func reset_level():
steps = 0
load_level(levels[level_index])
UI 整合集成
- HUD:关卡号、步数、重置按钮
- 过关提示「恭喜过关」+ 自动下一关
- 全部通关结算界面
- 音效:推箱、开门、过关
设计 3 个关卡收尾
- 第 1 关:教学(推一个箱子到目标)
- 第 2 关:开关门引入
- 第 3 关:组合谜题(两箱子+两开关)
- 每个关卡自己玩通验证可行性
🎉 完整解谜游戏完成!
⚠️
关卡加载重复物体?
每次 load_level 前必须 clear_level 清掉旧的玩家/箱子/门。
⚠️
文字地图对不齐?
地图每行长度一致(字符数相同),TILE 尺寸统一。
🧪 动手试一试
🏋️ 课后练习
设计并实现第 3 关组合谜题:两个箱子分别压两个开关,两个门全开才能到达终点。
两个开关分别连门,逻辑 AND:两门都开才通。
💡
数据驱动关卡 = 加关卡只需改 JSON,不改代码。
💡
谜题先自己解一遍,确保有解且唯一。
🎓 本课小结
解谜游戏完整版:字符地图数据驱动 + 关卡加载器 + 步数统计 + 重置/切换 + 多关卡设计;机制组合成完整游戏。