【CEGUI文件系统】
CEGUI使用很多类型的数据文件,其中绝大多数都是XML格式,除了特殊的图片文件(.tag等)以及可载入模块文件(DLL等)。但是为了清晰的说明数据文件的资源类型,数据文件并不是以”.xml”作为后缀,而是用更有意义个后缀名。比如imageset的后缀名就是.imageset,Font的后缀名就是.font等等。
Imageset——通常,为了提高效率,我们需要把材质等图片组合成一个大的材质图片。在使用的时候就需要在它上面截取到各个小材质,而这个imageset就是保存各个小材质在整张源图片上的区域信息(源图片同样在imageset中指定了)。每个区域信息都有一个独一无二的名字,当提到它们的名字的时候,系统就把它们当做图片处理。所以,也可以说imagesets定义了一系列的图片。通过修改imagesets中的源图片名、各个小区域的位置和大小,就可以很轻松的改变所画的GUI的外观。
Font——显而易见,Font文件定义了CEGUI使用的字体,所能定义的字体类型有两种:
Pixmap Font——这种就是众所周知的位图字体,这种字体基于一定义了文字图片的imageset。从CEGUI0.5.0开始,在.font文件中用Type=”Pixmap”指定此字体。在更早的版本中,用“static”指定。
Scheme——是把其他数据文件联系到一起的主要手段,同时它也是装载和定义各种控件最简便的方法。一个Scheme文件可以包含下面的一种或者多种文件(当Scheme被载入的时候,它所包含的文件也将被载入并初始化):
a.
b.
c.
d.
e.
f.
Imageset和Font上面已经提到了,这里列举仅仅是为了说明scheme可以包含它们。
WindowSet——用来指明一个可载入模块(.dll,.so等)的名字,并列出它所使用的控件中你想注册控件的名字。如果没有列出任何控件名,那么模块中所有的控件都是要被注册的。
WindowRendererSet——指明一个可载入模块(.dll等)的名字,并列出它所使用的窗口渲染器(window renderer)中你想注册的窗口渲染器的名字。如果没有列出任何窗口渲染器名,那么模块中所有的窗口渲染器都将被注册。“窗口渲染器”是一个可以控制基本窗口类型渲染的东西。所有的窗口渲染器都是利用”Falagard“蒙皮系统进行渲染的(尽管这不是必须的)。
WindowAlias——提供通过别名制定一个窗口/控件类型的方法。使用此方法,也可以用另一控件类型来“替代”一个已经注册的控件类型。这样就达到隐藏已经注册控件的效果。
FalagardMapping——用来创建一个可用的WindowType类型。包含三个部分:TargetType(指定基类(具有相关功能);Renderer(指定窗口渲染器,可以控制渲染指定的TargetType);LookNFeel(指定要使用的皮肤,一般通过XML格式的looknfeel文件指定)。
Layout——Layout用MXL格式描述一个窗口的布局。每个镶嵌的“window”元素定义一个要创建的窗口或者控件,“proterty”元素为每个定义的窗口设置相关属性。
Config——CEGUI支持使用配置文件。这个文件允许你定义一些默认参数,比如:默认载入的Scheme,默认载入的Layout,初始化和终止脚本文件(ScripModule中使用)。
载入基本的文件
想要成功显示GUI,你需要载入一些文件。至少要载入下面的这些:
l
l
l
【CEUGI的资源管理】
注意:Ogre和Irrilicht(鬼火引擎)都有它们自己的资源/文件管理和装载子系统,通过实现特定的ResourceProvider对象,CEGUI的渲染模块就可以和那些子系统无缝的组合起来。那样,CEGUI的数据文件就可以通过那些子系统装载了,但是因为更底层的库(Direct3D和OpenGL)没有那样的资源管理系统,所以,CEGUI为它们提供了可用的默认资源管理系统(default ResourceProvider)
DefaultResourceProvider相关说明
CEGUI::DefaultResourceProvider——CEGUI默认的资源管理系统,是为那些目前还没有的库提供基础帮助的系统。它不仅提供了CEGUI装载文件、数据时候所需要的函数,而且对“资源组”(resource groups)也提供了初步的支持。这里的“资源组”其实是一个标签,它代表系统的某个文件夹路径。这就使得我们可以将文件夹中的文件按照其逻辑类型进行分组,然后可以通过一个简单的标签而不是硬编码的路径去指定它。也就是说:当数据文件的路径有所改动的时候,我们只需要更新资源组的路径而不需要更改代码和XML文件中的路径信息。
如何指定资源组和路径?
DefaultResour允许你定义任意数目的资源组,并为每一个资源组指定一个路径。也就是说:你可以创建一个资源组,比如“imagesets”,并为其指定一个路径,假设是“./datafiles/imagesets”。然后,当你通过imagesetManager装载imageset的时候,就可以指定”imagesets”为它将要使用的资源组。这样系统就会在预定义的路径中寻找资源。目前,每个资源组只能被赋予一个路径。
下面是用来说明这个例子的代码:
在你没有资源管理器的时候,你需要用下面的方法来找到资源:
Imageset *wlis=ImagesetManager::getSingleton().createImageset(“./datafiles/imagesets/WindowsLook.imageset”);
用了资源组以后,在初始化阶段,你可以用默认的资源管理器创建如下的资源组:
DefaultResourceProvider *rp=static_cast(CEGUI::System::getsingleton().getresourceprovider());
Rp->setResourceGroupDirector
然后,在你需要载入imageset的时候,你可以这样指定要使用的资源组:
Imageset *wlis=imagesetManager::getsingleton().createImageset(“WindowsLook.iamgeset”,”imagesets”);
注意:此时你不需要提供任何路径信息,因为在你指定的资源组里已经有了那样的路径。(同样要注意数据文件不应该包含任何的相对路径信息,一般他们只需要包含文件名)。
那么,CEGUI的默认资源组是什么呢?
系统定义的任何代表可装载资源的资源类,都有获取和设置默认资源组的静态函数。当需要载入数据文件的时候,它就用那个默认资源组。比如imageset类。默认的资源组应该指向一个存储imageset xml文件盒材质文件的文件夹。
对于每个资源类,它们获取、设置资源组的静态很熟的额名字都是一样的(xerces是个例外):
const String &getDefaultResourceGroup();
void setDefaultResourceGroup(const String &groupname);
如下是资源类的一个列表,后面是它们各自管理的资源类型:
CEGUI::imageset
CEGUI::Font
CEGUI::Scheme
CEGUI::WindowManager –Windowlayout xml files
CEGUI::WidgetLookManager –LookNFeel xml files
CEGUI::ScriptModule
设置完成了默认的资源路径以后,我们还需要设置默认的资源组如下
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");
Ps:当你仅仅使用xerces做XML解析器,并为它定义了一个资源组的时候使用
CEGUI::XercesParser::setSchemaDefaultResource
【OGRE中使用CEGUI】
因为在Ogre自从1.7以后便不在自己的附加库中添加CEGUI作为界面库,所以在使用方面需要有一些不同的地方:
1)在Ogre1.4的版本中,要添加cegui需要有两个如下的步骤进行初始化:
a.
mGUIRenderer=new CEGUI::OgreCEGUIRenderer(mWindow,Ogre::RENDER_QUEUE_OVERLAY,flase,1000,mSceneMgr);
b.
mGUISystem = new CEGUI::System(mGUIRenderer);
所以在之前的版本中你需要在程序中保留两个CEGUI相关句柄,一是其渲染器,一是其渲染系统。
而在Ogre1.7.x+CEGUI的初始化过程中,你只需要保留CEGUI中定义的OgreRenderer的句柄就可以了:
a.
CEGUI::OgreRenderer &mGUIRenderere=CEGUI::OgreRenderer::bootstrapSystem();
b.
CEGUI::OgreRenderer &myRenderer=CEGUI::OgreRenderer::create();
2)接下来,要进行的就是设定默认的资源组的路径了,以为内使用了Ogre所以可以利用其本身的文件组织体系来定义组路径:
其方法就是在工程文件的Resources_d.cfg(如果是编译的话)中添加CEGUI的相关资源组的路径如下:
[Imagesets]
FileSystem=CEGUI_PATH/datafiles/imagesets
[Fonts]
FileSystem= CEGUI_PATH /datafiles/fonts
[Schemes]
FileSystem= CEGUI_PATH /datafiles/schemes
[LookNFeels]
FileSystem=ECEGUI_PATH /datafiles/looknfeel
[Layouts]
FileSystem= CEGUI_PATH /datafiles/layouts
然后就是在自己的工程文件中添加默认的资源组
3)做完了这些以后你就可以在自己的createScene中添加各种你所需要的CEGUI控件和窗口了,但需要注意的是,CEGUI仅仅是作为一个单纯的界面系统,并没有直接定义对于各种外设的响应,所以在使用CEGUI的时候需要利用OIS来得到外设的相关事件,并装换event处理成CEGUI的响应(在后面的文章中会详细介绍CEGUI与Ogre的外设事件转换)
4)在你的各种设置都完成了以后,千万不要忘记了在OGRE的析构函数中销毁你的CEGUI渲染系统,不然会造成内存的泄露,因为CEGUI本身并不会替用户销毁渲染器,�%