教程是針對以前版本的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組。