教程是针对以前版本的OGRE和CEGUI的。所以还是.xml格式后缀,现在CEGUI7.1使用的是.layout后缀,并且在配置Resource.cfg的时候需要把layout文件的路径设置在[general]配置节下面。这个问题需要再仔细看看resourcemanager模块是怎么处理这些配置的,我再写个详细说明。
接上面问题:
经过查看CEGUI和OGRE的源代码,发现:在CEGUI7.1版本中使用 mGUIRenderer=&CEGUI::OgreRenderer::bootstrapSystem();
类似的代码来初始化,在OgreRenderer::bootstrapSystem();
中具体的初始化代码如下:
OgreRenderer& renderer = OgreRenderer::create(target);
OgreResourceProvider& rp = createOgreResourceProvider();
OgreImageCodec& ic = createOgreImageCodec();
其中重要的是OgreResourceProvider,在CEGUI中有默认的resourceprovider,在OGRE 中我们调用了bootstrapSystem,自然使用的就是OgreResourceProvider,自然资源的查找遵循OGRE的配置规则。
再深入会发现:在WindowManager::loadWindowLayout该方法中会有
System::getSingleton().getXMLParser()->parseXMLFile(handler, filename, GUILayoutSchemaName, resourceGroup.empty() ? d_defaultResourceGroup : resourceGroup);这行,我们查找parseXMLFile方法在类
ExpatParser : public XMLParser中,而在ExpatParser::parseXMLFile中很快发现秘密所在:CEGUI::System::getSingleton().getResourceProvider()->loadRawDataContainer(filename, rawXMLData, resourceGroup);问题很明了具体调用关系如下:
CEGUI->初始化(包括OgreResourceProvider)->loadWindowLayout->parseXMLFile->getResourceProvider()->loadRawDataContainer
自然报错误是在OGRE的ResourceManager模块当中
至于为何一定要在general下,我想应该是我们没有在loadWindowLayout的时候提供资源组的名称,所以使用了默认的general组。