您好,欢迎访问三七文档
开源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文件。内容如下(去除了英文注释):#includeirrlicht.h#includeiostreamusingnamespaceirr;#ifdef_MSC_VER#pragmacomment(lib,Irrlicht.lib)#endifintmain(){video::E_DRIVER_TYPEdriverType;printf(Pleaseselectthedriveryouwantforthisexample:\n\(a)OpenGL1.5\n(b)Direct3D9.0c\n(c)Direct3D8.1\n\(d)Burning'sSoftwareRenderer\n(e)SoftwareRenderer\n\(f)NullDevice\n(otherKey)exit\n\n);chari;std::cini;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':driverType=video::EDT_NULL;break;default:return1;}IrrlichtDevice*device=createDevice(driverType,core::dimension2du32(640,480));if(device==0)return1;video::IVideoDriver*driver=device-getVideoDriver();scene::ISceneManager*smgr=device-getSceneManager();device-getFileSystem()-addZipFileArchive(../../media/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(false);intlastFPS=-1;while(device-run()){if(device-isWindowActive()){driver-beginScene(true,true,video::SColor(255,200,200,200));smgr-drawAll();driver-endScene();intfps=driver-getFPS();if(lastFPS!=fps){core::stringwstr=LIrrlichtEngine-Quake3Mapexample[;str+=driver-getName();str+=]FPS:;str+=fps;device-setWindowCaption(str.c_str());lastFPS=fps;}}elsedevice-yield();}device-drop();return0;}程序很简洁,条理也很清晰,下面讲解一下代码。首先每个使用irrlicht的程序都必须包含:#includeirrlicht.h#pragmacomment(lib,Irrlicht.lib)表示要使用irrlichtSDK由于irrlicht可以使用多种底层的绘图API(如Direct3D,OpenGL,Software),程序一开始时需要用户选择一个绘图API,video::E_DRIVER_TYPEdriverType;printf(Pleaseselectthedriveryouwantforthisexample:\n\(a)OpenGL1.5\n(b)Direct3D9.0c\n(c)Direct3D8.1\n\(d)Burning'sSoftwareRenderer\n(e)SoftwareRenderer\n\(f)NullDevice\n(otherKey)exit\n\n);chari;std::cini;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':driverType=video::EDT_NULL;break;default:return1;}这里用字母“a”表示OpenGL,“b”表示Direct3D9,“c”表示Direct3D8,“d”表示Burning’sSoftware,“e”表示Software,“f”表示不绘图。一般选择“a”即可,用户选择的绘图API类型保存在变量driverType里,driverType是irrlicht内部定义的一个叫E_DRIVER_TYPE枚举类型的对象,该枚举类型在video名字空间中。接下来根据用户的选择建立irrlicht设备对象:IrrlichtDevice*device=createDevice(driverType,core::dimension2du32(640,480));if(device==0)return1;当然如果设备对象建立失败那就没戏了,只有退出程序。video::IVideoDriver*driver=device-getVideoDriver();scene::ISceneManager*smgr=device-getSceneManager();device-getFileSystem()-addZipFileArchive(../../media/map-20kdm2.pk3);上面这前两行只是将设备对象中的视频驱动对象(绘图API)对象和场景管理对象保存在临时对象中以备后用。第三行表示将一个名为map-20kdm2.pk3的文件加载到irrlicht文件系统中,这个文件是一个压缩文件,irrlicht引擎自己可以处理压缩文件。scene::IAnimatedMesh*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-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();intfps=driver-getFPS();if(lastFPS!=fps){core::stringwstr=LIrrlichtEngine-Quake3Mapexample[;str+=driver-getName();str+=]FPS:;str+=fps;device-setWindowCaption(str.c_str());lastFPS=fps;}}elsedevice-yield();}接下来这些代码就是开始无休无止的渲染循环,直到用户退出程序。device-isWindowActive()这一行可以判断窗口是否在前端,如果窗口不在前端,而是被其他窗口遮盖了,那就不用渲染了,省点电力也好。渲染过程还将FPS显示到了窗口的标题栏上。用户觉得没什么新鲜感了,关闭程序后执行:device-drop();return0;释放设备对象,返回系统即可。Quake3Map程序就讲到这里好了。
本文标题:开源3D游戏引擎irrlicht(鬼火)Example讲解——Quake3Map
链接地址:https://www.777doc.com/doc-4558868 .html