Irrlicht学习备忘录——6 2DGraphics

本文档是关于Irrlicht 3D引擎在2D图形方面的应用,介绍了如何绘制2D图片、处理透明效果,以及绘制文字。通过示例代码展示了如何使用irrlicht进行2D游戏界面的制作,包括精灵的移动和颜色变化,以及内置和外部字体的使用。尽管Irrlicht主要用于3D,但其2D功能在创建3D游戏界面或简单的2D应用时仍有一定价值。
摘要由CSDN通过智能技术生成

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");

绘制时使用的是IGUIFontdraw方法。

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游戏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值