Створюючи ігри, ви часто створюєте такий ігровий об’єкт, від якого успадковуються всі сутності:
public class GameObject{
abstract void Update(...);
abstract void Draw(...);
}
Отже, в циклі оновлення ви повторюєте всі об’єкти гри і надаєте їм можливість змінити стан, а потім у наступному циклі малювання ви повторно повторюєте всі об’єкти гри та надаєте їм можливість намалювати себе.
Хоча це досить добре працює в простій грі з простим рендерінгом, це часто призводить до декількох гігантських ігрових об'єктів, яким потрібно зберігати свої моделі, декілька текстур і найгірший спосіб жирного малювання, що створює щільну зв'язок між ігровим об’єктом, поточна стратегія візуалізації та будь-які класи, пов’язані з візуалізацією.
Якби я змінив стратегію візуалізації з прямої на відкладену, мені доведеться оновити багато ігрових об'єктів. І ігрові об’єкти, які я роблю, не такі багаторазові, як могли бути. Звичайно, успадкування та / або склад можуть допомогти мені боротися з дублюванням коду та полегшити зміну реалізації, але це все ще не вистачає.
Кращим способом, можливо, було б взагалі видалити метод Draw з класу GameObject і створити клас Renderer. GameObject все ще повинен містити деякі дані про його візуальні зображення, як, наприклад, з якою моделлю представляти його та які текстури слід намалювати на моделі, але про те, як це зробити, залишається рендерінгу. Однак часто буває багато прикордонних випадків при візуалізації, хоча, хоча це призведе до усунення жорсткого з’єднання з GameObject до Renderer, Renderer все одно повинен був би знати всі ігрові об'єкти, які зробили б його жирним, все знаючи і щільно з'єднані. Це порушило б чимало належних практик. Можливо, орієнтований на дані дизайн може зробити свою справу. Ігрові об'єкти, безумовно, були б даними, але як би рендері цим керували? Я не впевнений.
Тож я в збитку і не можу придумати хорошого рішення. Я намагався використовувати принципи MVC, і в минулому я мав кілька ідей про те, як це використовувати в іграх, але останнім часом це не виглядає так застосовно, як я думав. Я хотів би знати, як ви всі вирішуєте цю проблему.
У будь-якому випадку давайте резюмуємо, мене цікавить, як можна досягти наступних цілей дизайну.
- У об’єкті гри немає логіки візуалізації
- Вільне з'єднання між ігровими об'єктами та візуалізацією
- Не всі знаючі рендері
- Переважно перемикання між двигунами візуалізації
Ідеальною установкою проекту була б окрема «логіка гри» та відображає логічний проект, який не потребує посилання один на одного.
Цей мислительний похід почався, коли я почув, як Джон Кармак говорив на Twitter, що у нього є така система, що він може змінювати двигуни візуалізації під час роботи і навіть може сказати своїй системі використовувати як рендери (програмний рендер, так і апаратний прискорений рендер) в той же час, щоб він міг перевірити відмінності. Системи, які я запрограмував поки що, навіть не такі гнучкі