菜鸟学习OGRE和天龙八部之十八: 获得档案(Archive)文件列表
2009-11-14 00:26
369 查看
要获得档案文件的文件列表,只要获得Archive的指针,就可以调用list()函数获得文件列表
但是如何获得Archive的指针呢,先看看资源的载入过程:
先从resources.cfg文件获取资源的路径,资源组,资源文件类型,这3个数据:
ConfigFile cf;
cf.load("resources.cfg");
再把这3个数据传入资源定位的函数:
ResourceGroupManager::getSingleton().addResourceLocation(archName, typeName, secName);
资源定位到底做了什么,看看源码:
我们可以看到
// 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 );
如果已经载入了一次,我们再载入一次,会发现什么情况
看了源码,豁然开朗!!!
原来载入档案的时候,他会先查看这个档案资源已经载入了没有,如果已经载入了,直接返回这个档案资源的指针!!!
所以我们在外部再载入一次,就可以获得这个资源的指针:
到此,就已经获得了列表文件信息,
用MFC对话框打开看看:
最后效果:
但是如何获得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)文件列表
- 菜鸟学习OGRE和天龙八部之三: GridInfo和HeightMap文件的数据格式(已更正)
- 菜鸟学习OGRE和天龙八部之三: GridInfo和HeightMap文件的数据格式(已更正)
- 菜鸟学习OGRE和天龙八部之六: 地表和水面的normal搞定,光照正常了
- 菜鸟学习OGRE和天龙八部之二: 天龙八部AXP数据格式搞定
- 菜鸟学习OGRE和天龙八部之二: 天龙八部AXP数据格式搞定(2009.10.19)
- 菜鸟学习OGRE和天龙八部之四: 地表贴图的实现
- 菜鸟学习OGRE和天龙八部之十: frame动画基本搞定,遇到点问题
- 菜鸟学习OGRE和天龙八部之十六: 网游视角跑图功能基本实现,包括人物,射线查询,鼠标decal等等
- 菜鸟学习Linux 处于查看文件时(包括man page和预览档案),各种查看命令
- 菜鸟学习OGRE和天龙八部之九: AXP档案的直接载入搞定
- 菜鸟学习OGRE和天龙八部之五: 水面TerrainLiquid基本搞定
- 菜鸟学习OGRE和天龙八部之十七: 修正部分地图载入的通用性问题,附源码
- 菜鸟学习OGRE和天龙八部之一:OGRE+MFC+OIS
- 菜鸟学习OGRE和天龙八部之八: 水面方格效果和光照BUG的修正
- 菜鸟学习OGRE和天龙八部之六: 地表和水面的normal搞定,光照正常了
- 菜鸟学习OGRE和天龙八部之四: 地表贴图的实现
- 菜鸟学习OGRE和天龙八部之十七: 修正部分地图载入的通用性问题,附源码
- 菜鸟学习OGRE和天龙八部之七: frame帧动画数据格式搞定,已修正关键帧
- 学习OGRE - 载入天龙八部AXP文件