Entity Component System

В этой главе мы более детально обсудим Sokoban и то, как мы спроектируем нашу игру.

Sokoban

Если вы раньше не встречались с Sokoban на GameBoy, то ниже вы можете увидеть, как выглядит игра. У нас есть стены и коробки, а цель игры состоит в том, чтобы игрок передвинул все коробки на правильные места.

Sokoban play

ECS

ECS (Entity Component System) — это архитектурный шаблон создания игр, который следует принципу композиции, а не наследования. Мы будем активно использовать ECS в этом проекте — как и в большинстве игр на Rust — так что давайте потратим немного времени на ознакомление с его ключевыми концепциями:

  • Components (компоненты) — структуры, содержащие только данные. Это могут быть разные характеристики сущностей: позиция, отображаемость, передвигаемость и так далее. Главное — это чистые данные, без поведения.
  • Entities (сущности) — могут содержать множество компонентов. Например, игрок может характеризоваться позицией, отображаемостью и передвигаемостью, в то время как пол уровня — только позицией и отображаемостью, так как он неподвижен. Сущности — это просто контейнеры с одним или несколькими компонентами и уникальным идентификатором.
  • Systems (системы) — содержат поведение и логику, использующие сущности и компоненты. Например, у вас может быть система рендеринга, которая проходит по всем сущностям, имеющим компонент отображения, чтобы их нарисовать. Ключевым здесь является то, что компоненты сами по себе не имеют никакого поведения — они используют системы для интерпретации и обработки данных.

Если это для вас всё ещё звучит как бессмыслица — не волнуйтесь. В следующей главе мы обсудим несколько практических примеров, применимых к нашей игре.

Архитектура Sokoban

Основываясь на описанном выше, мы теперь знаем, как должна работать наша игра. Нам нужны несколько типов "вещей": стены, игрок, полы, коробки и места для них. Это будут наши сущности.

Теперь мы должны определить, из чего будут сделаны наши сущности — какие компоненты нам нужны. Итак, прежде всего нам нужно знать, где что находится на карте — для этого нам нужен какой-нибудь позиционный компонент. Далее, некоторые (но не все) сущности могут перемещаться. Игрок может двигаться — как и коробки, если он их толкает. И, наконец, нам нужен способ отрисовки каждой сущности — так что нам нужен компонент отображения.

Вот как выглядит наша идея о сущностях и компонентах:

  1. Игрок: позиционируемый, отображаемый, передвигаемый
  2. Стена: позиционируемая, отображаемая
  3. Пол уровня: позиционируемый, отображаемый
  4. Коробка: позиционируемая, отображаемая, передвигаемая
  5. Место коробки: позиционируемое, отображаемое

На первый взгляд мыслить в ECS парадигме может быть сложно, но не огорчайтесь, если вы ничего не поняли или привыкли пользоваться чем-то другим.

Specs

Наконец, добавим пакет ECS. Их достаточно много, но в этой книге мы будем использовать specs.

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

Скоро мы начнём создавать сущности и компоненты!

КОД: Увидеть весь код из данной главы можно здесь.