/*
这个例子告诉我们如何用鬼火引擎绘制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;
}