Irrlicht学习备忘录——15 LoadIrrFile

15 LoadIrrFile

    官方代码($sdk)\examples\15.LoadIrrFile


    这个例子是从.irr文件读取一个完整的场景。早起版本的sdk里的这个例子很简单,就是使用下场景管理器里的loadScene把.irr文件载入就完事了。网上我看到几篇相关的文章,都说这例子有点脑残,其实不然。做一个游戏,将每一关的场景都写到代码里去,这方法不是不行,但实在有些糟糕,稍微有一小点改动,都需要去修改代码,而且想让非程序员去完成这事,就成非常困难的事了。个人觉着,最好的办法应该还是将游戏的场景、关卡等设置从代码里分离出来,程序通过加载这些相关文件比较好。有让非程序员修改的要求时,还能做个简易的编辑器进行修改。
    从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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值