在游戏中使用“CEGUI” — 第一章(底层)
日期:2006/4/13 – 2006/10/10
本文首次刊登于《游戏创造》,现开放与大家共享,转载请注明出处。
作者介绍
    唐亮(千里马肝),四年游戏从业经验,曾任职于大宇软星科技(上海)有限公司任程序技术指导,现在ATI任Engineer,主要负责XP/Vista下的Display Driver。迄今为止主要个人作品为《阿猫阿狗2》,参与开发《汉朝与罗马》、《阿猫阿狗大作战OLG》和《仙剑奇侠传4》,主要研究方向为C++、图形渲染技术和系统架构。
blog地址:oiramarioblogs
简介
    CEGUI(Crazy Eddie’s GUI uk)是一个自由免费的GUI库,基于LGPL协议,使用C++实现,完全面向对象设计。CEGUI开发者的目的是希望能够让游戏开发
人员从繁琐的GUI实现细节中抽身出来,以便有更多的开发时间可以放在游戏性上。
CEGUI的渲染需要3D图形API的支持,如OpenGL或Direct3D。另外,使用更高级的图形库也是可以的,像是OGRE、Irrlicht和RenderWare,关键需求可以简化为二点:
1.纹理(Texture)的支持
2.直接写屏(RHW的顶点格式、正交投影、或者使用shader实现)
本文截止日时,CEGUI的最新版本是0.4.1(本文的讨论也是基于此版本),提供了SDK和全部源码的下载,同时为了适应不同的使用需求,还根据STL的使用区分为Native(VC自带的P.J. 版STL)和STLport(基于SGI STL实现的跨编译器版本,详细见),以及VC6.0、VC7.0、VC7.1和VC8.0几种。
除此之外,CEGUI还同步提供了官方界面编辑器LayoutEditor,以方便UI的制作,下载地址:www.2dgame-tutorial/downloads/CELayoutEditorSetup_0.。作为界面编辑器,它需要系统级界面以提供编辑器操作,在此之前的0.3.0版是基于MFC实现的;而在0.4.1版本中,改为基于wxWidgets(跨平台的本地UI框架,这里的UI指Window操作系统
底层,如:Windows、Unix和Mac,详见)实现。
OGRE作为目前最活跃的开源3D引擎,许多公司开始使用它进行游戏开发,原因也是其功能非常得全面和强大。在最初,OGRE曾经实现过一版UI,但是最后却放弃自己的实现而选择了CEGUI。
Why
很多人可能会觉得UI这种东西很简单,自己写就好了。我想这首先要看标准是什么了,如果只是简单的按钮、图片什么的控件,那当然不必要去负担如此大的一个库。但是,如果是以Windows 9x这样为标准,那么就不是一般得复杂了,M$也不是白混的,还要继续坳的话,那么就请自己试实现一次吧,就会发现其实事情不像是看上去那么容易。
另外,CEGUI也是由人设计出来的,我坚信会有其他的大牛可以做得到。但是,这样做真的有必要吗,有可能你在De一个别人2年前早已修掉的Bug,而别人这时正在做下一代框架,干麻不花这个时间一起去完善它呢?
最后,我想就是开源的力量。凡事不去尝试,是不会了解到其真象的。为什么会有所谓头脑
风暴,这就是集体的力量,广大人民众齐心协力,会让人感到个人力量的有限。
那么,让我们放下成见,卸掉包袱,开始这一次CEGUI之旅。
设计思想
WidgetSets
CEGUI的设计思想是以窗口为单位的WidgetSets,它称作这些WidgetSets为xxxLook,例如自带的两个TaharezLook和WindowsLook,也就是说在同一个Look里,所有的同类型的控件都长一个模样(这个可能无法满足我们通常游戏中的需要,所以要对其进行一些改造),感觉上比较像Windows98的Theme(主题),只不是Theme的概念更大,包括了桌面、音效和鼠标等。
TaharezLookWindowsLook
    如上左右二图,可以看到,所有该Look所支持的Control类型所需要的图素都被一张图片所包含,假设需要更改样式和外观,可以设计多张拥有同样结构和相同元素的图片,然后换图即可。字符串是什么颜
体系结构
    CEGUI的窗口体系结构,跟以往我们所了解的一样,它底层的基类是Window,如下图:
    以上便是CEGUI提供给我们的控件集合,其他不在此范畴内的复合控件,也可以使用这些基本控件组合而成。
Window
可以看到,中间黑块中的Window,它继承于PropertySetEventSet。从这里开始,需要说明一个CEGUI中常见的概念:在CEGUI中,如果存在某对象为xxx,通常会有一个xxxSet与之对应,而xxxSet的任务是对其进行管理或是分发的工作。因此,对于PropertySet而言,同时存在有Property,而Property的概念是:构建一个物件所必须的属性或组件。
举例来说,WindowProperties::AbsoluteHeight是一个在namespace WindowProperties中的一个Window属性AbsoluteHeight,用作描述Window的高度。同理,EventSet是全部Window事件的集合,其中就有像EventSized用作描述Window大小改变的事件(理解同“消息”)。
    Window拥有了PropertySetEventSet的特征后,在初始化的时候,它自己便会往里面“填入” 许多的属性和事件,丰富一番后,它也会定义一些接口,供子类继承或是供外部操作使用,像是会有接口virtual    void    drawSelf(float z)    = 0;(供子类实现绘制),当然也会有一些公共的操作接口,如void    setYPosition(float y);(设置坐标)。
    在上图的右边,有一长串由Window派生出来的子控件,也就是由这些控件构成了整个CEGUI,其中包括有基本的控件:按钮、文字、图片、编辑框等;也有较复杂的复合控件:
列表框、表格、多行编辑框等,它们由多个基本控件组合而成。另外,作为一种附属窗体Tooltip,它就是当鼠标在某控件上悬停一会儿后出现的说明框。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。