У меня возникли проблемы с выяснением того, как поступать с государственным управлением в моих организациях.
У меня нет проблем с управлением игровым состоянием, таким как пауза и меню, поскольку они не обрабатываются как система компонентов объекта; просто с состоянием в сущностях / компонентах.
Рисуя от Orcs Must Die в качестве примера, у меня есть сущности MainCharacter и Trap, в которых есть только такие компоненты, как PositionComponent, RenderComponent, PhysicsComponent.
При каждом обновлении Сущность будет вызывать обновление своих компонентов. У меня также есть универсальный EventManager со слушателями для разных типов событий.
Теперь мне нужно уметь расставлять ловушки: сначала выберите ловушку и положение ловушки, затем разместите ловушку.
При размещении ловушки она должна появляться перед MainCharacter, отображаться по-другому и следовать за ней. Когда помещено это должно только ответить на столкновения и быть предоставленным нормальным способом.
Как это обычно обрабатывается в компонентных системах?
(Этот пример специфичен, но может помочь выяснить общий способ работы с состояниями сущностей.)
источник
Ответы:
Одним интересным применением системы компонентов является то, что вы можете изменять компоненты сущности во время выполнения, если вы спроектировали так, чтобы они могли обрабатывать такие компоненты . Таким образом, состояние объекта становится суммой как того, какие компоненты ему присвоены, так и того, какие значения они содержат.
Для вашего примера, вы можете сначала создать ловушку с
BuildControllerComponent
(управление реакцией на элементы управления игрока в фазе сборки), aPositionComponent
и aRenderComponent
. Последнее имеет одно поле данных, которое управляет используемыми пиксельными шейдерами, и одно из них дает «призрачному» виду «ловушку для постройки». Вы заметите, что нет физика компонентов присвоенных еще.После размещения ловушки компоненты заменяются. Он
BuildControllerComponent
больше не нужен, поэтому его удаляют. ВRenderComponent
шейдеры добудет заменена на нормальном стандартном виде ловушки. Наконец,PhysicsComponent
все, что нужно для работы ловушки, добавляется к сущности.В подходе, основанном на наследовании, это эквивалентно наличию конструктора для
ActiveTrapEntity
класса, который принимаетBuildTimeTrapEntity
класс в качестве аргументов, причем второй используется для рендеринга ловушки во время его построения, а первый - для ловушки после ее установки. ,источник
BuildControllerComponent
?" или "Какова позиция этой сущности, как записано в нейPositionComponent
, если она есть?" - те, которые вы делаете, проверяя список компонентов для тех, кто вас интересует, и опционально запрашивая (некоторые) их значения.BuildControllerComponent
s. Он уже должен обрабатывать изменения точки зрения персонажа (или камеры) игрока и события нажатия клавиш и мыши.Мне не нравится идея, что сущности вызывают обновления своих компонентов (системы должны выполнять эту работу), и это может привести к проблемам, когда компоненты не будут знать друг о друге.
Вы можете добавить дополнительный компонент под названием «Состояние». К нему будут обращаться ваши системы рендеринга и столкновения. Компонент состояния - это просто флаг, для которого доступно несколько состояний. Для ситуации, которую вы описываете состояния были бы
Play
иBuild
. Когда система рендеринга увидит, что это состояние,Build
она нарисует объект полупрозрачным. Когда система столкновения видитBuild
состояние, она не будет обрабатывать столкновения с игроком.Но на самом деле, если у вас нет систем и вы полагаетесь на компоненты для выполнения всей работы, вы столкнетесь с множеством проблем. Компоненты не должны знать друг о друге и не должны выполнять обработку.
источник
StateComponent
которая может быть использована несколькими системами.