15 LoadIrrFile
官方代码($sdk)\examples\15.LoadIrrFile
从1.1版本开始,Irr引擎就支持使用.irr文件来读取和保存一个完整的场景。实际上,这个irr文件就是一个xml格式的配置文件,可以通过记事本打开它。Irr也有一个更好的专门的编辑器CopperCube(官方网站是http://www.ambiera.com/),最早叫IrrEdit,目前功能已经很强烈,可以用它做游戏,并生成各种平台运行的版本,不过是要收费的。这个编辑器里有场景编辑器和还有粒子编辑器的功能。这里就不再宣传CopperCube了,接下来看看irr载入场景文件的例子。
#include <irrlicht.h>
#include "driverChoice.h"
using namespace irr;
int main(int argc, char** argv)
{
// 询问用户使用什么驱动
video::E_DRIVER_TYPE driverType=driverChoiceConsole();
if (driverType==video::EDT_COUNT)
return 1;
//创建irr设备
IrrlichtDevice* device =
createDevice(driverType, core::dimension2d<u32>(640, 480));
// 不能创建相应驱动的irr设备则退出
if (device == 0)
return 1;
//设置irr窗口的标题
device->setWindowCaption(L"Load .irr file example");
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
/*现在读取一个.irr文件。irr文件能够存储整个场景的材质,纹理,粒子系统等信息。同时也可以存储场景中的所有场景接点和用户数据。为了使例子简单些,这个例子中简单的读取一下场景。想获取更多信息的话,可以看文档中关于ISceneManager::loadScene和ISceneManager::saveScene的说明。这里仅读取显示一个场景,所以仅需要使用loadScene()函数。 */
//载入场景 argv[1]是命令行启动例子时加的第一个参数。这例子里将它作为手动设置.irr文件的参数,如果没有设置该参数,就是使用默认.irr文件。
if (argc>1)
smgr->loadScene(argv[1]);
else
smgr->loadScene("../../media/example.irr");
//就这么简单,一个loadScene加上文件名就完成了!接下来仅需要再增加一个摄象机,绘制场景就行了
scene::ICameraSceneNode * camera = smgr->addCameraSceneNodeFPS(0, 50.f, 0.1f);
//创建一个Meta三角形选择器来保存几个三角形选择器
scene::IMetaTriangleSelector * meta = smgr->createMetaTriangleSelector();
/*现在,我们查找场景中的所有节点,选择所有合适的节点,并建立三角形选择器。通常情况下,一个明智的办法是通过一个节点的名称或编号信息来设置碰撞检测的节点。*/
//创建一个场景节点数组nodes
core::array<scene::ISceneNode *> nodes;
//获取所有场景节点
smgr->getSceneNodesFromType(scene::ESNT_ANY, nodes);
//遍历nodes中的所有节点,查找需要设置碰撞检测的节点
for (u32 i=0; i < nodes.size(); ++i)
{
scene::ISceneNode * node = nodes[i];
scene::ITriangleSelector * selector = 0;
//筛选节点类型
switch(node->getType())
{
//立方体节点
case scene::ESNT_CUBE:
//动画场景节点
case scene::ESNT_ANIMATED_MESH:
//三角形选择器不能作用在动画网格上,动画网格只能使用摄像机射线来进行碰撞检测,这里就是用最小包围盒进行替代,创建相应的三角形选择器。
selector = smgr->createTriangleSelectorFromBoundingBox(node);
break;
//网格节点
case scene::ESNT_MESH:
//圆环节点
case scene::ESNT_SPHERE:
// 从网格场景节点导出网格创建三角形选择器
selector = smgr->createTriangleSelector(((scene::IMeshSceneNode*)node)->getMesh(), node);
break;
//地形节点
case scene::ESNT_TERRAIN:
selector = smgr->createTerrainTriangleSelector((scen