资源管理入门
如果你已经读了 CEGUI渲染入门 这篇文章,你已经知道:要想让CEGUI跑起来,至少要对CEGUI进行最基础的初始化,并调用System::renderGUI方法,这看起来很不错。可是,你仍然不能让程序画任何东西!
为了达到胜利的彼岸,下一步是设置资源管理器组(resource provider groups),我们将用它们装载一些文件供CEGUI在渲染的时候使用。
ResourceProvider 是什么?
CEGUI使用了一个工具对象,我们叫它“ResourceProvider”。此对象提供了一组接口负责CEGUI与其他的文件装载系统通信。
例如: Ogre 和 Irrlicht 都有它们自己的资源管理/文件装载子系统,通过实现特定的 ResourceProvider 对象,CEGUI 的渲染模块就可以和那些子系统无缝的组合起来。那样,CEGUI 的数据文件就可以通过那些子系统装载了。但是,更底层的库(Direct3D 和 OpenGL)没有那样的资源管理系统,所以,CEGUI 为它们提供了默认资源管理系统(default resource provider)。
DefaultResourceProvider 相关说明
CEGUI::DefaultResourceProvider ---- CEGUI 的默认资源管理系统,是为那些目前还没有的库提供基础帮助的系统。它不仅提供了 CEGUI 装载文件、数据时所需的函数,而且对“资源组(resource groups)”也提供了初步的支持。这里的“资源组”其实是一个标签,它代表系统的某个文件夹路径。这就使得我们可以将文件夹中的文件按其逻辑类型进行分组,然后可以通过一个简单的标签而不是硬编码的路径去指定它。也就是说:当数据文件的路径有改动的时候,只需更新资源组的路径而不必更改代码和XML文件中的路径信息。
指定资源组和路径
DefaultResourceProvider 允许你定义任意数目的资源组,并为每个资源组指定一个路径。也就是说:你可以创建一个资源组,比如“imagesets”,并为它指定一个路径,假设是“./mygame/datafiles/gui/imagesets/”。然后,当你通过ImagesetManager装载Imageset的时候,就可以指定“imagesets”为它将要使用的资源组,这样,系统就会在预定义的路径中寻找资源。目前,每个资源组只能被赋予一个路径。
下面给一个小例子来说明。
以前,在没用资源组的时候,你可能这么做:
Imageset* wlis = ImagesetManager::getSingleton().createImageset(
"./mygame/datafiles/gui/imagesets/WindowsLook.imageset");
Imageset* wlis = ImagesetManager::getSingleton().createImageset(
"./mygame/datafiles/gui/imagesets/WindowsLook.imageset");
用了资源组以后,在初始化阶段,你可以用默认的资源管理器像这样创建资源组:
DefaultResourceProvider* rp = static_cast(
CEGUI::System::getSingleton().getResourceProvider());
rp->setResourceGroupDirectory("imagesets",
"./mygame/datafiles/gui/imagesets/");
DefaultResourceProvider* rp = static_cast(
CEGUI::System::getSingleton().getResourceProvider());
rp->setResourceGroupDirectory("imagesets",
"./mygame/datafiles/gui/imagesets/");
然后,当你需要载入imageset的时候,你可以这样指定要使用的资源组:
Imageset* wlis = ImagesetManager::getSingleton().createImageset(
"WindowsLook.imageset", "imagesets");
Imageset* wlis = ImagesetManager::getSingleton().createImageset(
"WindowsLook.imageset", "imagesets");
注意:你不需要提供任何路径信息,因为在你指定的资源组中已经包含了相关的路径信息。比如上面例子中的"imagesets"资源组。稍后,我将教你如何为每种资源类型指定默认资源组,那样在你载入资源的时候就不需要指定资源组了(当然,除非你想从其他的组中载入资源)。
另一个需要注意的是:数据文件不应该包含任何的相对路径信息,一般它们只需包含文件名。
默认资源组
系统定义的任何代表可装载资源的资源类,都有获取和设置默认资源组的静态函数。当需要载入数据文件的时候,它就用那个默认资源组。比如:对于Imageset类,默认的资源组应该指向一个存储imageset xml文件和材质文件的文件夹。
对于每个资源类,它们获取、设置资源组的静态函数的名字都是一样的(xerces是个例外,下面会解释):
const String& getDefaultResourceGroup();
void setDefaultResourceGroup(const String& groupname);
const String& getDefaultResourceGroup();
void setDefaultResourceGroup(const String& groupname);
如下是资源类的一个列表,后面是它们各自管理的资源类型:
CEGUI::Imageset - Imageset xml and texture image files.
CEGUI::Font - Font xml and ttf font files.
CEGUI::Scheme - Scheme xml files.
CEGUI::WindowManager - Window layout xml files.
CEGUI::WindowManager - Window layout xml files.
CEGUI::WidgetLookManager - LookNFeel xml files
CEGUI::ScriptModule - Script files in whichever scripted langauge.
CEGUI::Imageset - Imageset xml and texture image files.
CEGUI::Font - Font xml and ttf font files.
CEGUI::Scheme - Scheme xml files.
CEGUI::WindowManager - Window layout xml files.
CEGUI::WindowManager - Window layout xml files.
CEGUI::WidgetLookManager - LookNFeel xml files
CEGUI::ScriptModule - Script files in whichever scripted langauge.
上面提到过,xerces是个例外,它是“基于Xerces-C的XML解释器(Xerces-C based XML parser)”。对此,有一个特殊的资源组设置文件,它指明schema文件在哪里(它们是用来检查xml的.xsd文件)。对于这个特殊情况,它的静态成员如下:
const String& XercesParser::getSchemaDefaultResourceGroup();
void XercesParser::setSchemaDefaultResourceGroup(const String&
groupname);
const String& XercesParser::getSchemaDefaultResourceGroup();
void XercesParser::setSchemaDefaultResourceGroup(const String&
groupname);
需要注意的最后一点是:资源管理类也有一个默认的资源组。当一个资源类没有显示指定资源组的时候,系统就使用它。当你把所有的数据文件都放到一个文件夹里的时候,这点就很方便了。
一个完整的例子:配置 DefaultResourceProvider
作为结尾,我将用一个完整的例子向你展示CEGUI的例子框架是怎样初始化资源组、初始化它们的目标路径以及怎样为所有的资源类型设置默认资源组的。
当像往常一样初始化CEGUI::System对象之后,我们就设置一组资源组和它们的路径:
// 为DefaultResourceProvider设置所需的路径
CEGUI::DefaultResourceProvider* rp = static_cast
(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/");
// 这步仅当你使用Xerces作为XML解析器的时候才需要
rp->setResourceGroupDirectory("schemas", "../../XMLRefSchema/");
// 为DefaultResourceProvider设置所需的路径
CEGUI::DefaultResourceProvider* rp = static_cast
(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/");
// 这步仅当你使用Xerces作为XML解析器的时候才需要
rp->setResourceGroupDirectory("schemas", "../../XMLRefSchema/");
完成这步以后,我们就把资源组和它们的路径都设置好了。最后,为了让系统使用新设置的路径,我们来设置默认资源组:
// 设置默认资源组
CEGUI::Imageset::setDefaultResourceGroup("imagesets");
CEGUI::Font::setDefaultResourceGroup("fonts");
CEGUI::Scheme::setDefaultResourceGroup("schemes");
CEGUI::WidgetLookManager::setDefaultResourceGroup("looknfeels");
CEGUI::WindowManager::setDefaultResourceGroup("layouts");
CEGUI::ScriptModule::setDefaultResourceGroup("lua_scripts");
// 仅当你用xerces做XML解析器,并为它定义了一个资源组的时候使用
CEGUI::XercesParser::setSchemaDefaultResourceGroup("schemas");
// 设置默认资源组
CEGUI::Imageset::setDefaultResourceGroup("imagesets");
CEGUI::Font::setDefaultResourceGroup("fonts");
CEGUI::Scheme::setDefaultResourceGroup("schemes");
CEGUI::WidgetLookManager::setDefaultResourceGroup("looknfeels");
CEGUI::WindowManager::setDefaultResourceGroup("layouts");
CEGUI::ScriptModule::setDefaultResourceGroup("lua_scripts");
// 仅当你用xerces做XML解析器,并为它定义了一个资源组的时候使用
CEGUI::XercesParser::setSchemaDefaultResourceGroup("schemas");
总结
目前,你对 DefaultResourceProvider 这个类有了一个大体的了解了。你知道了怎么创建资源组并为它们指定路径,还学到如何为CEGUI使用的每个资源类型设置默认资源组。
原文作者:CrazyEddie
原作日期:Not Given
原文地址:The Beginner Guide to Resource Groups
翻 译 者:天外|OutSky
翻译日期:2008-09-28 21:28
以前,我曾幻想自己做所有东西,包括游戏GUI。现在,我才发现这种想法多么幼稚。更体会到开源精神的伟大!
请尊重版权,转载请注明出处;代码及文章如需用于商业用途需经本人同意
本文永久链接:http://www.outsky.org.cn/article.php?action=read&category=1400&page=1&id=13
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pepper6681747/archive/2008/10/25/3143054.aspx