6 2DGraphics
官方代码($sdk)\examples\06.2DGraphics
这个例子教如何去绘制2D图片,闪色小怪物以及不同的字体。官方文档里写着如果你想使用irr引擎做一个2D游戏的话,或者你想为自己的3D游戏绘制一个很酷的界面的时候,你会发现本例子很有用。晕了,irr本身就是3D引擎,3D来干2D干的事,完全就是浪费,而且画质,效率未必有2D引擎的好,甚至还不如直接GDI的好,这怎么会适合做2D游戏啊。为自己的3D游戏绘制一个很酷的界面,这点虽然有点夸大,不过的确可以增彩不少,例如画个血条上去,弄个漂亮的分数,出几个文字提示。不废话了,下面看看例子里的重点部分。
例子中的所有的2D图形都是整理在2ddemo.bmp图形素材里。bmp格式的图片文件只保存了RGB三个颜色通道,因此图片上没有透明像素。在绘制素材里的角色时,肯定不会希望把背景色一起绘制到窗口上,这就需要先把背景色扣掉,再来绘制。不把背景色扣掉,不管绘制上去的是什么,它都是在一个带背景色的方框里,看上去会很恶心的。irr首先通过引擎的图形驱动把素材载入成irr纹理,代码为ITexture*images =driver->getTexture("../../media/2ddemo.png");然后再告诉引擎让它自己去图形素材的(0,0)点去找那个颜色,而那种颜色就是背景色,予以透明处理,代码为driver->makeColorKeyTexture(images,core::position2d<s32>(0,0))。要自己指定背景色,不通过素材的像素点位置也可以,只需这样写driver->makeColorKeyTexture(images,video::SColor(0,0,0,0))。
代码中的core::rect<s32>imp1(349,15,385,78)和core::rect<s32>imp2(387,15,423,78)是设置两个矩形区域,这个区域的位置就是纹理图片中两个小怪物的位置。
绘制2D图片的准备工作做好了,在哪里写具体的绘制代码呢?当然是在每个例子里都见得到的循环里,在循环里的beginScene之后,endScene之前。这样写每一帧都会把2D图片绘制出来。下面看具体的绘图代码怎样写的。
绘制场景
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);
draw2DImage的第一个参数是绘制时使用的纹理,第二个是绘制的开始位置,第三个是绘制纹理的区域,第四个是混合颜色,最后一个是是否打开Alpha通道混合。
绘制文字稍微有些不同,首先要准备好字体。例子用使用了两种字体,第一种字体是引擎的内置字体。第二种是从外部字体库读取的。方法在GUI的例子里已经出现过。
获取内置字体
IGUIFont*font = device->getGUIEnvironment()->getBuiltInFont();
获取外部字体库
IGUIFont*font2=device->getGUIEnvironment()->getFont("../../media/fonthaettenschweiler.bmp");
绘制时使用的是IGUIFont的draw方法。
font->draw(L"Thisdemo shows that Irrlicht is also capable of drawing 2Dgraphics.",core::rect<s32>(130,10,300,50),video::SColor(255,255,255,255));
font2->draw(L"Alsomixing with 3d graphics ispossible.",core::rect<s32>(130,20,300,60),video::SColor(255,time% 255,time % 255,255));
第一个参数是绘制的文本内容,第二个参数是绘制的区域,第三个参数是使用的颜色。
例子里的内容很简单,没什么太复杂的。使用时要放到程序的帧循环代码部分,这样使用并不方便。实际使用时,更多的应该是出现在自己对GUI的扩展中。在GUI元素的绘图函数内使用,就不需要在到帧循环里写,而且使用和管理更简单方便。irr没有专门为2D场景设计相应的场景节点和场景管理器;以纹理的方式载入素材,这样素材的大小会受限制;2D游戏里,背景固定的时候比较多,图形变换的区域一般不大,在帧循环里不断的对整个图进行更新,效率也不高。因此我觉着irr不适合做2D游戏。