Як сконструювати ігровий движок на об'єктно-орієнтованій мові? [зачинено]


26

Кожен раз, коли я намагаюся і написати гру будь-якою об'єктно-орієнтованою мовою, перша проблема, з якою я завжди стикаюся (після роздумів про те, яку гру написати), - це як створити двигун. Навіть якщо я використовую існуючі бібліотеки або рамки, такі як SDL, мені все одно доводиться приймати певні рішення для кожної гри, наприклад, використовувати державну машину для управління меню, який клас використовувати для завантаження ресурсів тощо.

Що таке хороша конструкція і як вона буде реалізована? Які існують компроміси, які слід здійснити, та їх плюси та мінуси?


12
Що поганого в тому, щоб продовжувати імпульс і відтворювати звідти, а не страждати паралічем аналізу?
Качка комуніста

7
@TheCommunistDuck Тому, що продовжувати імпульс - це підхід, який я застосував у всіх своїх попередніх проектах - і кожен з них потрапляє в стіну через кілька місяців, коли я виявляю, що будь-яка нова функція потребує монументальних зусиль і складності, щоб додати. Зараз я витрачаю більше часу на перезапис своїх двигунів, ніж на написання самої гри, тож сподіваюся, що з невеликим задумом і плануванням я заощаджую собі час у довгостроковій перспективі.
екзотропний двигун

3
@chuzzum, хороший момент. Я б рекомендував тоді перевірити архітектуру двигуна C4, тобто; terathon.com/c4engine/images/architecture.png Це може бути набагато вищий рівень, ніж вам потрібно, але може дати вам кілька ідей ;-)
Качка комуніста


3
Також це питання є дещо невиразним. Можливо, візьміть один із ваших прикладів і зробіть це більш глибоким питанням.
Тетрад

Відповіді:


24

Я сумніваюся, хтось зможе сказати: "Ви повинні зробити це і те, і це, і ці слоти з тим, використовуючи шаблон X".

Однак деякі корисні ресурси:
Enginuity - серія статей про створення двигунів на Gamedev.net.
Ігрове кодування завершено - у мене є ця книга, і вона добре переглядає кожен (ну, майже) аспект ігрового програмування. Він також має вбудований двигун у всій книзі.
Архітектура ігрових двигунів - це ще одна чудова книга для дизайну двигунів.
Структура двигуна C4 - Згідно з мого коментаря, але це показує високий рівень підгонки кожної частини двигуна разом.

Це може бути трохи занадто багато для того, що вам потрібно, але ви не можете занадто багато знати про щось, і я впевнений, що ви отримаєте від них хороший план.

EDIT: Я забув, що статті Гамедева архівуються з нового сайту, виправлено :)


Посилання Enginuity було розірвано, і гугляння статей здавалося, що вони показують, що їх більше немає в Інтернеті. (?) Хоча книги виглядають як добрі ресурси, і я завжди
пильную

Також, що стосується вашого першого коментаря, я не сподіваюся, що хтось придумає генеральний план, який підходить для кожної гри. Я щойно помітив, під час розробки декількох ігор, що звичайних моделей, як правило, з'являється багато, тому я задумався, що інші люди використовують у своїх іграх.
екстропік-двигун

1
Виправлено посилання.
Качка комуніста

+1 для енергійності. @chuzzum Просто вивчіть кілька ігрових двигунів, нехай вони надихають вас і отримують для себе оптимальну архітектуру. Плюс: часто краще зробити свій компонент ігрового двигуна на основі ієрархічного, дивіться cowboyprogramming.com/2007/01/05/evolve-your-heirachy
Дейв О.

1
Я б не сказав, що це двигун, який потрібно об'єднати, більше частину рамки сутності.
Качка комуніста

7

Як приклад, ось як структурований мій поточний негідний проект (на Java). Він використовує 2D графічний двигун, тому багато коду візуалізації вже подбали про мене. Критика вітається.

class Game
Цей клас встановлює державну машину, яка керує поточним станом гри. (у меню проти початку нової гри проти гри в збережену гру)

interface State
Кожен клас State містить дві петлі: цикл для оновлення логіки та цикл для візуалізації. Вони також містять код для виклику Gameкласу та запиту на зміну в інший стан.

class ResourceManager
Синглтон, який ініціалізується Gameкласом, який завантажує всі необхідні ресурси та дозволяє отримати доступ до них. Мені не подобається ця конструкція, тому що важко завантажувати / вивантажувати ресурси, наприклад, на різних рівнях. Я б, мабуть, спроектував це по-іншому, якби я починав із початку.

class Map
Карта містить масив плиток та список усіх істот та предметів на карті. Це досить базовий клас.

class Creature
Істоти містять інформацію про себе, включаючи обчислення руху (вимагаючи, щоб вони знали, на якій карті вони перебувають, і мати можливість запитувати її, щоб дізнатися про перешкоди). Вирішувати, чи потрібно це робити, чи мати якийсь клас керівника, щоб подбати про це для всіх істот - це те, з чим я борюся.

interface AITask
Істоти можуть мати список AITasks, які виконуються щоразу, коли запускається логічний цикл істоти. У AITask є свій логічний цикл, який видає команди створенню, і умова припинення, яка визначає, чи було завдання виконано успішно чи ні.

interface UIElement
Я реалізував власний інтерфейс для цього двигуна. Кожен UIElement має цикл візуалізації та логічний цикл. Вони також мають цикл для обробки вводу клавіатури / миші. Усі елементи можуть мати ряд дочірніх елементів, які надаються після їх батьків, і приймають клавіатуру / мишу. Це дозволяє, наприклад, мати меню з підменю.


Що саме з цим відбувається не так? Мені це здається прекрасно.
Качка комуніста

@TheCommunistDuck Насправді це не трапляється у вибраних нами прикладах, але у мене з цим кодом багато проблем. Клас ResourceManager є одним з них, але у мене теж є проблеми зі станами - я закінчую величезним розповсюдженням їх і копіюю багато коду. Особливо в RPG, де у гравця є можливість вибору в будь-який час, ви можете закінчити дійсно складні графіки стану. Приклад: кидання заклинання. Переходить від NormalState -> SelectSpellState -> SelectTargetState -> InvalidTargetState (якщо не вдалося) -> DoSpellAnimationState -> NormalState. І це лише одна дія.
екзотропний двигун

1
Ні ні. НІ . НОПА. Будь ласка, ні. О, зачекайте, ви сказали, що вам це не подобається.
Bartek Banachewicz

6

Першим важливим моментом є те, що на це питання немає жодної «хорошої» відповіді.

Найближчим до правильної відповіді буде щось на кшталт: Це дуже залежить від типу гри, цільової платформи, обмежень (часу) тощо.

Це сказало, що є кілька справді хороших статей, які покажуть вам, як інші люди намагалися відповісти на цю проблему (як я раніше намагався знайти інформацію про це).
Як згадувала комуністична качка, стаття про несанкціоновану розробку гри допомогла мені зрозуміти деякі частини архітектури гри.

Мій сучасний дизайн - це гібрид Quake3 / Doom3 і трохи бібліотека класів .NET :)

У мене є дві бібліотеки (статична або динамічна залежить від того, як ви хочете побудувати / доставити) Frameworkі Library.

Бібліотека містить усі допоміжні класи, які допомагають у виробництві ігрового програмного забезпечення, але не обмежуються цим продуктом. тобто він має реалізацію пов'язаного списку, який оптимізований для коду гри, але може використовуватися будь-яким, що потребує обслуговування пов'язаного списку.

Framework - це кишки 'двигуна', якщо ви хочете його так назвати. Багато з цього випливає з філософій дизайну Quake3 (просто більш об'єктно орієнтованим способом). Він містить CLI , управління тимчасовим часом, специфічний код ОС, а з часом мережеві шари тощо.

Потім ці два пов'язані з фактичним додатком, який виробляється. Game, Якщо ви хочете, який містить код ігр конкретного. Таким же чином Quake3 завантажує DLL, залежно від того, який "мод" відтворюється.

Щоб дати вам уявлення про структуру, тут можна швидко розбити папки та вміст для кожної бібліотеки:


  • Рамка
    • IO (Спеціалізовані класи управління файлами, класи друку тексту (наприклад, до CLI) та ведення журналів тощо)
    • Мережа
      • Клієнт (класи, які представляють те, що Рамка вважає "людиною, яка грає / пов'язана з грою")
      • Сервер (класи для управління підключенням до фреймворку та керування програвачем)
    • Платформа (Класифікація клавіатури / миші / контролери, що займаються класами, специфічні для ОС процедури, як getTime ())
    • Система (класи дуже низького рівня, як клас помилок, що сприяє друку повідомлень про помилки, класи часу та самі CLI.)
    • Здійснювач (пояснення)
    • тощо.

  • Бібліотека
    • Колекції (класи, що представляють колекції даних, пов'язані списки / хештелі тощо)
    • Математика (основні уроки з математики, такі як Вектори та матриці)
    • тощо.

HTH! Потрібно дати вам кілька покажчиків ...


Альтернативна посилання на серію
Enginuity

-3

Речі, які слід врахувати

  • Об'єктно-орієнтовані мови мають проблеми, оскільки вони зазвичай не мають функцій першого класу або не всі дані є об'єктними (як цілі чи плаваючі в Java). Шаблони дизайну вирішують ці проблеми за допомогою декількох моделей. Як правило, швидше кодувати і легше користуватися мовою, яка може їх робити (об'єкти першого класу); наприклад, Python (який також дозволяє об'єктно-орієнтований дизайн), у вас буде менша швидкість швидкості.
  • Обчислення подій, принаймні, на AI
  • Логіка Hoare, використовуйте передумови та постумови, щоб принаймні протестувати свій код
  • Агенти, подивіться на сутність Quake
  • Реляційні бази даних, потужний спосіб зберігання даних

Хороший дизайн

  • скласти діаграму ER
  • зробити це правильним
  • створити з нього базу даних, об'єкти або структури даних

Дані є ключовими для програмування. Якщо ви вважаєте, що ваші дані хороші, алгоритм, як правило, виходить з них (якщо ви не рахуєте деяких числових алгоритмів, як, наприклад, обчислювальний визначник).


-1 оскільки ця відповідь дуже розпливчаста і заплутана. Реляційні бази даних абсолютно не мають нічого спільного з OO-двигуном. Я можу зрозуміти, що англійська мова не є вашою першою мовою, але ви могли б пояснити, що ви маєте на увазі у своєму першому абзаці? Це здається суперечливим (у мов OO є проблеми, але простіше програмувати на мовах із шаблонами дизайну. Навіть хоча структури дизайну майже завжди є структурами ОО).
Качка комуністична

@duck суперечливий? У ОО є проблеми, яких немає на інших мовах, DP вирішує їх, див. C2.com/cgi/wiki?DesignPatternsInDynamicProgramming .
користувач712092

@Duck 1) Ви можете використовувати SQL в C ++ 2) Ви можете зробити атрибути об'єктів з ER (хоча це не рекомендується практикувати) 3) Ви можете передавати структури structeres з відносин (це список, тому що мені потрібно змінити порядок елементів за бажанням це хеш, тому що мені потрібен швидкий пошук)
user712092

@Duck Вибачте, помилився, перезаписавшись. Я не хотів стверджувати, що "DP легше для XY", але "мови, які можуть зробити перший клас, це ...". :)
користувач712092

Так, функціональні мови можуть мати переваги. Однак, навіть неупереджено, я вважаю, що підхід ОО має логічний сенс з точки зору гамедева. Крім того, немає причин, де вам потрібна реляційна база даних де завгодно. Звичайно, вони можуть бути корисними. Однак він не стає необхідним компонентом ніде.
Качка комуністична
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.