IrrlichtСтатьи

Перевод Example 006 2D Graphics

Автор:

Очень полезный пример на самом деле. Показывает не только работу с 2д, но и массу побочных очень нужных и полезных вещей. Например, работу с цветом, принцип задания прозрачности. Цветового ключа. Да и вообще с помощью этого примера можно делать мощные графические меню в дополнение к 3д. А к тому же пример прост.

/** Example 006 2D Graphics(Пример 6 двумерная графика)

Этот туториал покажет, как делать 2d графику в Движке Иррлихт.
Здесь будет показано как рисовать картинки, основные спрайты с 
цветовым ключом, прозрачные прямоугольники, и различные 
шифты. Вы можете прочесть это пособие, если вам 
необходимо делать 2d игры на этом движке, или если 
вы хотите нарисовать классный интерфейс или 
отображать заголовки для ваших 3d игр.

Как всегда, Я извлекаю заголовки, включаю 
пространство имён irr, и присоединяю к проекту
 .lib файл движка.
*/
#include <irrlicht.h>
#include "driverChoice.h"

using namespace irr;

#ifdef _MSC_VER
#pragma comment(lib, "Irrlicht.lib")
#endif

/*
Сперва, мы позволим пользователю выбрать тип драйвера, 
затем запустим движок, установим заголовок, и получим 
ссылки на видео драйвер.
*/
int main()
{
  //спросить пользователя про драйвер
  video::E_DRIVER_TYPE driverType=driverChoiceConsole();
  if (driverType==video::EDT_COUNT)
    return 1;

  //создать устройство

  IrrlichtDevice *device = createDevice(driverType,
    core::dimension2d<u32>(512, 384));

  if (device == 0)
    return 1; //не удалось создать выбранный драйвер.

  device->setWindowCaption(L"Irrlicht Engine - 2D Graphics Demo");

  video::IVideoDriver* driver = device->getVideoDriver();

  /*
  Вся 2d графика в примере помещена в единственную текстуру,
  2ddemo.png. Так как мы хотим рисовать базовые спрайты с 
  цветовым ключом, нам необходимо загрузить эту текстуру и 
  указать движку, какая часть текстуры должна быть
  прозрачной(т.е. установить цветовой ключ).

  В этом примере, мы не говорим прямо какой цвет выбрать, мы просто 
  говорим  "Хей Движок Иррлихт, ты должен найти для нас цвет на 
  текстуре по координатам (0,0)". 
  Вместо этого, мы могли бы сделать так:
  driver->makeColorKeyTexture(images, video::SColor(0,0,0,0)), чтобы 
  сделать все чёрные(SColor(0,0,0,0)) пиксели прозрачными. 
  Пожалуйста обратите внимание, что ф-ция
  makeColorKeyTexture() просто создаёт alpha channel(альфа канал) 
  на основе выбранного цвета.
  */
  video::ITexture* images = driver->getTexture("../../media/2ddemo.png");
  driver->makeColorKeyTexture(images, core::position2d<s32>(0,0));

  /*
  Для того, чтобы нарисовать немного текста с двумя различными 
  шрифтами, мы сперва загрузим шрифт. Ok, мы просто загружаем 
  1 шрифт. 
  Как второй шрифт мы используем встроенный в движок по 
  умолчанию. Также, мы определяем два  прямоугольника, это 
  картинки с красными бесами (маленькими летающими 
  существами) в текстуре.
  */
  gui::IGUIFont* font = device->getGUIEnvironment()->getBuiltInFont();
  gui::IGUIFont* font2 =
    device->getGUIEnvironment()->getFont("../../media/fonthaettenschweiler.bmp");

  core::rect<s32> imp1(349,15,385,78);
  core::rect<s32> imp2(387,15,423,78);

  /*
  Подготовим красивую фильтрацию в режиме 2d рендеринга
  для особых случаев.
  */
  driver->getMaterial2D().TextureLayer[0].BilinearFilter=true;
  driver->getMaterial2D().AntiAliasing=video::EAAM_FULL_BASIC;

  /*
  Всё подготовлено, теперь мы можем рисовать всё в отрисовочном цикле,
  между ф-циями beginScene() и endScene(). В этом примере, мы просто
  делаем 2d графику, но если пожелаете смешать её с 3d  
  графикой - никаких проблем. Просто поробуйте это, и нарисуйте немного
  3d вершин или установить сцену посредством scene 
  manager(менеджера сцены) и отрисуйте всё.
  */
  while(device->run() && driver)
  {
    if (device->isWindowActive())
    {
      u32 time = device->getTimer()->getTime();

      driver->beginScene(true, true, video::SColor(255,120,102,136));

      /*
      Во-первых, мы рисуем 3 спрайта используя альфа-канал,
      созданный makeColorKeyTexture(). Последний параметр 
      уточняет, что отрисовочный метод должен использовать
      этот alpha channel(альфа канал). И предпоследний
      параметр указывает цвет, в который должны быть 
      окрашены спрайты.
      (255,255,255,255) это полностью белый(на самом деле
      белый+НЕПРОЗРАЧНЫЙ, прозрачность задаётся 1 
      параметром), так спрайт будет смотреться более 
      похожим на оригинал. Третий спрайт 
      рисуется с red channel(красным каналом) изменяясь в 
      зависимости от времени.
      */

      //Нарисовать огонь & фон драконьего мира
      driver->draw2DImage(images, core::position2d<s32>(50,50),
        core::rect<s32>(0,0,342,224), 0,
        video::SColor(255,255,255,255), true);

      //Нарисовать летающего беса
      driver->draw2DImage(images, core::position2d<s32>(164,125),
        (time/500 % 2) ? imp1 : imp2, 0,
        video::SColor(255,255,255,255), true);

      //Нарисовать второго летающего беса с цветовым циклом
      driver->draw2DImage(images, core::position2d<s32>(270,105),
        (time/500 % 2) ? imp1 : imp2, 0,
        video::SColor(255,(time) % 255,255,255), true);

      /*
      Рисовать текст на самом деле очень просто. Код должен быть 
      вполне понятен и без пояснений.
      */

      //нарисовать текст
      if (font)
        font->draw(L"This demo shows that Irrlicht is also capable of drawing 2D graphics.",
          core::rect<s32>(130,10,300,50),
          video::SColor(255,255,255,255));

      //нарисовать другой текст
      if (font2)
        font2->draw(L"Also mixing with 3d graphics is possible.",
          core::rect<s32>(130,20,300,60),
          video::SColor(255,time % 255,time % 255,255));

      /*
      Далее, мы рисуем логотип Движка Иррлихт(без
      использования цветового или альфа канала). Так 
      же мы слегка масштабируем картинки, мы используем
      подготовленный режим фильтров.
      */
      driver->enableMaterial2D();
      driver->draw2DImage(images, core::rect<s32>(10,10,108,48),
        core::rect<s32>(354,87,442,118));
      driver->enableMaterial2D(false);

      /*
      И наконец, рисуем полупрозрачный прямоугольник под курсором мыши.
      */
      core::position2d<s32> m = device->getCursorControl()->getPosition();
      driver->draw2DRectangle(video::SColor(100,255,255,255),
        core::rect<s32>(m.X-20, m.Y-20, m.X+20, m.Y+20));

      driver->endScene();
    }
  }

  device->drop();

  return 0;
}

/*
Вот и всё. Я надеюсь, что это не так уж сложно.
**/

20 августа 2010