Я довольно новичок в идее систем сущностей, прочитав кучу вещей (наиболее полезно, этот отличный блог и этот ответ ).
Хотя у меня возникли небольшие проблемы с пониманием, как что-то столь же простое, как возможность манипулировать положением объекта с помощью неопределенного числа источников.
То есть у меня есть моя сущность, которая имеет компонент позиции. Затем в игре есть какое-то событие, которое сообщает этой сущности, чтобы она прошла определенное расстояние в данное время.
Эти события могут произойти в любое время и будут иметь разные значения для позиции и времени. В результате они будут составлены вместе.
В традиционном ОО-решении у меня был бы какой-то MoveBy
класс, который содержит расстояние / время и массив из них внутри моего класса игровых объектов. В каждом кадре я бы перебрал все MoveBy
и применил его к позиции. Если a MoveBy
достиг времени окончания, удалите его из массива.
С системой сущностей меня немного смущает то, как я должен воспроизводить такое поведение.
Если бы одновременно было только одно из них, вместо того, чтобы соединять их вместе, это было бы довольно просто (я считаю) и выглядело бы примерно так:
PositionComponent
содержащий x, y
MoveByComponent
содержащий x, y, time
Entity
который имеет как PositionComponent
иMoveByComponent
MoveBySystem
который ищет сущность с обоими этими компонентами и добавляет значение MoveByComponent
к PositionComponent
. Когда time
достигается, он удаляет компонент из этой сущности.
Я немного сбит с толку относительно того, как бы я делал то же самое со многими движениями.
Мои первоначальные мысли таковы:
PositionComponent
так MoveByComponent
же, как и выше
MoveByCollectionComponent
который содержит массив MoveByComponent
с
MoveByCollectionSystem
который ищет сущность с a PositionComponent
и a MoveByCollectionComponent
, перебирает MoveByComponent
s внутри него, применяя / удаляя при необходимости.
Я предполагаю, что это более общая проблема: иметь много одинаковых компонентов и хотеть, чтобы соответствующая система воздействовала на каждый. Мои сущности содержат свои компоненты внутри хеша типа компонента -> компонента, поэтому строго имеют только 1 компонент определенного типа для каждой сущности.
Это правильный способ смотреть на это?
Должна ли сущность иметь только один компонент данного типа за все время?
move x by 10 in 2 seconds
и move x by -10 in 2 seconds
сущность будет стоять на месте?
MoveBy
функциональность - это просто скорость? Похоже, вы на правильном пути. Что касается вашего второго вопроса, существует множество различных реализаций систем сущностей / компонентов. Описанный в моем ответе, который вы связали, будет иметь только один компонент данного типа.