В настоящее время я сталкиваюсь со следующей проблемой:
Я пытаюсь написать клон понг с помощью системы компонентов сущности (ECS). Я написал "рамки" все сам. Таким образом, существует класс, который управляет объектами со всеми компонентами. Тогда есть сами классы компонентов. И, наконец, есть мои системы, которые просто получают все объекты, которые имеют компоненты, в которых нуждается система.
Так, например, моя система перемещения ищет все объекты, которые имеют компонент положения и компонент движения. Компонент позиции просто удерживает позицию, а компонент движения - скорость.
Но настоящая проблема - моя система столкновений. Этот класс похож на логический шарик. У меня так много особых случаев в этом классе.
Например: мои весла могут сталкиваться с границами. Если это происходит, их скорость устанавливается на ноль. Мой мяч также может столкнуться с границами. Но в этом случае его скорость просто отражается от нормали границы, поэтому она отражается. Для этого я дал мячу дополнительный физический компонент, который просто говорит: «Эй, эта вещь не останавливается, она отражает». Так что на самом деле физический компонент не имеет реальных данных. Это пустой класс, который просто сообщает системе, отражается ли объект или останавливается.
Затем приходит следующее: я хочу визуализировать некоторые частицы, когда шар сталкивается с веслами или границами. Поэтому я думаю, что шар должен получить еще один компонент, который говорит системе столкновений создавать частицы при столкновении.
Тогда я хочу иметь бонусы, которые могут сталкиваться с веслами, но не с границами. Если это произойдет, бонусы должны исчезнуть. Поэтому мне понадобится гораздо больше кейсов и компонентов (чтобы сообщить системе, что некоторые объекты могут сталкиваться только с определенными, а не со всеми, даже если некоторые действительно могут сталкиваться, более того, система столкновений должна была применять бонусы к весла и тд и тд и тп).
Я вижу, что система компонентов сущности - это хорошо, потому что она гибкая и у вас нет проблем с наследованием. Но я полностью застрял в настоящее время.
Я думаю, что слишком сложно? Как мне справиться с этой проблемой?
Конечно, я должен создать системы, которые на самом деле отвечают за «постколлизию», поэтому система коллизий говорит только «Да, у нас коллизия в последнем кадре», а затем есть куча «постколлизионных» систем, которые все требуют разных (комбинаций) компонентов и затем меняют компоненты. Например, была бы система постколлизионного движения, которая останавливает вещи, которые должны остановиться, когда происходит столкновение. Затем физическая постколлизионная система, которая отражает вещи и т. Д.
Но мне это тоже не кажется правильным решением, потому что, например:
- Моей системе постколлизионного перемещения потребуются объекты, имеющие компонент положения, компонент движения и компонент столкновения. Тогда он установит скорость объекта на ноль.
- Физической системе после столкновения потребуются объекты, которые имеют компонент положения, компонент движения, компонент столкновения и компонент физики. Тогда это будет отражать вектор скорости.
Проблема очевидна: движению после столкновения нужны объекты, которые являются подмножеством объектов в физике системы после столкновения. Таким образом, две системы после столкновения будут работать с одними и теми же данными, в результате чего: хотя у объекта есть физический компонент, его скорость будет равна нулю после столкновения.
Как эти проблемы решаются в целом в системе компонентов объекта? Эти проблемы вообще обычные или я что-то делаю не так? Если да, что и как должно быть сделано вместо этого?