Я довольно новичок в идее систем сущностей, прочитав кучу вещей (наиболее полезно, этот отличный блог и этот ответ ).
Хотя у меня возникли небольшие проблемы с пониманием, как что-то столь же простое, как возможность манипулировать положением объекта с помощью неопределенного числа источников.
То есть у меня есть моя сущность, которая имеет компонент позиции. Затем в игре есть какое-то событие, которое сообщает этой сущности, чтобы она прошла определенное расстояние в данное время.
Эти события могут произойти в любое время и будут иметь разные значения для позиции и времени. В результате они будут составлены вместе.
В традиционном ОО-решении у меня был бы какой-то 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, перебирает MoveByComponents внутри него, применяя / удаляя при необходимости.
Я предполагаю, что это более общая проблема: иметь много одинаковых компонентов и хотеть, чтобы соответствующая система воздействовала на каждый. Мои сущности содержат свои компоненты внутри хеша типа компонента -> компонента, поэтому строго имеют только 1 компонент определенного типа для каждой сущности.
Это правильный способ смотреть на это?
Должна ли сущность иметь только один компонент данного типа за все время?
move x by 10 in 2 secondsи move x by -10 in 2 secondsсущность будет стоять на месте?
MoveByфункциональность - это просто скорость? Похоже, вы на правильном пути. Что касается вашего второго вопроса, существует множество различных реализаций систем сущностей / компонентов. Описанный в моем ответе, который вы связали, будет иметь только один компонент данного типа.