В даний час я стикаюся з такою проблемою:
Я намагаюся написати клон понг, використовуючи систему компонент сутності (ECS). Я написав "рамки" все сам. Отже, існує клас, який управляє сутностями з усіма компонентами. Потім є самі компоненти компонентів. І останнє, є мої системи, які просто отримують всі сутності, які мають компоненти, необхідні цій системі.
Так, наприклад, моя система руху шукає всіх сутностей, які мають компонент позиції та компонент руху. Позиційний компонент просто утримує положення, а компонент руху утримує швидкість.
Але актуальною проблемою є моя система зіткнення. Цей клас схожий на логічну крапку. У мене так багато особливих випадків у цьому класі.
Наприклад: Мої весла можуть стикатися з бордюрами. Якщо це станеться, їх швидкість встановлюється на нуль. Мій м'яч може також стикатися з бордюрами. Але в цьому випадку його швидкість просто відображається на нормальній межі, і це відображається. Для цього я дав м'ячу додатковий компонент фізики, який просто говорить: "Гей, ця річ не припиняється, вона відображає". Тож фактично компонент фізики не має реальних даних. Це порожній клас, який просто існує, щоб повідомити системі, якщо об’єкт відображає або зупиняється.
Потім настає таке: я хочу зробити частинки, коли куля стикається з веслами або бордюрами. Тож я думаю, що м'яч повинен отримати інший компонент, який повідомляє системі зіткнення створити частинку при зіткненні.
Тоді я хочу мати джерела живлення, які можуть стикатися з веслами, але не з межами. Якщо це станеться, джерела живлення повинні зникнути. Тому мені знадобиться набагато більше випадків і компонентів (щоб сказати системі, що деякі сутності можуть стикатися лише з певними іншими, бот не з усіма, навіть якщо деякі інші насправді здатні зіткнутися, крім того, система зіткнення повинна була застосувати електроживлення до весла і т. д. і т. д. і т. д.).
Я бачу, що система компонентної сутності є хорошою справою, тому що вона гнучка і у вас немає проблем із успадкуванням. Але я зараз повністю застряг.
Я думаю, що занадто складно? Як мені впоратися з цією проблемою?
Звичайно, я повинен створити системи, які насправді відповідають за "після зіткнення", тому система зіткнення говорить лише "Так, у нас зіткнення в останньому кадрі", а потім є купа систем "після зіткнення", які всі вимагають різних (комбінацій) компонентів, а потім змінюють компоненти. Наприклад, існувала б система після зіткнення руху, яка зупиняє речі, які повинні зупинятися, коли відбувається зіткнення. Потім система фізики після зіткнення, яка відображає речі тощо.
Але це також не здається правильним рішенням для мене, бо, наприклад:
- Моїй системі після зіткнення руху потрібні сутності, які мають компонент позиції, компонент руху та компонент зіткнення. Тоді вона встановила б швидкість сутності на нуль.
- Системі фізики після зіткнення потрібні сутності, які мають позиційну складову, компонент руху, компонент зіткнення та компонент фізики. Тоді він би відображав вектор швидкості.
Проблема очевидна: рух після зіткнення потребує сутностей, які є підмножиною сутностей фізичної системи після зіткнення. Отже, дві системи після зіткнення працювали б на одних і тих же даних, ефект був: Хоча суб'єкт має фізичну складову, швидкість після зіткнення буде дорівнює нулю.
Як ці проблеми вирішуються в цілому в системі компонент сутності? Ці проблеми навіть звичайні, чи я роблю щось не так? Якщо так, що і як робити це замість цього?