Введение в K5Engine (K5Engine 1)
Автор: Сергей Каленик
Статья введение в движок K5Engine.
В ней описана структура ядра движка и создание минимального приложения.
Введение.
В данной статье даётся краткое описание внутренних структур игрового движка K5Engine а так же приводится пример минимального приложения.
Движок K5Engine предназначен для разработки 2D игр. Он поддерживает 2 типа рендера: DirectX8 и OpenGL. Архитектура модульная, позволяет без лишних проблем интегрировать нужные библиотеки и системы в общую структуру.
Структура движка:
Движок состоит из трёх основных частей: ядро, расширения и библиотека тестового кода.
Ядро — реализация базового функционала, набор графических объектов, работа с текстом, устройства ввода-вывода. Код данного модуля стабилен, меняется и дополняется редко.
Расширения — разнообразные вспомогательные инструменты, такие как проверка на попадание точки в спрайт, эффекты типа вращения спрайта или движения. В данный модуль переносятся те системы, которые себя хорошо показали в работе и часто используются.
Библиотека тестового кода — представляет собой широкий набор разнообразных вспомогательных инструментов, значительно облегчающих разработку приложений. В данный модуль добавляются реализации новых механизмов для их тестирования. Далее при стабилизации кода блока он переносится в модуль расширений движка.
Для начала рассмотрим структуру ядра движка. В него входят такие компоненты:
ActionSystem — система классов-действий(реакций). Действия делятся на два типа: обычные и событийные. Обычные действия — выполняются в момент вызова. Событийные действия — выполняются как реакция на то или иное событие. Сюда входят базовые классы для создания действий, применяющихся к графическим объектам, к их спискам и менеджерам, а также сами списки и менеджеры списков действий. Эта система предназначена для построения игровой логики.
EventSystem — обобщённая событийная система движка. В неё входит перечисление типов событий, описание события и очередь событий.
GraphicSystem — графическая система движка. В неё входят такие графические примитивы: спрайт, банк спрайтов, текст. Так же шаблон для построения списков объектов и менеджера объектов и их реализации для каждого графического объекта. Очередь рисования, базовый класс текстур, списки текстур и менеджер текстур.
Инструментальные классы — генератор исключений, базовые классы устройства, приложения, камеры, чтения цвета пикселя с экрана, загрузчика текстур.
Cover — высокоуровневые реализации систем, зависимых от платформы а так же вспомогательные классы. Состав:
Реализация камеры для двух типов рендера.
Реализация устройства с возможностью инициализации для работы с тем или иным типом рендера.
Реализация класса для чтения пикселя экрана.
Реализация загрузчика текстур.
Собранная графическая сцена, включает в себя менеджеры графических объектов, камеру и очередь рисования.
LibMath — математическая библиотека. Сюда входит реализация двумерных векторов, матриц и вспомогательный математические функции.
LibShell — библиотека реализаций функционала, который зависит от платформы. Благодаря использования данной библиотеки в движок вносится функционал, который зависит от платформы или библиотеки, например: реализации устройства вывода для DirectX8 и OpenGL на WinApi, шел для библиотеки SDL для поддержки *Nix систем (Linux и MacOS).
При использовании того или иного модуля рендера нужно или подключить нужный заголовочный файл устройства вручную, или воспользоваться одним из define-определений Для Windows доступно три определения: USEWINAPIGLDEVICE, USEWINAPIDX8DEVICE, USESDLGLDEVICE. Для Linux систем только одно - USESDLGLDEVICE.
LibTools — базовые вспомогательные инструменты, таки как работа с логом, преобразование форматов, например: wstring в string и обратно, числовых типов в строки, строки в числовые типы.
Ядра игрового движка достаточно для создания игровых проектов.
Создание приложения.
Движок может использоваться на разных компиляторах и в разных средах разработки. Его работоспособность проверена для MinGW и Microsoft Visual C++ 2005/2008 Compiller. Для разработки приложений можно использовать любые среды, поддерживающие эти компиляторы, в примере приложение создаётся при помощи среды Code::Blocks с использованием MinGW.
Процесс настройки проекта:
1.При помощи визарда среды разработки создаётся консольное приложение
2.Подключаются все нужные библиотеки, в данном случае будет использоваться полное ядро движка, то есть надо подключить оба рендера к проекту. Это такие библиотеки: K5Engine, OpenGL32, glu32, DevIL, ILU, ILUT, D3D8, D3DX8d, freetype, а так же библиотеки user32, kernel32, gdi32, winmm
3.Движок для представления текста использует «широкие символы», поэтому для корректной работы надо добавить флаги UNICODE, _UNICODE (для Microsoft Visual Studio в настройках проекта флаг use unicode). Так же нужно добавить _STDCALL_SUPPORTED. Так же для того, что бы убрать вывод консольного окна, в опции линковки стоит добавить флаг -mwindows.
Настройка проекта готова. Далее есть несколько вариантов работы: можно использовать бесконечный цикл для работы приложения или воспользоваться готовым классом.
Добавляем в проект модуль Application. В заголовочном файле добавляем такой код:
class TApplication: public TBaseApplication { private: TDevice Device; TEventDeque EventDeque; private: inline void ProcessEvents(); inline void DrawScene( ); public: TApplication( ); ~TApplication( ); void Init( ); void Quit( ); void Main( ); };
Класс TApplication является наследников от виртуального класса TBaseApplication и включает в себя две основные системы: реализацию устройства TDevice и очередь событий TEventDeque.
В файл-реализацию добавляем такой код:
TApplication::TApplication():TBaseApplication( ) { } TApplication::~TApplication( ) { } void TApplication::ProcessEvents( ) { Device.ProcessEvent( ); while( EventDeque.IsNotEmpty( )){ TEvent Event( EventDeque.Pop( )); switch( Event.Type){ case EN_TIMER:{ }break; case EN_SYSTEM:{ if( Event.System.Type == EN_QUIT){ Stop( ); } }break; case EN_KEYBOARD:{ if( Event.Keyboard.Type == EN_KEYUP){ if( Event.Keyboard.Key == EN_KEY_ESCAPE){ Stop( ); } } }break; default:break; } } } void TApplication::DrawScene( ) { Device.ClearSceneColor( ); Device.SwapSceneBuffers( ); } void TApplication::Init( ) { wstring Type( L"directx8"); Device.Construct( Type); Device.SetEventDeque( &EventDeque); Device.SetCaption( L"Tutorial 01"); Device.SetClearColor( 0.0f,0.0f,0.0f,1.0f); Device.Create( 1024,768); Device.ResetTimer( ); Start( ); } void TApplication::Quit( ) { } void TApplication::Main( ) { ProcessEvents( ); DrawScene( ); }
В main.cpp добавляем код вида:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int nShowCmd) { App.Init( ); App.Work( ); App.Quit( ); return 0; }
Далее компилируем проект и получаем готовое приложение. При запуске создаётся пустое окно заданного размера с заголовком Tutorial 01 и чёрным цветом отчистки. При закрытии окна или при нажатии по ескейп приложение прекратит свою работу.
Уроки можно скачать по ссылкам:
Исходный код: Tutorials
Бинарные сборки: Tutorials
Файлы, нужные для разработки, можно найти по этим ссылкам:
1. Библиотеки, нужные для работы движка:
MinGW UserLibs
MinGW UserLibs
2. Собранные библиотека движка для MinGW и VisualC++
K5Engine lib
14 июля 2010 (Обновление: 28 авг 2010)
Комментарии [7]