Irrlicht学习笔记(6)--2DGraphics

1说明

这个例子介绍了用Irrlicht引擎绘制2D图形.
包括:
绘制图片,
基于精灵的关键色,
不同字体,
透明矩形

适用于:用Irrlicht引擎制作2D游戏,或者为3D游戏绘制个性的界面

2绘制纹理

2.1载入纹理

通过video::IVideoDriver类的方法getTexture()获得ITexture*对象的指针.
可载入格式:BMP,JPG,TGA,PCX,PNG,PSD

2.2设置关键色

(IVideoDriver类的方法)
void makeColorKeyTexture(video::ITExture* texture,
video::SColor color,//也可以是某个位置的颜色core::position2d<s32> colorKeyPixelPos
bool zeroTexels =false);

2.3绘制纹理

virtual void draw2DImage(
     const video::ITexture* texture, //要绘制的 纹理
    const core::position2d<s32>& destPos,//目标位置
     const core::rect<s32>& sourceRect,//在原图片中的相对位置
      const core::rect<s32>* clipRect =0,//屏幕上的一个裁剪矩形,NULL不裁剪
    SColor color=SColor(255,255,255,255), //绘制 纹理 的颜色通道设置,argb
    bool useAlphaChannelOfTexture=false//是否开启透明颜色
) =0;



3字体

3.1获得引擎内置的字体


3.1.1由guie管理

gui::IGUIFont* font = device->getGUIEnvironment()->getBuiltInFont();

3.1.2外部字体载入

gui::IGUIFont* font2 = guie->getFont("../media/fonthaettenschweiler.bmp");


3.2使用字体写字

使用到接口irr::IGUIFont的方法
virtual void draw(
const core::stringw& text, //文字内容
const core::rect<s32>& position,//位置范围
video::SColor color, //字体颜色
bool hcenter=false,//矩形内横向书写?
 bool vcenter=false,//纵向
const core::rect<s32>* clip=0//裁剪矩形
) = 0;
比如:
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)
);


4透明矩形

要求:透明矩形跟随鼠标移动.
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)
);

5完整代码

#include <iostream>
#include <irrlicht.h>

using namespace irr;


#ifdef _IRR_WINDOWS_
#pragma comment(lib, "irrlicht.lib")
//#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#endif

int main(int argc, char** argv)
{
	IrrlichtDevice *device =
		createDevice(video::EDT_OPENGL, core::dimension2d<u32>(512, 384), 16,
		false, true, false, 0);
	if (!device)
		return 1;
	device->setWindowCaption(L"2D Graphic");

	video::IVideoDriver *driver = device->getVideoDriver();
//	scene::ISceneManager *smgr = device->getSceneManager();
//	gui::IGUIEnvironment *guiev = device->getGUIEnvironment();

	//这张图片包括了这个例子要用到的图形,一个地图,一个生物的两个动作
	video::ITexture *images = driver->getTexture("../media/2ddemo.png");;
	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);

	//参数设置
	driver->getMaterial2D().TextureLayer[0].BilinearFilter = true;//默认true
	driver->getMaterial2D().AntiAliasing = video::EAAM_FULL_BASIC;

	//smgr->addCameraSceneNode(0, core::vector3df(0, 30, -40), core::vector3df(0, 5, 0));

	int lastFPS = -1;
	while (device->run())
	{
		if (device->isWindowActive())
		{
			u32 time = device->getTimer()->getTime();
			driver->beginScene(true, true, video::SColor(255, 100, 101, 140));

			//	smgr->drawAll();
			//	guiev->drawAll();


			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 posible.",
				core::rect<s32>(130, 20, 300, 60),
				video::SColor(55, time%255, time % 255, 255));

			driver->enableMaterial2D(false);

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

			int fps = driver->getFPS();
			if (lastFPS != fps)
			{
				core::stringw str = L"Campfire FX example [";
				str += driver->getName();
				str += "]FPS.",
					str += fps;
				device->setWindowCaption(str.c_str());
				lastFPS = fps;
			}
		}
	}
	device->drop();

	return 0;
}


你可能感兴趣的:(Irrlicht)