CEGUI(一)
CEGUI(Crazy Eddie’s GUI http://www.cegui.org.uk )是一套开源的使用C++开发的游戏界面库, 基于LGPL协议. 它能减少游戏开发中繁琐而大量的UI开发工作量. 现有很多游戏开发都会利用或者是借鉴它.
在学习了解CEGUI之前, 先把CEGUI源代码的环境搭建起来. CEGUI使用了几套开源库Freetype(http://sourceforge.net/projects/freetype), Glut(http://www.opengl.org/resources/libraries/glut), Xerces(http://xml.apache.org). 更全的信息资料大家可以去相应的网站上面了解. 下载相关库或者源代码后, 先在IDE中设置好, 那么就可以先编译CEGUI.
注意在使用freetype库时, CEGUIBASE工程链接会报错,提示为CEGUIBase error LNK2001: 无法解析的外部符号 _otv_module_class. 解决方法是在Freetype工程中打开ftmodule.h文件, 把FT_USE_MODULE(otv_module_class)这句代码注释掉,然后重新编译既可.
在运行CEGUI自带的例子时, 需要设置一下工作路径. 因为例子中一些相关的配置,资源文件路径都是使用了相对路径, 如不设置工作路径, 会无法运行DEMO.
首先运行一下最简单的DEMO,叫Sample_FirstWindow工程,里面的代码很简单,并且有大量的注释。关键的逻辑代码全在initialiseSample()函数中,看下来后可以发现,这里初始化所有UI资源,如图片,字体。
CEGUI(二)
例子已经有过基本了解了,那么首先来分析一下CEGUI的资源配置文件。例子的资源都放在sample/datafiles文件夹下。可以发现文件下面包含了各种图片,字体,脚本及其相应的配置文件。
以各种控件的图片为例,这种资源放在imagesets子文件夹下面,进入后大家可以看见里面有一个imageset.xsd文件,还有一些tga图片和一些后辍为imageset的文件。先打开imageset.xsd文件,可以发现内容全是XML格式的,这里其实定义了一些属性说明,但这些属性是谁在用呢?打开TaharezLook.imageset的文件看看,可以发现其中的秘密。Imageset文件中子结点的名字跟xsd文件中属性定义是相对应的。例如xsd文件的一个结点内容为:
<xsd:complexType name="ImageType">
<xsd:attribute name="Name" type="xsd:string" use="required"/>
<xsd:attribute name="XPos" type="xsd:nonNegativeInteger" use="required"/>
<xsd:attribute name="YPos" type="xsd:nonNegativeInteger" use="required"/>
<xsd:attribute name="Width" type="xsd:nonNegativeInteger" use="required"/>
<xsd:attribute name="Height" type="xsd:nonNegativeInteger" use="required"/>
<xsd:attribute name="XOffset" type="xsd:integer" use="optional" default="0"/>
<xsd:attribute name="YOffset" type="xsd:integer" use="optional" default="0"/>
</xsd:complexType>
而TaharezLook.imageset文件图片资源结点描述为:
<Image Name="ButtonRightNormal" XPos="96" YPos="20" Width="12" Height="16" />
ImageType是图片资源描述的结点,它包含的属性像Name, XPos这些都定义在xsd文件中结点为属性name=”ImageType”中,可以发现这里对应关系的。打开相应的TaharezLook.tga文件,可以发现里面是一些控件图片资源,而它对应的位置在TaharezLook.imageset中定义了。CEGUI的资源管理会根据xsd文件内容取得imageset文件中的内容结构,而imageset文件会告诉资源管理从tga文件中取到相应的图片纹理资源。感觉配置文件是有点多,但这样非常灵活,能根据不同需求定义不同的控件属性,按自己的方式制作纹理资源。
再看看其它的资源及相应的配置文件,像字体。可以发现跟图片纹理的做法是一样的。如果自己要使用它,明白了配置文件定义方式,很容易把相应的文件改成自己需要的。很方便的把CEGUI加入到自己的工程中应用,也不会给开发人员添加很大的麻烦。
CEGUI(三)
怎样把CEGUI应用到我们自己的工程中去呢?首先从CEGUI自带的例子Sample_FirstWindow分析,这个工程只有一个类,叫做Sample_FirstWindow, 它是从CEGuiSample父类派生而来。里面只有一个函数,叫InitialiseSample(),界面的初始化全部在这。追踪到最里面,会发现CEGuiD3D9BaseApplication, Win32AppHelp两个类,跟系统窗体和DX联系的都在这里面处理了。
明白原理了,那么做个测试,把CEGUI添加到一个DX工程中来。步骤分为以下几步:
1. 把CEGUI的头文件,资源文件(datafiles文件夹),库文件(注意包含freetype2, xerecs, glut)全部复制到工程下面
2. 在工程中把头文件添加进来,并设置好路径,引用lib
3. 在相应的代码中添加好CEGUI的代码,就是初始化,渲染,消息处理。具体代码可以参考一下例子