《开源3D游戏引擎irrlicht(鬼火)Example讲解——Quake3Map.doc》由会员分享,可在线阅读,更多相关《开源3D游戏引擎irrlicht(鬼火)Example讲解——Quake3Map.doc(6页珍藏版)》请在金锄头文库上搜索。
1、开源3D游戏引擎Irrlicht(鬼火)Example讲解Quake3Map赵刚Irrlicht引擎自带的第2个Example叫做Quake3Map,她演示了利用irrlicht引擎载入Quake3场景文件(.pk3)的过程,程序运行起来如下图:运行02.Quake3Map.exe的时候会先出来一个控制台窗口,按a,再按回车即可,表示选择OpenGL作为渲染API。进入bin目录下的examples目录可以看到02.Quake3Map目录,双击Quake3Map_vc9.vcproj文件打开工程文件,工程文件中只有一个main.cpp文件。内容如下(去除了英文注释):#include #inc
2、lude using namespace irr;#ifdef _MSC_VER#pragma comment(lib, Irrlicht.lib)#endifint main()video:E_DRIVER_TYPE driverType;printf(Please select the driver you want for this example:n (a) OpenGL 1.5n (b) Direct3D 9.0cn (c) Direct3D 8.1n (d) Burnings Software Renderern (e) Software Renderern (f) NullDev
3、icen (otherKey) exitnn);char i;std:cin i;switch(i)case a: driverType = video:EDT_OPENGL; break;case b: driverType = video:EDT_DIRECT3D9;break;case c: driverType = video:EDT_DIRECT3D8;break;case d: driverType = video:EDT_BURNINGSVIDEO;break;case e: driverType = video:EDT_SOFTWARE; break;case f: drive
4、rType = video:EDT_NULL; break;default: return 1;IrrlichtDevice *device =createDevice(driverType, core:dimension2d(640, 480);if (device = 0)return 1;video:IVideoDriver* driver = device-getVideoDriver();scene:ISceneManager* smgr = device-getSceneManager();device-getFileSystem()-addZipFileArchive(././m
5、edia/map-20kdm2.pk3);scene:IAnimatedMesh* mesh = smgr-getMesh(20kdm2.bsp);scene:ISceneNode* node = 0;if (mesh)node = smgr-addOctreeSceneNode(mesh-getMesh(0), 0, -1, 1024);if (node)node-setPosition(core:vector3df(-1300,-144,-1249);smgr-addCameraSceneNodeFPS();device-getCursorControl()-setVisible(fals
6、e);int lastFPS = -1;while(device-run()if (device-isWindowActive()driver-beginScene(true, true, video:SColor(255,200,200,200);smgr-drawAll();driver-endScene();int fps = driver-getFPS();if (lastFPS != fps)core:stringw str = LIrrlicht Engine - Quake 3 Map example ;str += driver-getName();str += FPS:;st
7、r += fps;device-setWindowCaption(str.c_str();lastFPS = fps;elsedevice-yield();device-drop();return 0;程序很简洁,条理也很清晰,下面讲解一下代码。首先每个使用irrlicht的程序都必须包含:#include #pragma comment(lib, Irrlicht.lib)表示要使用irrlicht SDK由于irrlicht可以使用多种底层的绘图API(如Direct3D,OpenGL,Software),程序一开始时需要用户选择一个绘图API,video:E_DRIVER_TYPE dr
8、iverType;printf(Please select the driver you want for this example:n (a) OpenGL 1.5n (b) Direct3D 9.0cn (c) Direct3D 8.1n (d) Burnings Software Renderern (e) Software Renderern (f) NullDevicen (otherKey) exitnn);char i;std:cin i;switch(i)case a: driverType = video:EDT_OPENGL; break;case b: driverTyp
9、e = video:EDT_DIRECT3D9;break;case c: driverType = video:EDT_DIRECT3D8;break;case d: driverType = video:EDT_BURNINGSVIDEO;break;case e: driverType = video:EDT_SOFTWARE; break;case f: driverType = video:EDT_NULL; break;default: return 1;这里用字母“a”表示OpenGL,“b”表示Direct3D 9,“c”表示Direct3D 8,“d”表示Burnings S
10、oftware,“e”表示Software,“f”表示不绘图。一般选择“a”即可,用户选择的绘图API类型保存在变量 driverType里,driverType是irrlicht内部定义的一个叫E_DRIVER_TYPE枚举类型的对象,该枚举类型在video名字空间中。接下来根据用户的选择建立irrlicht设备对象:IrrlichtDevice *device =createDevice(driverType, core:dimension2d(640, 480);if (device = 0)return 1;当然如果设备对象建立失败那就没戏了,只有退出程序。video:IVideoDr
11、iver* driver = device-getVideoDriver();scene:ISceneManager* smgr = device-getSceneManager();device-getFileSystem()-addZipFileArchive(././media/map-20kdm2.pk3);上面这前两行只是将设备对象中的视频驱动对象(绘图API)对象和场景管理对象保存在临时对象中以备后用。第三行表示将一个名为map-20kdm2.pk3 的文件加载到irrlicht文件系统中,这个文件是一个压缩文件,irrlicht引擎自己可以处理压缩文件。scene:IAnimat
12、edMesh* mesh = smgr-getMesh(20kdm2.bsp);这行程序表示从20kdm2.bsp文件中建立一个带动画的网格对象,20kdm2.bsp这个文件首先会在当前磁盘目录下查找,如果没有找到就会在irrlicht的文件系统中查找,前面已经往irrlicht的文件系统中加载了一个map-20kdm2.pk3文件,irrlicht会自动解压这个压缩文件,查找里面是否有一个名为20kdm2.bsp的文件,有则加载,没有则宣告加载失败。scene:ISceneNode* node = 0;if (mesh)node = smgr-addOctreeSceneNode(mesh-
13、getMesh(0), 0, -1, 1024);if (node)node-setPosition(core:vector3df(-1300,-144,-1249);这几行程序表示从网格对象中建立一个场景节点并加入场景管理器中,网格对象只有加入场景管理器才能被irrlicht绘制,否则只是保存在内存中。这里程序选择将场景节点按照八叉树分割管理,每个八叉树节点的多边形数量不少于1024个,节点的被置于位置(-1300,-144,-1249)中。smgr-addCameraSceneNodeFPS();device-getCursorControl()-setVisible(false);第一行告诉irrlicht的场景管理器,场景中需要一个FPS(第一人称射击)类型的摄像机。第二行告诉irrlicht,鼠标的光标没有必要显示出来。while(device-run()if (device-isWindowActive()driver-beginScene(true, true, video:SColor(255,200,200,200);smgr-drawAll();driver-endScene();int fps = driver-getFPS();if (lastFPS != fps)