以下内容翻译自http://static.cegui.org.uk/docs/0.8.7/resprov_tutorial.html
这里主要介绍CEGUI::ResourceProvider的相关概念及DefaultResourceProvider的用法。
1、什么是ResourceProvider?
CEGUI使用ResourceProvider作为CEGUI库和外部文件系统的桥接,无论是基本的本地文件系统还是像Ogre3D和Irrlicht一样提供的资源管理子系统,通过实现ResourceProvider的接口,都可以把这些很好的集成到CEGUI系统。
2、DefaultResourceProvider
CEGUI提供了默认的ResourceProvider即DefaultResourceProvider,适用于简单的场景,包括文件中数据的加载和资源组的设置。资源组用于标识系统中的一个目录,不同类型的资源文件放置在不同的物理目录,资源组与目录关联之后,使用资源组将更方便资源管理。不使用DefaultResourceProvider时,如Ogre3D就提供了自己的OgreResourceProvider,或者是其它自定义的ResourceProvider,请忽略这里对关联资源组与目录的相关介绍,特别是关于DefaultResourceProvider的介绍,这时就需要按照相应资源系统的用法来实施,如Ogre3D的ResourceManager,不过设置默认资源组还是需要的。
关联资源组与目录——
DefaultResourceProvider允许定义任意数量的资源组,并关联到相应的目录。比如说创建一个名为imagesets的资源组并关联到目录./mygame/datafiles/gui/imagesets/,然后通过ImageManager加载Imageset时,使用imagesets这个资源组,就可以在./mygame/datafiles/gui/imagesets/这个目录中查找,另外还可以设置默认资源组,也就是在默认资源组中查找而不需要指定在哪个资源组中查找。需要注意的是现在仅支持资源组关联到一个目录,如果一个数据文件引用了其它数据文件的信息,禁用相对路径,直接使用引用文件的名字即可,而且还方便文件位置的移动。首先看一下通过一个完整的路径来加载Imageset:
ImageManager::getSingleton().loadImageset(
"./mygame/datafiles/gui/imagesets/WindowsLook.imageset");
下面是通过关联资源组与目录后来加载Imageset:
// initialization
DefaultResourceProvider* rp = static_cast<DefaultResourceProvider*>(
CEGUI::System::getSingleton().getResourceProvider());
rp->setResourceGroupDirectory("imagesets", "./mygame/datafiles/gui/imagesets/");
// load later
ImageManager::getSingleton().loadImageset(
"WindowsLook.imageset", "imagesets");
3、设置默认资源组
CEGUI系统的可加载的资源类都有设置和获取默认资源组的静态函数,某个资源类加载数据文件时就会用到资源组,除了ImageManager和XercesParser之外,其它的资源类都有相同的静态函数(ResourceProvider有类似的成员函数),如下:
const String& getDefaultResourceGroup();
void setDefaultResourceGroup(const String& groupname);
下面列出了资源加载的相关类及其加载的内容:
(1)CEGUI::Font : Font xml and freetype loadable font files.
(2)CEGUI::Scheme : Scheme xml files.
(3)CEGUI::WindowManager : Window layout xml files.
(4)CEGUI::WidgetLookManager : LookNFeel xml files
(5)CEGUI::ScriptModule : Script files in whichever scripted langauge.
给ImageManager设置默认资源组——
Imageset是从xml文件加载的图片资源包,其默认资源组由CEGUI::ImageManager进行设置,除了用于加载Imageset的xml文件外,还用于加载图片纹理文件,具体函数为:
const String& ImageManager::getImagesetDefaultResourceGroup();
void ImageManager::setImagesetDefaultResourceGroup(const String& resourceGroup);
给XercesParser设置默认资源组——
XercesParser有特殊的资源组设置方法,用来指定用于xml schema校验的.xsd文件的位置,使用PropertySet的接口通过属性名SchemaDefaultResourceGroup进行访问,这种用法是为了避免直接通过XercesParser来设置schema默认资源组,同时还能与其它的提供了schema校验和相同属性的xml解析模块一起工作。因为不能提前知道使用哪种xml解析模块,也就不知道某个属性是否存在,所以在设置属性前应该检查属性是否存在,这比检查xml解析模块的字符串ID(如Xerces)要好的多。示例代码如下:
// setup default group for validation schemas
CEGUI::XMLParser* parser = CEGUI::System::getSingleton().getXMLParser();
if (parser->isPropertyPresent("SchemaDefaultResourceGroup"))
parser->setProperty("SchemaDefaultResourceGroup", "schemas");
4、一个完整的例子
// initialise the required dirs for the DefaultResourceProvider
CEGUI::DefaultResourceProvider* rp = static_cast<CEGUI::DefaultResourceProvider*>
(CEGUI::System::getSingleton().getResourceProvider());
rp->setResourceGroupDirectory("schemes", "../datafiles/schemes/");
rp->setResourceGroupDirectory("imagesets", "../datafiles/imagesets/");
rp->setResourceGroupDirectory("fonts", "../datafiles/fonts/");
rp->setResourceGroupDirectory("layouts", "../datafiles/layouts/");
rp->setResourceGroupDirectory("looknfeels", "../datafiles/looknfeel/");
rp->setResourceGroupDirectory("lua_scripts", "../datafiles/lua_scripts/");
// This is only really needed if you are using Xerces and need to
// specify the schemas location
rp->setResourceGroupDirectory("schemas", "../datafiles/xml_schemas/");
// set the default resource groups to be used
CEGUI::ImageManager::setImagesetDefaultResourceGroup("imagesets");
CEGUI::Font::setDefaultResourceGroup("fonts");
CEGUI::Scheme::setDefaultResourceGroup("schemes");
CEGUI::WidgetLookManager::setDefaultResourceGroup("looknfeels");
CEGUI::WindowManager::setDefaultResourceGroup("layouts");
CEGUI::ScriptModule::setDefaultResourceGroup("lua_scripts");
// setup default group for validation schemas
CEGUI::XMLParser* parser = CEGUI::System::getSingleton().getXMLParser();
if (parser->isPropertyPresent("SchemaDefaultResourceGroup"))
parser->setProperty("SchemaDefaultResourceGroup", "schemas");