这个例子告诉我们使用Irr引擎中的2D图形。

/*
这个例子告诉我们使用Irr引擎中的2D图形。
如何去绘制2D图片,闪色精灵以及不同的字体。
如果你想使用Irr引擎做一个2D游戏的话,或者你想为自己的3D游戏
绘制一个很酷的界面的时候,你会发现本例子很有用。

按照往常,我们先包含头文件,使用命名空间,链接Lib库。
*/
#include <irrlicht.h>
#include <iostream>

using namespace irr;

#pragma comment(lib, "Irrlicht.lib")


int main()
{
// 我们让用户选择设备类型

video::E_DRIVER_TYPE driverType;

printf("Please select the driver you want for this example:\n"\
   " (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\
   " (d) Software Renderer\n (e) Burning's Software Renderer\n"\
   " (f) NullDevice\n (otherKey) exit\n\n");
  
char i;
std::cin >> i;

switch(i)
{
   case 'a': driverType = video::EDT_DIRECT3D9;break;
   case 'b': driverType = video::EDT_DIRECT3D8;break;
   case 'c': driverType = video::EDT_OPENGL;   break;
   case 'd': driverType = video::EDT_SOFTWARE; break;
   case 'e': driverType = video::EDT_BURNINGSVIDEO;break;
   case 'f': driverType = video::EDT_NULL;     break;
   default: return 0;
}

// 创建Irr设备

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

if (device == 0)
   return 1;

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

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

/*
本例子中的所有的2D图形都是整理在一个叫2ddemo.bmp图形素材里面的。
因为我们想绘制一个变色的精灵,我们需要先把素材读入内存,然后告诉引擎,
我们想对该素材中的一部分进行变色处理。
我们在例子中,并没有直接告诉引擎图形素材的背景色是什么颜色,而是告诉
引擎,让它自己去图形素材的0,0点去找那个颜色,而那种颜色就是背景色,予以处理。
当然,你也可以自己指定背景色。这样写
driver->makeColorKeyTexture(images, video::SColor(0,0,0,0))
这样的话,引擎就会把图形的黑色的点全部设置为透明(以黑色为背景色抠除了)
makeColorKeyTexture()这个函数,实际上就是指定图形的背景色,予以透明处理。
*/
video::ITexture* images = driver->getTexture("../../media/2ddemo.bmp");
driver->makeColorKeyTexture(images, core::position2d<s32>(0,0));


/*
我们想绘制两种不同风格的字体,所以我们先将这两种字体都读取进来,其中,
第一种字体是引擎的内置字体。第二种是我们从外部字体库读取的。
同样,我们定义了两个矩形,这两个矩形指定了纹理图片中两个小精灵的位置。
(译者注:实际上这俩矩形坐标就是指明了图片中的那俩个带小怪物动作的方块位置)
*/
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);


/*
所有先前事情准备好了,现在我们开始在渲染循环中开始绘制所有的一切。
在beginScene和endScene中调用这些绘制工作,使他们在每桢中绘制显示。
本例中,我们仅进行2D图形渲染,但是同时也是允许进行3D图形渲染的,我们
在本例中不再做演示了。你若想实验一下的话,就绘制一些3D图形或者
设置一个场景管理器读取一个场景节点素材进行绘制吧。
*/
while(device->run() && driver)
{
   if (device->isWindowActive())
   {
    u32 time = device->getTimer()->getTime();

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

    /*
    首先,我们绘制3个精灵,我们已经使用makeColorKeyTexture()函数进行透明
    背景的设置。
    现在开始2D图形的绘制,draw2DImage函数的最后一个参数是是否打开Alpha通道混合.
    因为我们的第三张图需要实现变色,所以我们打开了该功能。
    (实际上前两个背景和精灵的绘制时可以关闭该选项,和白色的混合是无意义的)
    倒数第二个参数定义了精灵的混合颜色。(该颜色会与精灵在图片中的颜色进行混合)
    所以我们现在可以实现颜色变换的功能了,只到将倒数第二个参数设置为
    随时间改变,我们就获得了变色的精灵。
    */

    // 绘制背景
    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));

    /*
    最后,我们绘制一个Irrlicht引擎的logo,并且在鼠标指针图标上绘制了一个半透明2D矩形。
    */

    // draw logo
    driver->draw2DImage(images, core::position2d<s32>(10,10),
     core::rect<s32>(354,87,442,118));

    // draw transparent rect under cursor
    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;
}