推箱子
游戏英文名:Sokoban
Github 另有视频,详见各视频平台。
游戏目标
将箱子推到检查点上,所有检查点都有箱子则游戏结束。
设计与实现
目录结构
sh
$ tree
.
├── project.godot
├── resource
│ └── tileset.tres
├── scene
│ ├── arena
│ │ ├── arena.gd
│ │ └── arena.tscn
│ ├── check_point
│ │ ├── check_point.gd
│ │ └── check_point.tscn
│ ├── crate
│ │ ├── crate.gd
│ │ └── crate.tscn
│ ├── entry
│ │ ├── entry.gd
│ │ └── entry.tscn
│ ├── level
│ │ ├── level_1.tscn
│ │ ├── level_2.tscn
│ │ └── level_3.tscn
│ ├── main.gd
│ ├── main.tscn
│ ├── map
│ │ ├── map.gd
│ │ └── map.tscn
│ └── player
│ ├── player.gd
│ └── player.tscn
└── script
├── controller.gd
└── global.gd
Scene 场景
arena 竞技场
level 关卡,在 arena 的基础上绘制地图
player 玩家小人
crate 板条箱
check_point 检查点
entry 入口界面
map 选关界面
Arena
放置TilemapLayer,用于布置关卡。它会监听来自当前场景check_point的信号(当箱子进入检查点范围时会发送一个信号),当所有检查点都有箱子时,发送过关信号。
Crate
箱子会在移动前发出物理射线检测,检测当前位置到目的地之间是否有阻挡物。没有阻挡物则通过使用 tween
来移动位置。
物理层
Layer 1: ground > 铺地板用作背景
Layer 2: env > 放检查点
Layer 3: block > 墙壁
Layer 4: crate > 箱子
Layer 5: player > 玩家小人