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

Начиная работу

Автор:

Введение.

В этой статье описаны шаги, нужные для установки инструментария и написания минимального приложения на движке K5Engine.
Для примера будет использована среда разработки Code::Blocks и компилятор MinGW.

Установка и настройка инструментария.

Устанавливаем компилятор, найти его можно на официальном сайте: www.mingw.org. Инсталятор устанавливает его на диск C, но вы можете изменить место установки на другое, более удобное вам.

Далее идём на официальный сайт среды разработки:  www.codeblocks.org.  Тут есть два варианта: использовать стабильный релиз или взять ночную сборку. Я советую использовать ночную сборку, так как она несколько более удобна в работе. Главный недостаток ночных сборок — иногда не стабильно работают. Ночную сборку можно взять на форуме в этом разделе: Nightly builds. Выбираем которая больше подойдёт и качаем три архива — среда разработки и две dll, распаковываем всё в одну папку. Например у меня Code::Blocks установлен по пути C:\Program Files\codeblocks.

При первом запуске среда разработки предложит выбрать компилятор по умолчанию из установленных в системе. Выбираем  MinGW. Так же советую в настройках среды Settings – Editor в вкладке Editor Settings включить флаг Use TAB character, во вкладке Other Settings выставить кодировку в UTF-8.

После того, как компилятор и среда разработки готовы, можно приступить к установке прикладных библиотек и движка. Переходим по этой ссылке: K5Engine3 и качаем архивы GL, K5Engine, K5EngineExternSystems и [UserLibs][MinGW]. Содержимое архива GL кидаем в MinGW\include\GL. Это более новые заголовочные файлы для OpenGL, в базовой поставке компилятора их нет. Далее на диске C:\ создаём папку K5Engine и распаковываем в неё [UserLibs][MinGW]. Это библиотеки, которые используются в движке.  Так же если есть желание использовать DirectX, нужно скачать и установить Microsoft DirectX 8.1 SDK или написать собственную оболочку для более новой версии DirectX. Так же распаковываем архивы K5Engine и K5EngineExternSystems. В  K5Engine — библиотеки и заголовочные файлы движка, в K5EngineExternSystems — открытый код, реализация некоторого вспомогательного функционала. В итоге у вас должна получиться такая иерархия папок: папка K5Engine, в которой три папки  [UserLibs][MinGW], K5Engine, K5EngineExternSystems. Естественно подобная организация библиотек описана для примера, вы можете расположить их по своему вкусу.

Когда все библиотеки распакованы, нужно прописать пути к ним. Запускаем среду разработки, заходим Settings – Compiler and  debugger. Открываем закладку Search directories, в вкладке Compiler прописываем пути к заголовочным файлам, в  Linker пути к библиотекам.
 

Написание минимального приложения.

Теперь можно приступить к написанию первого приложения с использованием движка.  Запускаем среду разработки, выполняем File – New – Progect и выбираем создание консольного приложения — Console application. Далее запустится визард, который предложит выбрать язык для проекта, его название и компилятор. Теперь у нас есть простое консольное приложение типа  “hello world”.

Далее выполняем подключение библиотек системы и движка. В закладке Project – Build options -  Linker settings надо прописать библиотеки движка и системы. Нам понадобятся: K5EngineWinApiGLDevice, K5Engine, user32, kernel32, gdi32, opengl32, glu32, winmm, DevIL, ILU, ILUT. В Other linker options прописываем -mwindows.  Далее в Compiler settings – #defines прописываем _STDCALL_SUPPORTED, UNICODE, USEWINAPIGLDEVICE.

Добавляем заголовочный файл для main.cpp, для этого можно нажать F11, среда разработки попробует переключиться между .cpp и .h, а так как заголовочного файла нет, предложит его создать. Сейчас есть пустой main.h, надо доработать  его, добавляем #pragma once и #ifndef. Получается нечто такого вида:

#pragma once
#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED

#include "windows.h"

#endif // MAIN_H_INCLUDED

Далее дорабатываем main.cpp.
Так как предполагается, что код будет работать на Windows и Linux, он будет иметь такой вид:

#include "main.h"

#ifdef _WIN32
  int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
         PSTR pCmdLine, int nShowCmd)
#else
  int main()
#endif
  {
    return 0;
  }

После этого проект должен нормально компилироваться запускаться и сразу же выходить, вернув 0. Теперь надо подготовить класс-приложение для запуска оконного приложения. Для удобства работы с циклом приложения в движке есть класс TBaseApplication. По сути это обвёртка над классическим бесконечным циклом, его и будем использовать для построения каркаса приложения. Заголовочный файл TBaseApplication находится в ядре движка (K5Engine\Core). Добавляем в проект  Application.h и Application.cpp. Создаём класс TApplication, который наследуем от TBaseApplication, переопределяем его абстрактные функции Init(), Quit(), Main(). В самом теле класса объявляем устройство TDevice и и очередь событий TEventDeque. В итоге заголовочный файл  Application.h будет выглядеть так:

#pragma once
#ifndef APPLICATION_H_INCLUDED
#define APPLICATION_H_INCLUDED

#include "K5Engine.h"

class TApplication: public TBaseApplication
{
  private:
    TDevice      Device;
    TEventDeque EventDeque;
  public:
    TApplication();
    virtual ~TApplication();

    void Init();
    void Quit();
    void Main();
};

#endif // APPLICATION_H_INCLUDED

Теперь переходим к  Application.cpp, нам нужно в функции Init() создать и инициализировать устройство, в Main() проводить обработку событий и рисовать сцену.
Сначала опишем функцию Init():

void TApplication::Init()
{
  // создание устройства отображения в зависимости от платформы.
  // для Windows - TWinApiGLDevice, TWinApiDX8Device или TSDLGLDevice
  // для Linux - TSDLGLDevice
#ifdef _WIN32
  Device.Construct(new TWinApiGLDevice);
#else
  Device.Construct(new TSDLGLDevice);
#endif

  Device.SetEventDeque(&EventDeque); // установка очереди событий
  Device.SetCaption(L"01 First Step"); // установка заголовка окна
  Device.SetClearColor(0.0f,0.0f,0.0f,1.0f); // установка цвета фона
  Device.Create(1024,768, false); // создание окна с размерами 1024 на 768

  Device.ResetTimer(); // сброс таймера

  Start(); // старт цикла TApplication
}

Далее функция Main():

void TApplication::Main()
{
  Device.ProcessEvent(); // обработка событий устройством
  
  // извлечение событий из очереди и реагирование на них
  while(EventDeque.IsNotEmpty()){ 

    TEvent Event(EventDeque.Pop());

    switch(Event.Type){
      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;
    }
  }

  Device.ClearSceneColor();  // отчистка сцены
  Device.SwapSceneBuffers(); // переключение буфферов отображения
}

В целом класс приложения готов. Далее остаётся только его подключить в main и запустить приложение.  В main.h подключаем  Application.h, в  main.cpp добавляем такой код:

  {
    TApplication App;
    App.Init();
    App.Work();
    App.Quit();

    return 0;
  }

Если всё сделано правильно, то будет создано пустое окно, с заголовком "01 First Step" и с пустым чёрным фоном.

Итог.

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

25 ноября 2011 (Обновление: 2 дек. 2011)

Комментарии [3]