【CEGUI】CEGUI入门篇之使用ResourceProvider加载资源(二)

来源:互联网 发布:乐视没有mac版 编辑:程序博客网 时间:2024/06/01 14:59

以下内容翻译自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:

// initializationDefaultResourceProvider* rp = static_cast<DefaultResourceProvider*>(    CEGUI::System::getSingleton().getResourceProvider());rp->setResourceGroupDirectory("imagesets", "./mygame/datafiles/gui/imagesets/");// load laterImageManager::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 schemasCEGUI::XMLParser* parser = CEGUI::System::getSingleton().getXMLParser();if (parser->isPropertyPresent("SchemaDefaultResourceGroup"))    parser->setProperty("SchemaDefaultResourceGroup", "schemas");

4、一个完整的例子

// initialise the required dirs for the DefaultResourceProviderCEGUI::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 locationrp->setResourceGroupDirectory("schemas", "../datafiles/xml_schemas/");// set the default resource groups to be usedCEGUI::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 schemasCEGUI::XMLParser* parser = CEGUI::System::getSingleton().getXMLParser();if (parser->isPropertyPresent("SchemaDefaultResourceGroup"))    parser->setProperty("SchemaDefaultResourceGroup", "schemas");
1 0
原创粉丝点击