Більше задоволення від ES ...
В даний час у мене є кілька систем:
- Renderer (атрибут Renderable, атрибут Transform)
- Рух (рухомий атрибут, атрибут перетворення, атрибут переносу [для обмежувальних полів тощо])
- Вхід (атрибут InputReceiver)
- тощо.
Я додаю виявлення зіткнення. Першою моєю думкою було додати нову систему, яка виконує зіткнення. Для мене є сенс тримати це ізольовано від Motion
системи, оскільки не всі речі, які рухаються або анімуються, обов'язково беруть участь у виявленні зіткнень - камери, туман тощо, - але, здається, це Collision
і Motion
взаємозалежно.
Коли Motion
рухається сутність, трансформацію потрібно підтвердити Collision
, а рух або скасувати, або відрегулювати (підстрибуючи, зупиняючись біля стіни тощо).
Альтернативою було б створити атрибут Collivable, який підтримує посилання на об'єкт зіткнення - kd-дерево, octree тощо, який поділяється між сутностями, які можуть стикатися між собою. Потім Motion
система перевірятиме цей атрибут та використовує його для перевірки чи регулювання руху.
З точки зору коду, це прийнятне рішення. Однак, з точки зору архітектури ECS, здається, що це підштовхує логіку до Motion
системи, яка не стосується всіх сутностей, які мають Movable
атрибут.
Я також міг би зберігати вектор руху в Movable
атрибуті і мати Collider
систему Transform
за необхідності коригувати , але це буде включати дублювання функціональності між Motion
та Collider
, або зворотний виклик з Collider
на Motion
деякі дані про місце зіткнення та дані про поверхню для відмов / відображення тощо .
Це може підпадати під заголовок "Спеціальний випадок", але я хотів би отримати деякий внесок з тих, хто цим займався раніше, не створюючи тонни красного коду справи.
Питання Який хороший спосіб уникнути тісного зчеплення між системами руху та зіткнення, коли здається, що вони вимагають знань один одного?