Я пытался разработать 2D-игру с C++ в прошлом, используя простые объекты, однако в процессе проектирования я не знаю, как и какие части ядра я должен разделить на более мелкие объекты, что именно они должны делать и как заставить их взаимодействовать друг с другом должным образом. Я ищу книги, учебники, документы, все, что подробно объясняет дизайн игрового движка. Благодарю.OOP Game Design Theory
ответ
Eberly's 3D Game Engine Architecture и 3D Game Engine Design довольно тяжелы в теории, но достаточно хорошо покрывают все базы.
Обязательное чтение: http://scientificninja.com/advice/write-games-not-engines
Почему вы думаете, нужен игровой движок? Напишите код, необходимый для реализации вашей игры. Измените его по мере изменения требований. И когда у вас есть полная игра, сделайте шаг назад и посмотрите, как выглядит результат.
Вы не можете и не должны выкладывать полную диаграмму классов в начале. Нарисуйте общее представление о том, какие общие компоненты вы хотите, и каковы должны быть их обязанности, а затем попытайтесь его закодировать. Начните с классов, в которых вы уверены. Рано или поздно некоторые из них станут большими и громоздкими, поэтому вы разделите их на несколько меньших. Иногда вы можете обнаружить, что несколько классов в основном делают одно и то же, поэтому вы объединяете их вместе. Надеюсь, рано или поздно вы закончите с дизайном, который работает, что больше, чем вы могли бы получить, если бы попытались создать игровой движок впереди.
Мне нравится подход try & refactor. Создание дизайна OO требует опыта – theactiveactor
Даже с опытом, это все еще 1) невозможно, и 2) плохая идея, чтобы попытаться придумать полный подробный дизайн * до того, как его реализовать. Причина в том, что вся «подвижная» вещь так сильно зацепилась. Вы * будете * сталкиваться с проблемами, о которых вы не думали, поэтому принимайте решения по дизайну, когда у вас есть необходимая информация, то есть когда вы пытались его реализовать и выяснили, что это за ловушки. – jalf
Если вы еще не сделали игру раньше, как вы можете сделать двигатель? Там есть тонны бесплатных двигателей, или вы потратите 20 лет, пытаясь что-то сделать, потому что вы будете переписывать снова и снова.
Да, что делает игру хорошей, это контент не двигатель, все хорошие программисты «заимствуют» код других людей, когда они могут – Patrick
http://fivedots.coe.psu.ac.th/~ad/jg/
Этот парень выкладывает хороший стиль ЛСГ и через книга поможет вам построить кадр двигателя. Это место на хороших вещах.
В игре есть два важных типа объектов. Есть объекты, которые содержат процессы, и есть объекты, которые взаимодействуют с окружающей средой и пользователем.
Для объектов, выполняющих процесс, например изменение непрозрачности объектов, вы хотите, чтобы они были независимыми от любых переменных уровня класса. Они должны просто принимать значения (ы) и возвращаемые значения. Если у вас есть процесс вычисления силы тяжести, процесс должен принимать объект, на который рассчитывается гравитация, и возвращать величину тяжести, которую испытывает объект, и направление силы тяжести, если игра проходит в пространстве.
Вторым важными типами объектов являются те, которые взаимодействуют с пользователем и окружающей средой. Эти объекты должны не иметь одного и того же базового класса. Базовому классу потребуется изображение, а также позиция x и y и могут иметь переменные, которые выполняют определенные процессы, такие как изменение скорости или направления переменной. С помощью этого базового класса вы можете выполнять такие процессы, как гравитационный процесс, упомянутый ранее, используя все объекты «встроенные» переменные, такие как скорость, направление и положение x и y.
Вы также захотите настроить свои объекты для запуска peices кода при определенных условиях. Может быть хорошей идеей, чтобы ваш базовый класс предоставлял функции, которые запускаются при выполнении одного из этих условий. Некоторыми полезными условными функциями являются условная функция, которая возникает, когда объект сначала создается и когда он уничтожается. Устанавливается условная функция после таймера. Условный функционал постоянно, где вы можете размещать код для рисования изображений на экране. Выключить условную функцию Когда нажата клавиша или кнопка мыши.Условная функция, чтобы уйти с установленного количества раз в секунду, чтобы вычислить такие вещи, как гравитация на объекте.
Эта структура очень хорошо работала для меня при создании игр. Он работает для любого типа игры и работает ужасно для других типов программ. Извините, если мой сценарий неясен, я печатаю на своем iPod, и мне было бы трудно вернуться и редактировать вещи здесь.
Возможно, вы захотите взглянуть на XNA, если только посмотреть, как работает основной игровой цикл. – StrixVaria
Не используйте «простые объекты». Используйте все, что имеет смысл. Ваша игра не обязательно должна быть строгой ООП. Он должен работать, и это должен быть хороший, хорошо структурированный код. Ни один из них не требует ООП. Напишите свою игру, используя каждый доступный инструмент. Классы, функции, функторы, шаблоны, процедурное программирование, объектно-ориентированное программирование, функциональное программирование, универсальное программирование, что бы ни подходило под задачу. Не ограничивайте себя ООП только потому, что некоторые люди 20 лет назад считали это святым Граалем. – jalf