K5EngineСтатьи

Введение в 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]