Начало работы с игровым движком Rungine

Runner Engine (сокращенно Rungine) — это новый 2D/3D движок для создания игр и мультимедийных приложений. Он обладает гибким набором инструментов, которые способны помочь разработчику увеличить скорость разработки, но они пока находятся в доработке. В состав движка входят: Core (ядро с собственным набором утилит), GUI, Graphic2D. В данный момент Runner Engine поддерживает только DirectX9. Идет работа над поддержкой OpenGL. В дальнейшем планируется продолжить работу над поддержкой DirectX10 и DirectX11.

Поддерживаемая платформа: Windows

В данный момент движок находится в разработке. Если кому-то будет очень интересно посмотреть на этот движок в работе, возможно создание промежуточной демо-версии, для этого надо только сообщить.

Инициализация:

Первым шагом необходимо подключить dll движка:
#include "..\..\RunnerEngine\Runner.h"
#pragma comment(lib, "../../Bin/Runner.lib")


Объявляем девайс:
RDevice rdevice;
//Для инициализации необходимо вызвать метод Create:
if(!rdevice.Create(800, 600, Mode::Windowed, API::Direct3D9)) {
   return 0;
}


Весь рабочий цикл осуществляется следующим образом:
//рисуем, пока окно не закрыто
while(rdevice.EnterMsgLoop(true)) {
   rdevice.Clear();//очищаем поверхность окна
   //начало рисования графики
   if(rdevice.BeginScene()) {
        //рисуем картинку внутри окна
        rdevice.EndScene();//конец рисования
        rdevice.Present();//отображаем все нарисованное
   }
}

Все. Инициализацией мы разобрались. Теперь можно вывести на экран картинку или нарисовать изображение.


Hello, Runner
Hello, Runner — это первый пример из Rungine SDK. Он показывает, как инициализировать Rungine и нарисовать простейшее изображение.

Исходный код с описанием:
//Подключаем движок:
#include "..\..\RunnerEngine\Runner.h"
#pragma comment(lib, "../../Bin/Runner.lib")
String MediaDir = "../Media/HelloRunner/";
RDevice rdevice;//объявление устройста для работы всего движка
Picture im;//обычное изображение
RFont font;
int WINAPI WinMain(
                                  HINSTANCE hinstance,
                                   HINSTANCE prevInstance,
                                   PSTR cmdLine,
                                   int showCmd) {
  RFile f;
  //стандартные настройки:
  int width = 800;
  int height = 600;
  bool mode = Mode::Windowed;
  int api = API::Direct3D9;
  //проверяем наличие изображения:
if(!FileUtility::FileExists(MediaDir + "../Samples.dat"))
  //если его нет, значит приложение запущенно из Visual Studio:
  MediaDir = "../" + MediaDir;
  /*
     Читаем настройки длины, высоты, типа приложения
     (оконное/полноэкранное) и используемого API:
   */
   if(f.OpenRead((MediaDir + "../Samples.dat").ToChar())) {
       f.Read(&width,sizeof(width));
       f.Read(&height,sizeof(height));
       f.Read(&mode,sizeof(mode));
       f.Read(&api,sizeof(api));
       f.Close();
   }
   //инициализируем Runner Engine и создаем
   //окно размером WidthхHeight пикселей:
   if(!rdevice.Create(width, height, mode, api)) {
      return 0;
   }
   //Создание системного шрифта Tahoma 10 кегля
   font.Create(&rdevice, Fonts::Tahoma); 
   //создаем im, загружам картинку RunnerBackground.tga:
   im.Create(&rdevice, MediaDir + "RunnerBackground.tga");
   //изменение заголовка окна:
   Window::SetTitle("Runner Engine. Tutorial: Hellow World");
   //рисуем, пока окно не закрыто
   while(rdevice.EnterMsgLoop(true)) {
      //true для того, что бы при неактивном окне фпс падал, с целью
     //экономии ресурсов
     rdevice.Clear();//очищаем поверхность окна
     //начало рисования графики
     if(rdevice.BeginScene()) {
        //рисуем картинку внутри окна
        im.Draw(0,0,Window::GetWidth(),Window::GetHeight(),
        Colors::White);
        //Вывод текста:
        font.Begin();
        font.Draw2DText(10,10,"Press ESC to exit",Colors::White);
        font.Draw2DText(10,25,String("FPS: ") + rdevice.GetFPS(),
        Colors::White);
        font.End();
        rdevice.EndScene();//конец рисования
        rdevice.Present();//отображаем все нарисованное
     }
     //проверка нажатия на клавишу ESC:
     if(Keyboard::GetKey(KEY_ESCAPE)) {
        Window::Destroy();//завершаем работу приложения
     }
  }
   return 0;
}
//для того что бы взять hWnd окна: Window::GetHWND();



Запущенный пример выглядит следующим образом:
image

Gears:
Gears — это пример простейшей анимации на примере двух взаимосвязанных шестеренок

#include "..\..\RunnerEngine\Runner.h"
#pragma comment(lib, "../../Bin/Runner.lib")
String MediaDir = "../Media/Gears/";
RDevice rdevice;//объявление устройста для работы всего движка
//Изображения шестренок:
Picture Gear1;//нижняя шестеренка
Picture Gear2;//верхняя шестеренка
Picture Symbol;//название движка
RFont font;
//количесво зубчиков у первой и второй шестеренок:
int g1_count = 12;
int g2_count = 12;
float angle = 0.0f;//угол поворота шестеренок в радианах
bool Create() {
  RFile f;
  //стандартные настройки:
  int width = 800;
  int height = 600;
  bool mode = Mode::Windowed;
  int api = API::Direct3D9; 
  //проверяем наличие изображения:
  if(!FileUtility::FileExists(MediaDir + "../Samples.dat"))
      //если его нет, значит приложение запущенно из Visual Studio:
      MediaDir = "../" + MediaDir;
      /*Читаем настройки длины, высоты, типа приложения
        (оконное/полноэкранное) и используемого API: */
  if(f.OpenRead((MediaDir + "../Samples.dat").ToChar())) {
    f.Read(&width,sizeof(width));
    f.Read(&height,sizeof(height));
    f.Read(&mode,sizeof(mode));
    f.Read(&api,sizeof(api));
    f.Close();
  }
  //инициализируем Runner Engine и создаем  
  //окно размером WidthхHeight пикселей:
  if(!rdevice.Create(width, height, mode, api)) {
   return false;
  }
  rdevice.SetTexFilter(TexFilter::ANISOTROPIC,TexFilter::ANISOTROPIC,16);
  //Создание системного шрифта Tahoma 10 кегля
  font.Create(&rdevice, Fonts::Tahoma);
  //загружам текстуры:
  Gear1.Create(&rdevice, MediaDir + "Gear1.dds");
  Gear2.Create(&rdevice, MediaDir + "Gear2.dds");
  Symbol.Create(&rdevice, MediaDir + "Symbol.tga");
  return true;
}
void UpdateFPS() {
  //старое значение fps(колво кадров в секунду):
  static int old_fps = 0;
  //взятие нового значения fps:
  int new_fps = rdevice.GetFPS();
  if(old_fps != new_fps) {
    //название заголовка окна:
    Window::SetTitle(String("Runner Engine. Tutorial 2: Gears ")+ new_fps +" fps");
    old_fps = new_fps;
  }
}
void Render() {
  //рисуем, пока окно не закрыто:
  while(rdevice.EnterMsgLoop()) {
    UpdateFPS();
    /*угол поворота большой шестеренки зависит от пройденного
          интервала времени, а не количества кадров:*/
    angle += rdevice.GetElapsedTime()/500.0f;
    /*
          т.к. шестеренки могут быть разными, у первой g1_count зубчиков, а у
          второй g2_count, то они должны вращаться с разной скоростью, т.е.
          например, вторая шестеренка должна вращаться в g2_count/g1_count раз
          быстрее первой и в противоположную сторону.
          т.е. угол поворота второй шестеренки вычисляется следующим
          образом:*/
    float angle2 = -(g2_count/g1_count)*angle;
    /*Теперь ее вращение шестеренки зависит от первой шестеренки.
            Таким образом можно строить целые цепи взаимосвязанных шестеренок.*/
    rdevice.Clear(Colors::System::Background);//очищаем поверхность окна
    rdevice.SetTexWithAlphaChanel(1);//разрешаем альфа каналы
    //начало рисования графики
    if(rdevice.BeginScene()) {
      //координаты расчитаны на разрешение 800х600, но работает
      //одинакого при любых разрешениях благодаря умнажения их
      //на коэффициент соотношения текущего разрешения к разрешению
      //800х600:
      float kx = (float)Window::GetWidth()/800;
      float ky = (float)Window::GetHeight()/600;
      int x = 170;//*kx;
      int y = 70;//*ky;
      //размеры расчитываются аналогичным образом:
      int sx = INT(297.0f*kx);
      int sy = INT(297.0f*ky);
      //где 297 это длина и ширина изображений шестеренок в икселах,
      //для разрешения экрана 800x600
      //рисование шестеренок:
      Gear1.Draw(INT((x - 40)*kx), INT((y + 170)*ky),sx,sy, angle);
      Gear2.Draw(INT((x + 150)*kx), INT((y - 40)*ky),sx,sy, angle2);
      //вычисляем размер надписи с учетом разрешения:
      Point Size = Symbol.GetSize()*Window::GetWidth()/2300;
      Symbol.Draw(Window::GetWidth() - Size.x, Window::GetHeight() –
      Size.y, Size.x, Size.y);
      //Вывод текста:
      font.Begin();
      font.Draw2DText(10,10,"Press ESC to exit",Colors::White);
      font.Draw2DText(10,25,String("FPS: ") +
      rdevice.GetFPS(),Colors::White);
      font.End();
      rdevice.EndScene();//конец рисования
      rdevice.Present();//отображаем все нарисованное
    }
    //проверка нажатия на клавишу ESC:
    if(Keyboard::GetKey(KEY_ESCAPE)) {
      Window::Destroy();//завершаем работу приложения
    }
  }
}

int WINAPI WinMain(HINSTANCE hinstance,
HINSTANCE prevInstance,
PSTR cmdLine,
int showCmd) {
  if(Create()) {
    Render();
    return 0;
  }
}


Запущенный пример выглядит следующим образом:
image
Share post

Comments 43

    +3
    Как-то шустро вы начали-сразу код, даже не объяснив что это за Rungine и с чем его едят.
      0
      Подправил
      +1
      А в чём его возможные преимущества по сравнению с другими движками?
        +1
        Я не буду говорить, как обычно пишут обо всех новых проектах: «Легкость, гибкость и т.д..». В данный момент преимуществ нету. Разработка ведется 1 человеком (идет набор в команду разработчиков), который пишет движок в свободное от учебы время.
          0
          Я специально уточнил «возможные», что планируется особенного?
          А нет желания присоединиться к разработке какого-нибудь существующего движка? Чем делать «yet another graphics engine».
            0
            Из разговора с разработчиком:
            Думаю, что будет, но для этого нужна команда. В принципе работа только началась, т.к. готова только структура движка, а еще есть редакторы, скрипты, сети, звук и прочее…

            Я: а если тебе предложат вступить уже в существующий проект? пойдешь?
            ОН: нет, пока буду считать нужным развивать свой
        0
        А зачем opengl? Если уж очень хочется делять opengl, например для кроссплатформенности, то стоит вообще отказаться от directx. В opengl есть почти все вкусности из directx9, а возможности directx10 и выше редко используются в indie играх. opengl реально более сложный, чем directx, поэтому если не хотите кроссплатформенности, вообще не влезайте в opengl — прошли времена (еще первых двух quake), когда некоторые карточки лучше работали в режиме opengl.
          +2
          opengl как раз и используется для кроссплатформености
            0
            цитата разговора с разработчиком про DirectX:
            как смысл, для винды — передовая графика, а так при инициализации выбираешь, что использовть DirectX или OpenGL
              0
              Хозяин барен.
              Просто у меня есть некоторый опыт в написании игровых 3D движков, конечно опыт немного обтерся, лет 6 как никак прошло — но базовые навыки мне подсказывают, что хоть тогда не было, что сейчас нет реально мультифреймворкных движков, которые поддерживали бы и directx и opengl на достойном уровне. Так что мой опыт подсказывает, что стоит выбирать один фреймворк, особенно на one man проекте.
                0
                Только под Виндой с OpenGL все еще бывают проблемы. То древняя карта его не держит вообще. То интегрированная Intel графика не поддерживает RenderTarget'ы в нем. Так что под Винду DirectX пока все же удобнее.
                  0
                  При работе с Intel в Direct3D различных багов не меньше )
                    0
                    Однако RenderTarget в DirectX работает. Сравнивая ситуации: «не работает вообще» и «работает, но с багами» — вы что выберете? :)
                      0
                      Я выберу… nVidia или ATI )). В реальности придется остановится на «работает, но с багами». Кстати, писал когда-то в саппорт интела про баги в рендеринге, но никто даже отвечать не стал.
              0
              Если уж не серьезно так подойти к разработке игр/приложений на DirectX, то почему бы не использовать XNA?
              Отличный инструмент для всяких там инди. О боже, не дай бог набегут ненавистники дотнета и window-платформ.

              Серьезные ребята, которые делают не бюджетные игры, пишут все с нуля в неуправляемой среде с нативным кодом. Или покупают готовые решения — движки. А тот движок, который у вас — не привлечет никого, пока не будет хотя бы одной игры на этом движке. Во всяком случае — успехов вам.
                0
                Спасибо, проект пока находится в стадии разработки, поэтому о создании игр временно можно забыть)
                  0
                  На XNA есть очень серьезные прокты, чего только Terraria стоит. Это отличный перспектывный фреймворк (особенно учитывая относительную легкость портирования в XBox Live и на WP7), для инди самое оно, но основная беда XNA в том, что это фреймворк, а вот полноценных движков на XNA толком и нет. Даже платные весьма примитивны. Вот и получается что для быстрой разработки проще взять тот же Unity или Torque-2D/3D.
                    +1
                    Думаю, большинство разрабов просто не хотят писать движки поверх XNA, так как издержки на managed окружение и так значительны, а еще один слой абстракции выглядит не совсем уместным.
                      0
                      Все равно каждой команде приходится тратить кучу времени и писать свои тулзы, редакторы уровней, плагины для экспорта сцен и анимации из макса и т.д. И еще кучу рутинных вещей, которые есть в каждой игре.
                        0
                        Различных инструментов для XNA весьма много, а вот общий движок для инди-игр — не самое удобное решение, слишком уж они разные.
                      0
                      Ну или вообще стоит взять CryEngine 3, который недавно для некоммерческого использования стал бесплатным, а для коммерческого можно договориться, что 20% CryTek'у
                      www.crytek.com/news/crytek-releases-cryengine-3-sdk-free-of-charge
                        +1
                        это уже далеко не инди уровень…
                        0
                        Я понимаю, XNA не плох, я сам с ним работаю. Но такой фреймверк никогда не будет использоваться серьезными разработчиками.

                        Более того, движок написать самому с нуля на XNA не так уж и сложно, я сейчас говорю про 2D. (с 3D тоже особых сложностей возникнуть не должно)
                      0
                      По структуре напоминает HGE, а он с открытыми исходниками — так что автору движка имеет смысл подсмотреть, как в нем (в HGE, не в авторе) все устроено. Более того, можно подумать над созданием прослойки, которая будет предоставлять HGE-подобные функции, но дергать функционал этого движка. Тогда, в случае если этот движок будет по внутренностям превосходить HGE — можно получить часть аудитории.
                        +5
                        Скажите, зачем это на хабре? Вы ведь дальше крутящегося кубика врядли уйдете. Вы понимаете, сколько у вас впереди работы?
                          0
                          FPS = 1133? как и зачем?
                            +1
                            А что не так? Сцена отрисовывается 1133 раза в секунду
                              0
                              Сильно быстро :-) Лучше дать возможность ограничить верхний потолок FPS
                                0
                                у движка есть функция для ограничения FPS
                            –1
                            Что насчет XNA?
                              0
                              Rungine не будет использовать XNA, хотя бы, потому что придется переписывать движок заного
                                +1
                                А причем тут XNA вообще? Это надстройка над DirectX.
                                  0
                                  Мне кажется, что XNA сейчас более актуально, чем чистый DirectX. Т.к. писать на нем можно и под Win, и под Xbox, и под Silverlight и под Windows Phone. Ценность хорошего XNA движка выше.
                                  • UFO just landed and posted this here
                                      0
                                      Что значит, кому? Если я ничего не путаю, большая часть игрушек для xbox пишется на XNA-движках.
                                      • UFO just landed and posted this here
                                          0
                                          Ох, да, таки извиняюсь, попутал
                              • UFO just landed and posted this here
                                  0
                                  разработчик пока работает один и ему требуется команда, уже есть несколько людей заинтересованных в разработке. Проблема лишь в том, что все это делается на добровольных началах, т.к. денег еще никто не заработал :(
                                  • UFO just landed and posted this here
                                      0
                                      коммерческая, но для бесплатных проектов он будет бесплатным.
                                      • UFO just landed and posted this here
                                          0
                                          Я не знаю какие архитектурные решения будут правильными или неправильными, я не разработчик.

                                          «Ну и ещё автор слишком рано начал пиар своего движка. Твитер, фейсбук, вокнтакт, даже пост на главной странице на хабре.»

                                          Твиттер, фейсбук, контакт — его рук дело. Зато за хабр, он мне башку открутить обещал))

                                          А еще если ты такой умный и начинаешь ставить диагнозы, то предлагаю пообщаться с ним лично, думаю, вам будет о чем поговорить, тем более что работает он пока один ;)

                                Only users with full accounts can post comments. Log in, please.