При разработке проекта Game Engine существует немало внимания его процессу проектирования. Одна из самых важных целей - сделать этот проект максимально возможным как модульным, так и многоразовым. Все компоненты вашего двигателя должны быть в собственном проекте, и все содержимое игры должно быть также в собственном проекте. Таким образом, вы можете повторно использовать проект Game Engine для создания нескольких игр только путем создания нового игрового проекта. Таким образом, вам не нужно выделять исходный код игры из самого двигателя и ломать двигатель. Это экономит много времени, работы и проблем в будущем. Рассмотрим этот шаблон дизайна. В потоке проекта, который я показываю ниже, используется API OpenGL.
Проект проекта: Статическая библиотека, содержащая все классы, необходимые для загрузки изображений, звуков, обработки шейдеров, рендеринга объектов на экране и обработки сетевых сообщений.
- Двигатель: Этот класс будет абстрактным, и он создаст ваше окно, настроит разрешение игры и инициализирует DirectX или OpenGL или любой другой графический API. Класс Game, который находится в собственном проекте, наследует это.
- AssetStorage: класс, который управляет памятью всех активов.
- Пакет: класс, который создает типы партий треугольных полос, вентиляторов и т. Д., Которые будут использоваться для отправки вершин на видеокарту.
- BatchManager: класс, который управляет партиями.
- CommonStructs: только файл заголовка, содержащий структуры & перечисления, которые являются общими для нескольких классов внутри движка.
- ExceptionHandler: класс, который обрабатывает все исключения.
- FontManager: класс, который управляет шрифтами, которые загружаются из файлов текстур.
- Logger: класс, который будет записываться в файл или в консоль, когда необходимо либо отобразить, либо зарегистрировать сообщение об ошибке, предупреждение или важное сообщение.
- Настройки: класс, в котором хранятся пользовательские настройки, такие как разрешение, чувствительность мыши и т. Д.
- Singleton: абстрактный базовый класс, который используется для обеспечения того, чтобы определенные классы могли существовать только один раз за запуск приложения. Примеры, любые типы классов Manger, Engine :: Game - это тип объекта Singleton.
- Утилита: класс, который не является объектом, но содержит множество полезных функций, которые определяются как статические. Чтобы использовать один из таких, вы должны включить файл * .h и вызвать любой метод, как в
Utility::convertToUnsigned(string);
- Анимация: абстрактный класс, из которого будут образовываться все типы анимации.
- AnimationGuiMover: тип анимации, ответственный за перемещение объектов Gui.
- AnimationManager: класс менеджера, который управляет всеми анимациями.
- AnimationTimer: Тип объекта анимации, основанный на заданном таймере.
- FileHandler: базовый класс, который будет иметь определенные типы обработчиков файлов, будет получен из
- MkoFileReader: чтение в пользовательском 2D или 3D объекте.
- TextFileReader: чтение в текстовом файле.
- TextFileWriter: Запись в текстовый файл.
- TextureFileReader: чтение в файле текстуры: png, tga, bmp, jpeg и т. Д.
- Array2d: Тип объекта Mko.
- BaseMko: базовый класс для объектов Mko.
- FontFile: файл 2D-изображения для создания шрифтов.
- Image2D: Другой тип объекта Mko.
- Surface3d: Другой тип объекта Mko
- VisualMko: Любой объект Mko, который имеет ассоциированные визуальные эффекты, такие как спрайт или 3D-модель.
- ShaderManager: класс менеджера, который обрабатывает все шейдеры.
- ShaderProgramSettings: Используется для установки программ шейдера OpenGL в соответствии с атрибутами и униформами - в значительной степени зависит от шаблонов.
- ShaderVariable: Это может быть либо атрибут, либо униформа и в значительной степени зависит от шаблонов.
- BlockProcess: класс, используемый для блокировки процесса: так, что нам нужно только 1 экземпляр игры, поэтому в окнах он создаст мьютекс, основанный на дескрипторе окна и имени приложения, предотвращая несколько исполнений этого приложения.
- BlockThread: Используется для создания и уничтожения критических разделов при работе с многопоточным процессом.
- OpenglThread: определенный класс потоков, используемый для работы с OpenGL
- VolatileLocker: аналогичен BlockThread, но используется с изменчивыми типами данных.
- Gui Система:Это иерархия классов; некоторые из которых являются абстрактные базовые классы
- GuiCompositeElement: абстрактный базовый класс
- GuiElement: абстрактный базовый класс
- GuiImage: наследуется от GuiRenderable
- GuiImageElement: Не наследуют от любого другого класса.
- GuiLabel: Наследуется от GuiText
- GuiLayout: абстрактный базовый класс для всех типов компоновки - наследуется от GuiRenderable
- GuiLayoutAbsolute: Наследуется от GuiLayout
- GuiLayoutGrid: наследуется от GuiLayout
- GuiLayoutSlices: Наследуется от GuiLayout
- GuiLayoutStack: Inherits from GuiLayout
- GuiLoader: класс, который читается в текстовом файле gui, анализирует данные и конструирует все объекты gui, чтобы уменьшить время сборки при изменении dat a в системе gui.
- GuiRenderable: Наследуется от GuiCompositeElement но также абстрактный базовый класс
- GuiScreen: Не может быть потомком другого типа Gui Но содержит Gui детей - наследует от GuiCompositeElement
- GuiText: Наследуется от GuiRenderable
- GuiTextArea: Наследуется от GuiText
- Более Приехать:объектов, таких как обработка звука, сети и т.д.
Game Project: Содержит только контент для игры, например, какие ресурсы загружать, уровни загрузки, как обрабатывать ввод пользователя с клавиатуры и т. Д., И все, что характерно для этой игры.
- main.cpp - Главная точка входа.
- Игра: Game Class, который запускает игровой цикл, инициализирует все настройки, создает все необходимые объекты и т. Д., И обрабатывает ввод пользователя.
- GameState: Переключение между воспроизведением, приостановкой и т. Д. Конечный автомат.
- Недвижимость: Свойства, характерные для этой игры.
- Более Приехать: Этот проект далек от завершения
Как вы можете видеть, это разработано с идеей игрового движка является также универсальным и модульным, как это возможно, чтобы отделить все игры Логика из Logic Engine. С таким типом процесса проектирования все, что нужно сделать, чтобы создать совершенно другую игру, используя тот же существующий движок, - это удалить проект игры и добавить новый, сохранить все активы в соответствующих каталогах и написать необходимый код для новая игра. Таким образом, вам не нужно беспокоиться о том, чтобы погрузиться в проект проекта Engine Engine через тысячи строк кода, пытаясь определить, что такое код двигателя и что такое код игры с высокой вероятностью взлома двигателя. Такой поток дизайна сэкономит много головных болей и драгоценного времени.
Как вы видите, класс Engine отвечает за создание окна, настройку графического API, создание объектов-менеджера и возможность загрузки и рендеринга ресурсов. С учетом того, что этот класс Engine является абстрактным, класс игры должен наследовать от него и иметь чистые виртуальные методы для управления клавиатурой & Мышь вводит уверенность в том, что каждая игра должна реализовывать способы управления пользователями. Этот проект находится в разработке на протяжении нескольких лет, и еще предстоит сделать еще большую работу. Это решение/игровой движок значительно облегчен по сравнению со всем, что связано с промышленным стандартным движком, и я уже расширяю более 100 000 строк кода, и я даже не упоминал ничего о логике игры, подсчете очков, развитии уровня, физике, ни ИИ.
Что случилось с включением только заголовков, которые определяют классы только для ядра в файлах реализации Engine? – jaggedSpire
Возможно, пространство имен? – Amadeus