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

第 88 课 · 解谜游戏实战(一):基础机制

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

🎯 本课学习目标

换换口味做解谜!本课实现推箱子与开关门两种经典机制。

📖 详细教学步骤

解谜设计设计

  • 玩法 1:推箱子到目标点
  • 玩法 2:踩开关开门
  • 结合:箱子压住开关 → 门开
  • 目标:所有箱子归位 → 过关

推箱子(箱体)代码

箱子用 RigidBody2D 或 CharacterBody2D 均可,本课用 CharacterBody2D(可控性更好):

GDSCRIPTextends CharacterBody2D

func _physics_process(delta):
    move_and_slide()   # 被玩家推动时靠碰撞传递

玩家推箱逻辑代码

玩家面向箱子时,把箱子「推」一格:

GDSCRIPTextends CharacterBody2D

@export var speed: float = 200.0
var facing: Vector2 = Vector2.RIGHT

func _physics_process(delta):
    var dir = Input.get_vector("move_left", "move_right", "move_up", "move_down")
    if dir != Vector2.ZERO:
        facing = dir
    # 撞到箱子时推动
    move_and_slide()
    for i in get_slide_collision_count():
        var col = get_slide_collision(i)
        if col.get_collider().is_in_group("box"):
            push_box(col.get_collider(), facing)

func push_box(box, dir: Vector2):
    # 把箱子推向同一方向
    box.global_position += dir * 32   # 一格=32像素
    box.velocity = Vector2.ZERO

箱子目标点与过关代码

所有箱子都到目标点即过关:

GDSCRIPT# 目标点: Area2D + 可视化光圈
# 箱子进入目标点 = 归位
func _on_box_entered(area):
    if area.is_in_group("goal"):
        boxes_placed += 1
        check_win()

func check_win():
    if boxes_placed >= total_boxes:
        get_tree().current_scene.show_win()

开关与门代码

踩开关开门:

GDSCRIPT# switch.gd (Area2D)
extends Area2D

signal activated
signal deactivated

func _ready():
    body_entered.connect(func(b): if b.is_in_group("player"): activated.emit())
    body_exited.connect(func(b): if b.is_in_group("player"): deactivated.emit())

# door.gd
@onready var anim: AnimationPlayer = $AnimationPlayer

func _ready():
    var sw = get_node("../Switch")
    sw.activated.connect(func(): anim.play("open"))
    sw.deactivated.connect(func(): anim.play("close"))

关卡结构搭建

  1. 关卡:瓦片地面 + 墙
  2. 玩家 + 箱子 + 目标点 + 开关 + 门
  3. 重置按钮(重开本关)
  4. 过关提示 + 下一关
⚠️
箱子推不动?

箱子要能被玩家碰撞推动,玩家用 move_and_slide 后检测碰撞并推动箱子。

⚠️
箱子被推进墙里?

推之前检查目标位置是否有墙(用射线/坐标判断)。

🧪 动手试一试

🏋️ 课后练习

做一关「箱子压开关开门」:玩家把箱子推到开关上,门打开,走进门就过关。

箱子 RigidBody 压开关(Area2D)→ 门动画开 → 玩家进门 Area2D 通关。

💡

推箱子格子感强,用 32 像素整数移动更整齐。

💡

解谜核心是「机制组合」:箱子+开关+门 就能出很多谜题。

🎓 本课小结

解谜基础:推箱子(碰撞推动)+ 开关门(Area2D 信号)+ 目标点判定过关;机制组合是解谜设计的核心。