У мене виникло питання щодо ігрової архітектури: який найкращий спосіб спілкуватися між собою різними компонентами?
Я дійсно вибачаюсь, якщо це питання вже задавали мільйон разів, але я не можу знайти нічого з саме тієї інформації, яку шукаю.
Я намагався створити гру з нуля (C ++, якщо це має значення), і натхненно спостерігав ігрове програмне забезпечення з відкритим кодом (Super Maryo Chronicles, OpenTTD та інші). Я зауважую, що багато з цих ігор-дизайнів використовують глобальні екземпляри та / або одиночні кнопки повсюдно (для таких речей, як черги візуалізації, менеджери організацій, відео-менеджери тощо). Я намагаюся уникати глобальних екземплярів та синглів та будувати двигун, який є максимально вільним, але я стикаюся з деякими перешкодами, які завдячують моєму недосвідченню в ефективному дизайні. (Частина мотивації цього проекту полягає у вирішенні цього питання :))
Я створив дизайн, де у мене є один головний GameCore
об'єкт, у якого є члени, аналогічні глобальним екземплярам, які я бачу в інших проектах (тобто, він має менеджер вводу даних, відеоменеджер, GameStage
об'єкт, який контролює всі об'єкти та гру для будь-якого етапу зараз завантажується тощо). Проблема полягає в тому, що оскільки все є централізованим в GameCore
об'єкті, у мене немає простого способу спілкування різних компонентів між собою.
Наприклад, дивлячись на Super Maryo Chronicles, наприклад, коли компонент гри потребує зв'язку з іншим компонентом (тобто ворожий об’єкт хоче додати себе до черги візуалізації, яку потрібно намалювати на етапі візуалізації), він просто спілкується з глобальний екземпляр.
Для мене я повинен змусити мої ігрові об'єкти передавати відповідну інформацію назад GameCore
об'єкту, щоб GameCore
об'єкт міг передавати цю інформацію іншому компоненту системи, який її потребує (тобто для вищезазначеної ситуації кожен ворожий об'єкт передасть їх інформацію про візуалізацію назад до GameStage
об'єкта, який би зібрав це все і передав би назад GameCore
, що в свою чергу передасть його в відео-менеджер для надання). Це здається справді жахливим дизайном, як це є, і я намагався придумати це рішення. Мої думки щодо можливих конструкцій:
- Глобальні екземпляри (дизайн Super Maryo Chronicles, OpenTTD тощо)
- Наявність
GameCore
об'єкта виступає посередником, за допомогою якого всі об'єкти спілкуються (поточний дизайн, описаний вище) - Дайте покажчики компонентів всім іншим компонентам, з якими потрібно буде поговорити (тобто, у прикладі Маріо вище, ворожий клас мав би вказівник на відеооб'єкт, з яким він повинен поговорити)
- Розбийте гру на підсистеми - Наприклад, в
GameCore
об’єкті є об’єкти менеджера, які керують зв’язком між об'єктами в їх підсистемі - (Інші варіанти? ....)
Я уявляю, що варіант 4 вище є найкращим рішенням, але у мене виникають певні проблеми при його розробці ... можливо, тому, що я думав з точки зору дизайну, який я бачив, в якому використовуються глобалі. Складається враження, що я приймаю ту саму проблему, яка існує в моєму теперішньому дизайні, і тиражую її в кожній підсистемі, тільки в меншому масштабі. Наприклад, GameStage
описаний вище об'єкт певною мірою намагається це зробити, але GameCore
об'єкт все ще бере участь у процесі.
Хтось може запропонувати тут будь-які поради щодо дизайну?
Спасибі!