Для свого теперішнього проекту я впровадив систему , що базується на компонентах / сутностях , в основному дотримуючись більшості найкращих практик, що існують у цій досить невизначеній області .
Отже, я отримав (трохи розширені) сутності , які в основному є int
ідентифікатором, людиною, що читається ім'ям, std::map
компонентів та long
"індикатором типу", який використовується для показу, які компоненти є (у мене є потужність дві enum
для всіх компонентів типів і кожного разу, коли компонент додається до Entity, я автоматично змінюю це протягом бітових операцій, порівнюю цю відповідь ).
Потім є компоненти , також досить прості: int
ID, enum
як тип компонента, вказівник батьківської сутності та std::map
всі властивості цього компонента.
Нарешті, деякі системи / менеджери, які обробляють фактичну логічну обробку. Вони спочатку перевіряють, чи має в даний час оброблений об'єкт відповідний long
"індикатор типу" = всі необхідні компоненти для цієї системи є. Потім він отримує доступ до деяких властивостей, якщо це необхідно, або безпосередньо викликає деякі функції у відповідному компоненті або надсилає деякі повідомлення (через диспетчер повідомлень).
Підсумок: До цих пір досить стандартна система, заснована на подіях / система, заснована на об'єктах, поєднана з підходом до даних (порівняйте, компоненти не мають жорстко кодованих змінних даних, а натомість загальну карту, як (деякі) компоненти / архетипи компонентів згодом будуть прочитані з файлів з можливістю додавання додаткових даних, що не є частиною фактичного коду компонента.
Тепер я хотів би також ввести дерева поведінки (на базі AiGameDev BTSK ) у цей проект, але я не впевнений, чи потрібно їх пов’язати з уже існуючими компонентами або як інтегрувати ці проекти в цілому.
На думку приходить декілька пов'язаних ідей / точок / питань:
Мої BT будуть прочитані з файлів (знову). В даний час мені важко бачити, як я б найкраще встановити зв’язок між
BT Action
тим деревом і фактичним кодуванням у своїй програмі. Чи слід створити якусь карту між іменами дій, що використовуються у файлах BT, та функціональним вказівником на фактичну логічну реалізацію? Який звичайний підхід для вирішення цього питання?Я припускаю, що мені доведеться створити БТ для всіх моїх різних
Entity
типів (тому для кожної ігрової логіки / AI-відповідного поєднання компонентів, як зазначено в моїх багаторазових згадуваних довгих "індикаторах типу"). Як результат, не має сенсу розміщуватиBT Action
реалізацію в компонентах, оскільки, швидше за все, за кожну дію буде задіяно багато компонентів, чи не так?Тож чи повинна
BT Action
логіка сидіти в / декількох окремих системах (на методи яких вказує карта від ідеї №1)? Потім система перевірить за моїмlong
"індикатором типу", чиEntity
дійсно дозволено виконувати певну дію (= метод у системі), для якої вказано BT (чи є необхідні компоненти). Але тоді, як ні (тому що, наприклад, BT-творець ігнорував конкретну ситуацію, коли необхідний компонент більше не може бути приєднаний до Entity під час виконання), нічого не відбудеться.
Запитання:
- Чи є перевірені концепції для такої інтеграції?
- Як ви оцінюєте мої 3 пункти вище?
- Будь-які інші речі, які виникають на увазі, також стосовно мого компонента / базованого дизайну взагалі?