Runner Engine (сокращенно Rungine) — это новый 2D/3D движок для создания игр и мультимедийных приложений. Он обладает гибким набором инструментов, которые способны помочь разработчику увеличить скорость разработки, но они пока находятся в доработке. В состав движка входят: Core (ядро с собственным набором утилит), GUI, Graphic2D. В данный момент Runner Engine поддерживает только DirectX9. Идет работа над поддержкой OpenGL. В дальнейшем планируется продолжить работу над поддержкой DirectX10 и DirectX11.
Поддерживаемая платформа: Windows
В данный момент движок находится в разработке. Если кому-то будет очень интересно посмотреть на этот движок в работе, возможно создание промежуточной демо-версии, для этого надо только сообщить.
Инициализация:
Первым шагом необходимо подключить dll движка:
Объявляем девайс:
Весь рабочий цикл осуществляется следующим образом:
Все. Инициализацией мы разобрались. Теперь можно вывести на экран картинку или нарисовать изображение.
Hello, Runner
Hello, Runner — это первый пример из Rungine SDK. Он показывает, как инициализировать Rungine и нарисовать простейшее изображение.
Исходный код с описанием:
Запущенный пример выглядит следующим образом:

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

Поддерживаемая платформа: 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();
Запущенный пример выглядит следующим образом:

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;
}
}
Запущенный пример выглядит следующим образом:
