HOME / 第 7 部分 · 完整游戏项目实战 / 第 88 课
MODULE 7 · 完整游戏项目实战
第 88 课 · 解谜游戏实战(一):基础机制
🎯 本课学习目标
- 设计解谜游戏机制
- 实现推箱子基础
- 实现开关与门
换换口味做解谜!本课实现推箱子与开关门两种经典机制。
📖 详细教学步骤
解谜设计设计
- 玩法 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"))
关卡结构搭建
- 关卡:瓦片地面 + 墙
- 玩家 + 箱子 + 目标点 + 开关 + 门
- 重置按钮(重开本关)
- 过关提示 + 下一关
⚠️
箱子推不动?
箱子要能被玩家碰撞推动,玩家用 move_and_slide 后检测碰撞并推动箱子。
⚠️
箱子被推进墙里?
推之前检查目标位置是否有墙(用射线/坐标判断)。
🧪 动手试一试
🏋️ 课后练习
做一关「箱子压开关开门」:玩家把箱子推到开关上,门打开,走进门就过关。
箱子 RigidBody 压开关(Area2D)→ 门动画开 → 玩家进门 Area2D 通关。
💡
推箱子格子感强,用 32 像素整数移动更整齐。
💡
解谜核心是「机制组合」:箱子+开关+门 就能出很多谜题。
🎓 本课小结
解谜基础:推箱子(碰撞推动)+ 开关门(Area2D 信号)+ 目标点判定过关;机制组合是解谜设计的核心。