Skip to content

推箱子

游戏英文名:Sokoban

素材:Sokoban · Kenney

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 > 玩家小人