Войти
K5EngineСтатьи

Введение в K5Engine3

Автор:

Введение.

В данной статье даётся краткое описание внутренних структур игрового движка K5Engine 3.
В целом статья по содержанию соответствует более старой версии, написанной для  K5Engine 1.

Движок  K5Engine предназначен для разработки 2D игр. Писался с прицелом работы на нескольких системах — Windows, Linux.
В данный момент поддерживается 2 типа рендера: при помощи DirectX8 и OpenGL. Архитектура модульная, позволяет без лишних проблем интегрировать нужные библиотеки и системы в общую структуру.

Движок состоит из трёх частей:
Сам движок (K5Engine) — функционал, достаточный для разработки игры: набор базовых графических и функциональных классов, объединённых общей архитектурой, нужных для работы.
Расширения движка (K5EngineExtensions) — расширения функционала, дополнительные модули, облегчающие разработку приложения.
Внешние системы движка (K5EngineExternSystems) — открытый код движка, ещё больше расширяющий доступный функционал.

Далее рассмотрим каждый элемент более подробно.

1. K5Engine

Сам игровой движок. Состоит из таких таких блоков:
Ядро (Core)
Оболочка ядра (Cover)
Математическая библиотека (LibMath)
Оболочки библиотек (LibShell)
Дополнительный инструментарий (LibTools)

Далее о каждом элементе подробно.

Ядро движка K5Engine.

Ядро (Core) —реализация базового функционала, набор графических  объектов (спрайты и текст),  система событий, базовая классы для построения логики игры.
Код данного модуля стабилен, меняется и дополняется редко.

В него входят такие компоненты:
BaseApplication — каркас для построения игрового приложения.
По своей сути — бесконечный цикл, завёрнутый в класс с некоторыми сервисными функциями, однако в работе достаточно удобная вещь.
BaseDevice — базовое устройство движка. Наследники от этого класса являются реализациями функционала, зависящего от платформы или типа рендера.
Класс создаёт окно приложения, проводит обработку и помещает события в очередь, отчищает сцену и переключает буферы отображения.
BaseFontFaceLoader — базовый класс для загрузки шрифтов.
BaseSceneObject — базовый класс сцены.
BaseScreenPixelReader — позволяет получить цвет пикселя по его координатам.
BaseTextureCreater — класс для ручного создания текстуры из массива данных.
BaseTextureLoader — базовый класс для загрузки текстуры из графического файла.
Exception — класс-исплючение движка. Именно его выкидывают разнообразные системы при возникновении ошибок.
ExceptionGenerator — класс для удобной генерации исключений.
Point2D — описание двумерной точки.
Point3D — описание трёхмерной точки, класс широко используется во всех подсистемах движка.
Value — класс-значение. Фактически в большинстве случаев используется как угол у графического объекта.

А так же подсистемы:

ActionSystem — базовая система классов-действий (реакций). Предназначена для построения унифицированной игровой логики. 
По сравнению с первой версией движка, система была упрощена — убрано деление на два типа действий, (остались только событийные), убраны промежуточные наследники.
Её текущий состав:
ActionList — список действий, нужен для группового хранения и обработки действий.
ActionListManager — список списков действий.
ActionPointerList — список указателей на действия.
BaseAction — базовый класс действия.
BaseActionList — базовый шаблонный класс для списков действий.
BaseActionPointerList — базовый шаблонный класс для список указателей действий.

EventSystem — обобщённая событийная система движка. В неё входит:
enum_EventTypes - перечисление типов событий.
Event — структура события, генерируется устройством: таймер, мышь, ввод с клавиатуры, события системы.
EventDeque - очередь событий, в которую попадают новые события перед обработкой.  Очердь передаётся в базовое устройство, которое уже генерирует события.

GraphicSystem — графическая система движка. В неё входят такие компоненты:
Блок Base – базовые классы сцены, такие как Color, BaseGraphicObject, шаблонный класс для списков и менеджер списков графических объектов и другие.
Блок Elements — элементы графических объектов, например массив цвета, текстура графического объекта.
Блок Sprite — сюда входит сам спрайт, его список и менеджер списков и другие завиимые объекты.
Блок Text — содержит объект текста, шрифта, списки и менеджеры.
Camera — камера сцены.
RenderQueue — очередь рендера, нужна для расстовления объектов по порядку рисования.
TextureList, TextureListManager, TexturePointerList — списки текстур, списков текстур и список указателей на текстуры.
По сути аналог подобных классов в системе действий для текстур.

MusicSystem — простая звуковая система движка. Точнее каркас для построения звуковой системы.
В неё входят такие компоненты: звуковое устройство, музыкальный трек, загрузчик треков, список и менеджер списков треков.

Оболочка ядра.

Оболочка ядра (Cover)  — включает в себя наследники от платформо-зависимых классов движка.
Фактически нужна для более удобной работы с базовыми классами.
Но по сути без каких либо проблем можно обойтись без этого модуля, просто оперируя указателями на базовые классы.

В оболочку входят:
BitmapFontLoader — загрузчик битмаповских шрифтов текста.
Реализация устройства с возможностью инициализации для работы с тем или иным типом рендера.
Реализация класса для чтения пикселя экрана.
Реализация загрузчика текстур.
Собранная графическая сцена, включает в себя менеджеры графических объектов, камеру и очередь рисования.

Математическая библиотека.

Математическая библиотека (LibMath) — реализации кривых безье, векторов, матриц, и разнообразных математических функции.
Используется внутри движка.

Оболочки библиотек.

LibShell — библиотека реализаций функционала, который зависит от платформы.
Благодаря использования данной библиотеки в движок вносится функционал, который зависит от платформы или библиотеки, например:
реализации устройства вывода для DirectX8 и OpenGL на WinApi, оболочка над SDL для поддержки *Nix систем (Linux и MacOS).

В данный момент в библиотеку входят такие блоки:
DevIL
DX8
OpenGL
SDL
WinApi

При работе с тем или иным типом рендера есть оболочки собраны в три отдельных библиотеки: libK5EngineSDLGLDevice.a, libK5EngineWinApiDX8Device.a,  libK5EngineWinApiGLDevice.a.
Соответственно при использовании той или иной библиотеки надо подключать нужные ей сторонние модули.
Так же при подключении к проекту той или иной библиотеки нужно указать путь к реализации устройства или использовать define.
Для windows это: USEWINAPIGLDEVICE, USEWINAPIDX8DEVICE, USESDLGLDEVICE, для linux только USESDLGLDEVICE.

Библиотека инструментов.

LibTools — базовые вспомогательные инструменты, таки как работа с логом, преобразование форматов wstring в string и обратно,
числовых типов в строки, строки в числовые типы а так же генерация случайных чисел.

2. K5EngineExtensions

Расширения — разнообразные вспомогательные инструменты.
В этот модуль входят:
ActionSystem — система готовых стандартизированных действий над объектами движка.
Это итераторы точки, цвета, угла, контейнеры для действий, загрузчики объектов.
CollisionSystem — простая система для обнаружения столкновений. Подходит для простой логики проверок  кликов по объектам.
DataNodeSystem — система для работы с описаниями сущностей движка. Позволяет записывать и востанавливать состояния объектов из унифицированной структуры данных.
Например можно сохранить состояния списка спрайтов и в последствии восстановить старые значения или создать копию такого списка из описания.
GraphicObjectTools — некоторые инструменты, позволяющие производить некоторые специфические операции над спрайтами — генерировать вдоль пути, по кругу, разрезать и несколько упрощённо создавать.
По сути эта подсистема в работе нужна очень редко.
LibTools — вспомогательные классы, такие как работа с путями и каталогами, класс для поиска объектов по их атрибутам.
UISystem — система для построения интерфейса пользователя. В данный момент в ней находится только реализация простой кнопки.

3. K5EngineExternSystems

Библиотека дополнительных систем —тут находятся расширения функционала движка при помощи сторонних библиотек.
Код библиотеки открыт и постепенно количество доступных модулей будет расти.

Её состав:
FreeTypeFontSystem — код для генерации битовых шрифтов при помощи библиотеки freetype.
XmlToolsSystem – дополнительный функционал для работы с библиотекой TinyXML: код для записи и чтения классов движка из xml.
Наиболее полезен в этом модуле — класс DNXmlFile, предназначенный для записи и считывания структуры узла данных.
Так как код открыт, при желании можно спокойно заменить библиотеку  TinyXML на более привычную.


На этом обзор структуры движка может быть закончен.
В следующей статье — как создать приложение с использованием движка, среды разработки Code::Blocks и компилятора MinGW.

14 сентября 2011