【Irrlicht Engine笔记】test6-2D

/*
    这个例子告诉我们如何用鬼火引擎绘制2d图形。
    它告诉我们如何绘制图片,闪色精灵以及不同的字体。
    你将发现如果你希望用引擎制作2d游戏,这是很有用的,
    或者你希望绘制很酷的界面或标题。

 

    当然,我们要包含头文件,使用irr命名空间,
    告诉连接器链接到.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;
    }

    // create device

    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只创建基于颜色的alfha通道。
*/
    video::ITexture* images = driver->getTexture("http://www.cnblogs.com/media/2ddemo.bmp");
    driver->makeColorKeyTexture(images, core::position2d<s32>(0,0));
    //driver->makeColorKeyTexture(images, video::SColor(0,0,0,0))//-------------不能用!why?
/*
    为每个颜色位创建一位alpha通道。
    可以通过useAlphachannel=true让材质的边缘透明,来绘制一些2d图形。
    参数解释:
        1 材质:要用到alpha通道的材质。
        2 颜色位位置:没像素颜色键的位置。每像素颜色都可以透明化。
*/

   
/*
    为了可以使用两种字体绘制出一些文本,我们需要载入他们。
    好了,我们载入一种,第一种字体我们只是在引擎失效的时候使用他。
    我们定义两个矩形,用于定义img放置的位置。
*/
    gui::IGUIFont* font = device->getGUIEnvironment()->getBuiltInFont();//纯虚函数,设置内置字体,既失效时的字体。
    gui::IGUIFont* font2 = device->getGUIEnvironment()->getFont("http://www.cnblogs.com/media/fonthaettenschweiler.bmp");
    /*
        返回特殊文件类型的字体文件指针。
        之前未载入则载入,失败返回0。
    */

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


/*
    万事俱备,现在我们开始在绘制循环中绘制所有东西,
    在begin和end之间调用。
    在这个例子中我们只需要绘制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来创建alpha通道。
                最后一个参数指定绘制函数应该打开alpha通道混合。
                之前的参数指定精灵要染成什么颜色。
                (255,255,255,255)是纯白,和白色混合看起来不会有什么变化。
                第三个精灵根据时间来染色。
            */
   
            // 绘制背景城堡和第一个精灵
            driver->draw2DImage(images, core::position2d<s32>(50,50),
                core::rect<s32>(0,0,342,224), 0,
                video::SColor(255,255,255,255), true);
            /*
                在矩形中绘制部分材质。
                参数介绍:
                    1 材质:要绘制的材质。
                    2 矩形位置:要绘制的矩形区域。
                    3 修改:要修改的目标矩形。(默认为0)
                    4 颜色:用于表示修改矩形的四色数组。(默认为0)
                    5 alpha通道:如果为true则alpha通道开启。(默认为false)
            */

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

            /*
                最后,我们绘制一个鬼火引擎的logo(不用颜色或者alpha通道)和一个2d透明矩形在光标下方。
            */

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

            //在光标下方绘制透明矩形区域
            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;
}

posted @ 2010-07-08 14:02  团扇鸭  阅读(725)  评论(0编辑  收藏  举报