实体构建系统

在本章节中我们将更详细的介绍下推箱子游戏并探讨下该怎么构建我们的游戏

推箱子游戏

如果你还没玩过推箱子游戏,可以先看下这张推箱子游戏的动态图片:

Sokoban play

游戏中有墙有箱子,玩家的目标是把箱子推到它们的位置上。

ECS

ECS (实体构建系统)是一种遵循组合优于继承的构建游戏的模式. 像多少Rust游戏一样,我们编写的推箱子游戏也会大量使用ECS,所以我们有必要先花点时间熟悉下ECS

  • 组件(Components) - 组件只包含数据不包含行为,比如:位置组件、可渲染组件和运动组件。
  • 实体(Entities) - 实体是由多个组件组成的,比如玩家,可能是由位置组件、可渲染组件、动作组件组合而成的,而地板可能只需要位置组件和可渲染组件,因为它不会动。也可以说实体几乎就是包含一个或多个具有唯一标示信息的组件的容器。
  • 系统(Systems) - 系统使用实体和组件并包含基于数据的行为和逻辑。比如渲染系统:它可以一个一个的处理并绘制可渲染实体。就像我们上面提到的组件本身不包含行为,而是通过系统根据数据创建行为。

如果现在觉得还不是很理解ECS,也没有关系,我们下面章节还会介绍一些结合推箱子游戏的实例。

推箱子游戏结构

根据我们对推箱子游戏的了解,要编写一个这样的游戏,起码要有:墙、玩家、地板、箱子还有方块斑点这些实体。

接下来我们需要确认下怎么创建实体,也就是需要什么样的组件。首先,我们需要跟踪地图上所有的东西,所以我们需要一些位置组件。其次,某些实体可以移动,比如:玩家和箱子。所以我们需要一些动作组件。最后,我们还需要绘制实体,所以还需要一些渲染组件。

按照这个思路我们先出一版:

  1. 玩家实体: 有位置组件可渲染组件运动组件组成
  2. 墙实体: 有位置组件可渲染组件组成
  3. 地板实体: 有位置组件可渲染组件组成
  4. 箱子实体: 有位置组件可渲染组件运动组件组成
  5. 方框斑点组件: 有位置组件运动组件组成

第一次接触ECS是有点难于理解,如果不理解这些也没关系,可接着往下面看。

Specs

最后我们需要一个提供ECScrate,虽然这样的库有一大把,但在本教程中我们使用 specs ,需要在Cargo.toml文件中配置specs依赖:

[dependencies]
ggez = "0.7"
specs = { version = "0.17.0", features = ["specs-derive"] }

加油!接下来我们就开始编写组件和实体了!是不是很期待?

CODELINK: 可以点 这里获取本章节完整代码.