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

以下内容翻译自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");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值