GUI 使用方法 二

资源管理入门

 

如果你已经读了 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


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/pepper6681747/archive/2008/10/25/3143054.aspx

v1.13 (10/19/2012) + 增加 (BDF) 字体合并功能。 + 增加自动校准基线功能。 + 增加对BDF V2.2 的支持。 * 完善越南文unicode编码字库(增加扩展码和附加码) v1.12 (09/17/2012) + 增加自动升级功能(由于增加了网络下载功能,可能会被杀毒软件拦截,但请放心,绝对安全)。 + 增加usbkey注册。 + 增加字体加粗功能。 * 修改字体文件,以及输出文件路径不能保持的bug。 * 修改scanmode为Horb0~b7的bug。 * 完善多语言文本提示。 v1.11 (08/14/2012) + 增加注册年限选择。 * 修改获取机器码失败的bug。 v1.10 (06/26/2012) * 精简字库检索表。 + 增加 GBK 字库输出。 + 增加一种点阵数据存储格式(只存有效像素数据--not fixed, 不支持MBCS编码格式的中日韩), 对泰文,缅甸文等特殊语种显示非常便捷。 v1.09 (06/15/2012) + 增加输出 C 语言(数组) 字体格式。 V1.08 (05/17/2012) + 增加了两个版本(免费和试用版) 免费版 只对 16点阵有效。 试用版 对所有点阵有效,但是会缺部分字符。 + 增加热键功能。 * 修改了多国语言生成.h文件时,start 与 end 不匹配的bug。 * 完善文档《GuiTool 使用说明》, 增加更多图解说明。 文档下载地址: http://ishare.iask.sina.com.cn/f/24472766.html v1.07 (05/02/2012) * 修改注册方式(改为文件)。 + 增加bdf格式编码过滤功能,主要是为了支持 MTK 手机点阵字库。 + 增加xp控件属性。 + 增加扫描模式图解。 * 修改了 bdf 2 bin 的一个bug。(选择输出位图时,会输出n个位图文件) * 修改了 BDF 文件中当字符显示宽度为0,存位图(所有字符存一张图片)失败的错误。 v1.06 (04/10/2012) + 增加系统字体支持,操作更简便,快捷。 枚举所有已安装系统字体,直接选择即可。 v1.05 (03/24/2012) Fontmaker(点阵字库) * 修正了字符对齐问题。 + 增加了单个字符或多个字符输出成位图文件设定。 * 完善了阿拉伯文字库(unicode 字库有效)。 + 增加自定义字符功能(unicode 字库有效)。 Multi-language(多国语言) + 增加输出编码格式 (mbcs, utf16-lb, utf8)设置 + 增加数组格式输出。 Image Manager(图像管理) + 该页为新增功能,支持图片图像的数据转换。主要应用在做产品logo图片方面。 V1.04 (07/16/2011) + 增加了一个字符串mbcs2unicode(内码转统一码)的功能。 (支持转:U16-LE, U16-BE, UTF8) V1.03 (07/05/2011) * 修改了 Example 中点阵字库解析源码,更加便于移植。(基本做到只需修改font_file.c 即可) * 修改了内码(MBCS)字库点阵信息读取的一个错误。 + 增加了多语言支持(简中,英文),还有待完善。。。 V1.02 (07/01/2011) 1. FontMaker V2.03 + 增加字符宽高比调节(HorR & VerR) + 增加对*.ttc 字库的支持。 + 增加bdf(*.bdf)文件格式转Simple Unicode编码格式的bin文件。 V1.01 (06/29/2011) 1. FontMaker V2.02 + 增加了 Simple Unicode功能。(适合小字库) + 增加了 “扫描方向及反显”设置。 2. Multi-Language V1.01 * 修改了除 office 2000 外,其它不能支持的问题。 V1.00: (2007-2011) * 继承 FontMaker V2.01 的所有功能。 + 增加了一个 Multi-Languge V1.00 的打包转换功能。 FontMaker 基本功能: 1.支持所有 windows 字符集:CP932(日文Shift-JIS)CP936(简体中文GBK)CP949(韩文)CP950(繁体中文 Big5),CP874(泰文),CP1250(中欧)CP1251(西里尔文),CP1252(西欧--"拉丁文I"),CP1253(希腊文), CP1254(土耳其文),CP1255(希伯来文),CP1256(阿拉伯文),CP1257(波罗的海文),CP1258(越南) 2.支持非等宽字库。 3.支持BIN,TXT,BMP,BDF 文件输出。 4.支持unicode字库输出,即可以做到在一个窗口中同时显示多国语言(文字) 5.支持单个字符编辑,预览(所见即所得)。 6.支持字库文件和输出路径记忆功能. 7. 支持从bdf格式转换自定义字库(bin文件)格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值