Написання ігрового двигуна з нуля за допомогою OpenGL [закрито]


15

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

Мої мови та інструменти програмування:

  • C / C ++ чи добре використовувати тільки C?
  • Пітон
  • OpenGL
  • Git
  • ГДБ

Що я хочу навчитися з цього:

  • Основний ігровий движок
  • Візуалізація / Графіка
  • Гра / правила
  • Введення (клавіатура / миша / контролери тощо)

У візуалізації / графіці:

  • 3D
  • Затінення
  • Освітлення
  • Текстурування

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

8
Двоє: Існує загальна мудрість, що інші люди виб'ють, що вам не слід орієнтуватися на створення двигуна без гри. Двигун без гри означає, що ви не можете довести, що ваш двигун корисний . Хороші двигуни вимагають, щоб люди їли власну собачу їжу, як це було. Загальнопоширений зв'язковою в блог вдаючись в більш цьому аргументі тут: scientificninja.com/blog/write-games-not-engines
тетради

2
^ Мало того, але написання двигуна без гри для мотивації вимог до функцій призводить до повзучості та поганого дизайну API. Поки ви не дізнаєтесь, що вам потрібно, натякнувши на вимоги до гри, ви можете не вкладати корисні речі у свій двигун. Тим самим, якщо вам не довелося використовувати двигун для програмування, ви можете виявити, що деякі ваші рішення справді незграбні.
ChrisE

1
Я не бачу сенсу у ваших списках. Факт, який ви знаєте, C / C ++ і Python допомагають нам, але навіщо перелічити, що ви можете використовувати контроль версій та налагоджувач?
Качка комуніста

2
@TheCommunistDuck: Гей, це краще, ніж деякі розробники. :)
ChrisE

Відповіді:


11

Ви можете написати ігровий движок практично будь-якою мовою, використовуючи практично будь-які способи візуалізації. Ви можете написати ігровий движок в bash, використовуючи, наприклад, консольний вихід.

Отже, я думаю, що було б найкраще визначити, що саме ви хочете навчитися писати власний двигун. У розробці ігор багато "полів".

  • Основний ігровий движок

  • Візуалізація / Графіка

  • AI

  • Мережі

  • Гра / правила

  • Звук

  • Введення (клавіатура / миша / контролери тощо)

тощо. Звідти ви навіть можете мати підтеми. У візуалізації / графіці

  • 2d чи 3d?

  • Моделювання

  • Затінення

  • Освітлення

  • Текстурування

  • GUI / Huds / інтерфейси.

  • тощо, тощо

Просто одна з цих підтемати могла з'їсти багато годин (або років!) Навчання!

Отже, спочатку визначте, що ви хочете навчитися. Почати просто.

Використовуйте будь-яку мову, якою вам подобається - хоча деякі краще підходять для певних завдань. Наприклад, основний двигун і візуалізація, мабуть, найкраще проводити з мовою "нижчого" рівня, як C / C ++ (якщо вам потрібна така продуктивність); але щось на зразок AI або Правил гри може бути краще виконано мовою вищого рівня. Ніщо не говорить про те, що ви не можете змішувати та поєднувати. Ви можете написати свій движок на C ++, рендерінг на C (оскільки він добре працює з OpenGL), а потім використовувати LUA для розробки правил гри, тощо.

Що стосується прикладу, є ігровий движок під назвою Slick2D. Він написаний на Java і є відкритим кодом. Це приклад простого 2d двигуна, написаного та розробленого дуже добре. Ви можете вивчити основні поняття з цього, наприклад, петлі гри, керування станами ігор тощо.

Якщо вам комфортно з C / C ++; Я б запропонував переглянути SDL / OpenGL. Він обробляє деяке господарство, наприклад введення, звук, створення вікон тощо, і може зосередитись на інших речах.


4
Ах, дні, коли я навчався на C ++ та консольних іграх, були надзвичайно цікавими ... [створює новий проект консолі ...]
Нік Бедфорд,

Я оновив своє запитання, сподіваюся дати мені багато дивовижних ресурсів :)
Wazery

4

SDL + OpenGL - відмінний вибір для запуску користувальницького ігрового двигуна.

Я особисто використовую C-ish версію C ++, тому що я з’ясував, що найкраще працює для мене. Маючи на увазі, я не використовую жодних винятків. Для цього є дві причини: в першу чергу винятки вимагають безпечного коду виключення, який з OpenGL та SDL досягти не так просто. Що ще важливіше, однак таким чином дуже просто викрити об'єкти C ++ над C ABI, що є неймовірно корисним, якщо ви намагаєтесь ввести мову сценаріїв у суміш.

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

Щодо загальної архітектури, я маю дві пропозиції: якщо ви хочете, щоб 3D-двигун ознайомився з книгою Джейсона Ландера "Архітектура ігрового двигуна". Якщо все, що ви хочете, - це 2D, дотримуйтесь дизайн максимально просто і дозволяйте надихатись XNA або іншими проектами.

Нарешті: не телефонуйте OpenGL в усьому місці. Зробіть собі прихильність і виділіть її на пару місць, щоб ви могли пізніше переключитись між робочим столом OpenGL / OpenGL ES або навіть DirectX, якщо хочете.


0

Не використовуйте C, якщо детальна інформація про впровадження не містить вас під рукою. В іншому випадку використовуйте C ++, оскільки це набагато більш здатна мова, і ви завжди зможете пізніше не використовувати ці можливості. Я особисто нічого не маю за / проти Python, я ніколи цього не використовував.

Я б не рекомендував OpenGL проти DirectX, оскільки DX має сучасний об'єктно-орієнтований підхід, який набагато чистіший і зрозуміліший / менш схильний до помилок. Інтерфейс, запропонований OpenGL, є надзвичайно бідним порівняно.

Останнє, що я маю, - це те, що я чую від багатьох людей, яким я вірю, що GDB повністю, повністю відсмоктує, і налагоджувач Visual Studio - це далеко не найкраще. Це не мій особистий досвід, тому прийміть це з невеликою кількістю солі.


4
"OpenGL проти DX". Те, що DirectX більше OO, насправді не важливо. Наскільки це зрозуміліше ... OpenGL (до 3-х) відкриває досить простий інтерфейс, і той, який легко сканувати, оскільки це все за імперативною методологією в стилі С. "Встановіть для цього матрицю проекції. Почніть трикутники. Ось вершина. Ось вершина. Ось вершина. Кінець трикутників." 1.x серія API OpenGL хороша для того, щоб змочити ноги в графічному програмуванні, а в поєднанні з SDL (або навіть GLUT ... urg) дозволяє отримати додаток приблизно на 30-50 рядків коду.
ChrisE

2
@ChrisE: Безумовно. Існує щось, що називається extern "C", і його правильне використання робить написання інтерфейсу С досить тривіальним - особливо для Python, де в Boost існує перетворювач, що робить прив'язку до нього легким. Як щодо мови мови C ++? Вони чудові . Більш широке використання мовних функцій C ++ підвищує надійність проекту та простоту кодування для більш ніж прийнятного дуже незначного компромісу продуктивності. Мовні особливості C в порівнянні патетичні. Наприклад, правильне використання сучасного компілятора C ++ може гарантувати відсутність витоків пам'яті. Зробіть це в C.
DeadMG

1
@DeadMG: Якщо OOP справді було великою справою, відповідь тут - Java або C #, а не C ++. Я не погоджуюся з тим, що використання функцій C ++ не робить магічним чином ваш код кращим, швидшим або навіть більш надійним; ви повинні знати, як користуватися цими функціями, і чи вивчає мову на додаток до архітектури двигуна, справді добре використовувати свій час? Ні. Не для того, щоб хтось робив це вперше. Ви можете вивчити всі курси C за день-два, зручно і ніколи не замислюючись, що мова робить. OpenGL - корисний базовий виклик на будь-який тариф, пропонує однакову прозорість.
ChrisE

2
OOP не така вже й велика справа, не у високопродуктивних ігрових двигунах. Звичайно, це корисно, але це часто неправильна абстракція. Маючи хороший потік даних, локальність та компонування пам'яті, як правило, краще. Хоча багато команд використовують C ++, вони не використовують більшість функцій C ++. Ніяких винятків, якомога менше віртуалів, без RTTI, без STL / Boost. Чому? Передбачуване та швидке виконання та невеликий код на кількох платформах. Я кодую в C і є лише дві області, в яких я вважаю за краще використовувати C ++: масштабовані блокування та загальні масиви. Не варто клопоту ІМХО.
недійсна

4
Що стосується GL проти D3D: в ядрі GL3 / 4 немає матричного стека та немає стека attrib. І GL, і D3D відображають однакову архітектуру апаратури, але GL багато часу відчуває себе тоншою. Впевнений, що стан машини GL є чималим клопотом, але це фактичне обладнання;) Навчання будь-якого з них добре, і поки ви зрозумієте, що відбувається насправді, ви можете легко перейти на інший (або консольний API).
недійсна
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.