设置好IDE后,编译器就会知道引擎头文件的位置,我们可以在代码中包含这个头文件了。
IrrLicht引擎的所有东西都包含在命名空间“irr”中.如果你想使用这个引擎的类,你必须在类名前加上“irr::”。例如要使用IrrlichtDevice, 应该写: irr::IrrlichtDevice. 想不加前缀,可以在代码的开始处添加如下代码.
有5个子命名空间在IrrLicht引擎,你可以查阅具体的说明在下以链接: 'Namespace List'.好像irr命名空间一样,你可能在代码的开始处加如下代码:
using namespace core; using namespace scene; using namespace video; using namespace io; using namespace gui;
|
我们要链接IrrLicht.lib才可以使用IrrLicht.dll。可以在项目中设置,但为了简单也可如下设置:
#pragma comment(lib, "Irrlicht.lib")
|
我们可以在任何平台中使用main函数作为程序的入口。而在Windows平台中,还可以使用WinMain函数,这样就可以不弹出控制台窗口。但在这里,为了使例子简单,我们使用main作为程序的入口:
'createDevice' 函数作为引擎最重要的函数。用这个函数创建IrrLicht设备作为根对象(root object)来控制引擎。 createDevice()有7个参数:
- deviceType: 设备类型。可以设置的类型有Null device, the Software device, Direct3D8, Direct3D9, or OpenGL. 在这里我们使用 EDT_SOFTWARE,当然还能使用以下的值EDT_NULL, EDT_DIRECT3D8, EDT_DIRECT3D9, or EDT_OPENGL(具体请查阅枚举E_DRIVER_TYPE的定义).
- windowSize: 设定窗口的大小, 这里设为512x384(具体请查阅模板dimension2d的定义).
- bits: 设定像素为16位或32位,这个参数在窗口模式时无效
- fullscreen: 指定程序是否为全屏模式.
- stencilbuffer: 指定是否使用模板缓存画阴影.
- vsync: 指定是否使用垂直同步,只在全屏模式中有效.
- eventReceiver: 一个接收事件的对象,在这里我们不使用,设为0.
IrrlichtDevice *device = createDevice(EDT_SOFTWARE, dimension2d<s32>(512, 384), 16, false, false, false, 0);
|
设置窗口的标题。留意在字符串前的L。IrrLicht引擎使用宽字符显示文本。
device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo");
|
获取视频驱动(video driver), 场景管理器(SceneManager),界面环境(graphical user interface environment)的指针,则不必经常调用device->getVideoDriver(), device->getSceneManager(), 和 device->getGUIEnvironment().
IVideoDriver* driver = device->getVideoDriver(); ISceneManager* smgr = device->getSceneManager(); IGUIEnvironment* guienv = device->getGUIEnvironment();
|
我们使用界面环境(GUI environment)在窗口中添加一个静态文本.这个文本被放在左上角坐标为(10,10)右下角坐标为(200,22)的位置.
guienv->addStaticText(L"Hello World! This is the Irrlicht Software engine!", rect<int>(10,10,200,22), true);
|
使显示有趣,我们加载并显示一个QUAKE2的模型。我们只需使用场景管理器(Scene Manager)的 getMesh()获取一个网格(mesh)和并用addAnimatedMeshSceneNode() 函数添加场景节点(SceneNode)的去显示这个网格. getMesh()函数还支持的模型格式有Maya(*.obj),Quake3(*.bsp),Milshape(*.ms3d)。顺带提一下,这个例子中如此COOL的模式名叫“sydney“是由Brian Collins制作的。
IAnimatedMesh* mesh = smgr->getMesh("../../media/sydney.md2"); IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode( mesh );
|
为了良好观察网格,我们对材质作了如下更改:我们取消灯光,因为在这里没有动态光,网格将会完全黑色。然后我们设置帧循环,在这里设置动画的帧循环为0-310。最后,设置那网格的纹理。如果没有纹理,网格将会只有一种颜色。
if (node) { node->setMaterialFlag(EMF_LIGHTING, false); node->setFrameLoop(0, 310); node->setMaterialTexture( 0, driver->getTexture("../../media/sydney.bmp") ); }
|
要观察到这个网格,我们在坐标(0,30,-40)的地方向(0,5,0)放置一个摄像机。
smgr->addCameraSceneNode(0, vector3df(0,30,-40), vector3df(0,5,0));
|
我们已经设置好场景了,用如下的方法绘制每一件物体: 在while循环中运行设备直到关闭窗口或按ALT+F4。
每一件物体都在beginScene()和endScene()函数之间绘制。BeginScene用于设置一个颜色清理屏幕和设置深度缓存。然后我们绘制场景管理器和界面环境的内容。调用endScene把全部物体都显示在屏幕上
driver->beginScene(true, true, SColor(255,100,101,140));
smgr->drawAll();
guienv->drawAll();
driver->endScene();
}
|
在最后,我们必须删除之前使用createDevice()函数创建的设备。在IrrLicht引擎中,任何使用含有create的函数或方法创建的对象,都要调用->drop()函数删除。可查看 documentation 获得更详细的信息.
device->drop(); return 0;
}
|
就这样试试编译和运行一下。
|