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

第 89 课 · 解谜游戏实战(二):关卡与完成

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

🎯 本课学习目标

解谜收官:把机制做成多关卡可玩的小游戏。

📖 详细教学步骤

关卡数据驱动进阶

把关卡用数据描述(瓦片布局):

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 整合集成

  1. HUD:关卡号、步数、重置按钮
  2. 过关提示「恭喜过关」+ 自动下一关
  3. 全部通关结算界面
  4. 音效:推箱、开门、过关

设计 3 个关卡收尾

  1. 第 1 关:教学(推一个箱子到目标)
  2. 第 2 关:开关门引入
  3. 第 3 关:组合谜题(两箱子+两开关)
  4. 每个关卡自己玩通验证可行性

🎉 完整解谜游戏完成!

⚠️
关卡加载重复物体?

每次 load_level 前必须 clear_level 清掉旧的玩家/箱子/门。

⚠️
文字地图对不齐?

地图每行长度一致(字符数相同),TILE 尺寸统一。

🧪 动手试一试

🏋️ 课后练习

设计并实现第 3 关组合谜题:两个箱子分别压两个开关,两个门全开才能到达终点。

两个开关分别连门,逻辑 AND:两门都开才通。

💡

数据驱动关卡 = 加关卡只需改 JSON,不改代码。

💡

谜题先自己解一遍,确保有解且唯一。

🎓 本课小结

解谜游戏完整版:字符地图数据驱动 + 关卡加载器 + 步数统计 + 重置/切换 + 多关卡设计;机制组合成完整游戏。