要获得档案文件的文件列表,只要获得Archive的指针,就可以调用list()函数获得文件列表

但是如何获得Archive的指针呢,先看看资源的载入过程:

先从resources.cfg文件获取资源的路径,资源组,资源文件类型,这3个数据:

ConfigFile cf;
 cf.load("resources.cfg");

再把这3个数据传入资源定位的函数:

ResourceGroupManager::getSingleton().addResourceLocation(archName, typeName, secName);

资源定位到底做了什么,看看源码:

void ResourceGroupManager::addResourceLocation(const String& name, const String& locType, const String& resGroup, bool recursive) { ResourceGroup* grp = getResourceGroup(resGroup); if (!grp) { createResourceGroup(resGroup); grp = getResourceGroup(resGroup); } OGRE_LOCK_MUTEX(grp->OGRE_AUTO_MUTEX_NAME) // lock group mutex // Get archive Archive* pArch = ArchiveManager::getSingleton().load( name, locType ); // Add to location list ResourceLocation* loc = new ResourceLocation(); loc->archive = pArch; loc->recursive = recursive; grp->locationList.push_back(loc); // Index resources StringVectorPtr vec = pArch->find("*", recursive); for( StringVector::iterator it = vec->begin(); it != vec->end(); ++it ) { // Index under full name, case sensitive grp->resourceIndexCaseSensitive[(*it)] = pArch; if (!pArch->isCaseSensitive()) { // Index under lower case name too for case insensitive match String indexName = (*it); StringUtil::toLowerCase(indexName); grp->resourceIndexCaseInsensitive[indexName] = pArch; } } StringUtil::StrStreamType msg; msg << "Added resource location '" << name << "' of type '" << locType << "' to resource group '" << resGroup << "'"; if (recursive) msg << " with recursive option"; LogManager::getSingleton().logMessage(msg.str()); }

我们可以看到

// Get archive
        Archive* pArch = ArchiveManager::getSingleton().load( name, locType );

这里,载入档案的时候就返回了档案的指针,这就是我们需要的,接下来他把这个指针传到了2个地方

// Add to location list
  ResourceLocation* loc = new ResourceLocation();
  loc->archive = pArch;  // 这里传入一次

// Index under full name, case sensitive
            grp->resourceIndexCaseSensitive[(*it)] = pArch;  // 这里再传入一次

理论上我们可以从这2个数据结构中获取指针,但是不幸的是,这些都是protected成员,获取不了的

而这个类又没有提供相关的获取函数,怎么办呢?难道又要改OGRE源码么?

看看前面的这个函数

// Get archive
        Archive* pArch = ArchiveManager::getSingleton().load( name, locType );

如果已经载入了一次,我们再载入一次,会发现什么情况

Archive* ArchiveManager::load( const String& filename, const String& archiveType) { ArchiveMap::iterator i = mArchives.find(filename); Archive* pArch = 0; if (i == mArchives.end()) { // Search factories ArchiveFactoryMap::iterator it = mArchFactories.find(archiveType); if (it == mArchFactories.end()) // Factory not found OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, "Cannot find an archive factory " "to deal with archive of type " + archiveType, "ArchiveManager::load"); pArch = it->second->createInstance(filename); pArch->load(); mArchives[filename] = pArch; } else { pArch = i->second; } return pArch; }

看了源码,豁然开朗!!!

原来载入档案的时候,他会先查看这个档案资源已经载入了没有,如果已经载入了,直接返回这个档案资源的指针!!!

所以我们在外部再载入一次,就可以获得这个资源的指针:

// 获得地图列表文件 TLBBArchive* arch = (TLBBArchive*)ArchiveManager::getSingleton().load("../../Data/Scene.axp", "AxpPack"); mMaplistPtr = arch->list();

到此,就已经获得了列表文件信息,

用MFC对话框打开看看:

BOOL COpenMapDlg::OnInitDialog() { CDialog::OnInitDialog(); // 获得地图列表 CListBox* pListBox = (CListBox*)GetDlgItem(IDC_LIST1); CTLBBView* view = (CTLBBView*)((CMainFrame*)AfxGetMainWnd())->GetActiveView(); // 获得视图类 StringVectorPtr svPtr = view->getOgreApp()->getMaplistPtr(); vector<String>::iterator iter = svPtr->begin(); for (; iter != svPtr->end(); ++ iter) { String str = *iter; if (StringUtil::endsWith(str, ".Scene", false)) { pListBox->AddString(str.c_str()); } } return TRUE; }

最后效果:

菜鸟学习OGRE和天龙八部之十八: 获得档案(Archive)文件列表相关推荐

  1. 菜鸟学习OGRE和天龙八部之二: 天龙八部AXP数据格式搞定

    站位编辑,过段时间再写...因为现在有大侠写了资源提取工具,我暂时不用自己去写了哇 ---------------------------------------------------------- ...

  2. 菜鸟学习OGRE和天龙八部之十七: 修正部分地图载入的通用性问题,附源码

    有的地图不是tile的整数倍,有的地图没有WCollision文件,有的地图有centre等 有的地图没有光照图等等 比如武当的地图不是tile的整数倍,那么就需要调整tile大小,其实只需要稍微改动 ...

  3. 【小白学习C++ 教程】十八、C++ 中文件处理

    @Author:Runsen 在C++中,文件主要通过使用fstream头文件中的fstream.ifstream.ofstream三个类来处理. ofstream:在文件上写入的流类 ifstrea ...

  4. OpenCV学习笔记(五十六)——InputArray和OutputArray的那些事core OpenCV学习笔记(五十七)——在同一窗口显示多幅图片 OpenCV学习笔记(五十八)——读《Mast

    OpenCV学习笔记(五十六)--InputArray和OutputArray的那些事core 看过OpenCV源代码的朋友,肯定都知道很多函数的接口都是InputArray或者OutputArray ...

  5. OpenCV学习笔记(四十六)——FAST特征点检测features2D OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui OpenCV学习笔记(四十八)——PCA算

    OpenCV学习笔记(四十六)--FAST特征点检测features2D 特征点检测和匹配是计算机视觉中一个很有用的技术.在物体检测,视觉跟踪,三维常年关键等领域都有很广泛的应用.这一次先介绍特征点检 ...

  6. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

  7. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

  8. 深度学习入门笔记(十八):卷积神经网络(一)

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  9. Slicer学习笔记(二十八)Elastix扩展模块

    Slicer学习笔记(二十八)Elastix扩展模块 1.代码结构 1.1.代码结构 1.2.页面布局 1.3.Elastix路径选择 [可选] 2.执行配准 2.1 先去找到elastix.exe的 ...

最新文章

  1. deepspeaker(TensorFlow)百度声纹识别和对比代码和模型
  2. 第二阶段冲刺第四天(6月3号)
  3. 以前的学习笔记整理:第二层交换和生成树协议(STP)
  4. 调试.NET CORE代码
  5. python练习_如何使用Logzero在Python中练习记录
  6. 斯坦福《机器学习》Lesson4感想--1、Logistic回归中的牛顿方法
  7. eclipse注释模板与代码规范导入例子及配置文件
  8. ISO27145协议解析
  9. 自然语言处理NLP知识结构
  10. 用Dim搭建轻量级媒体服务器
  11. 致远oa系统unix 服务器,致远oa服务器设置
  12. 天风掌财社新股认购如何操作?
  13. 2019版本ppt如何导出论文所需300dpi像素以上的高清图片
  14. 微x怎么设置主题_团日活动主题策划书范文
  15. 使用ftp服务上传文件时553报错的解决
  16. Cisco Packet Tracer 思科模拟器SSH配置
  17. 广义线性模型--Generalized Linear Models
  18. ArrayDeque集合的妙用
  19. 边缘计算(一)——边缘计算的兴起
  20. 为新购Thinkpad T410打造Windows Server 2008工作环境

热门文章

  1. 实现div滚动条默认最底部以及默认最右边
  2. 学生课堂提问系统java源码_课堂管理系统;在线教辅平台;java课设(示例代码)...
  3. 深入浅出微信公众平台实战开发(一)
  4. 电脑平时好好的,今天连上了wifi,浏览器却加载不出网页,解决措施。
  5. 打印心形图案---程序猿才有的浪漫---入门级---C语言实现
  6. 百度地图行车轨迹调整速度后小车鬼畜跑动的问题解决
  7. 车间文员常用计算机表格,文员一般要做的表格
  8. Hadoop和大数据开源工具推荐
  9. 小白学编程千万别踩这 4 个坑!| 原力计划
  10. Swing画图并调整大小和移动位置