CEGUI-属性系统

程序在运行的过程中,经常需要改变一些对象的属性值,例如改变某个对话框的横坐标。这一般是通过调用该对象的某个特定方法实现的,以改变对话框横坐标为例,这个方法可能是CGUIDialog::SetX()。

CEGUI将这种属性操作进行了提炼,在上层形成了一个公共的接口,以统一的方式处理所有属性,为其它一些功能,例如动画功能打下了基础。


属性系统类图如下


各种不同的属性类派生自Property类,该类有两个虚方法,get()和set(),负责属性的读取和存储。每种Property在程序中只有唯一一个静态对象,它并不保存所谓的属性值,它只是一个代理者。以set方法为例,它的完整签名是

Property::set(PropertyReceiver* receiver, const String&value)

该方法将receive转换为某种对象指针,然后以value为参数调用该种对象的某个方法,一种Property就对应一种特定的对象和它的一个特定的方法。以Alpha为例,它对应Window类和它的set/getAlpha方法,它的set方法完整代码如下

void Alpha::set(PropertyReceiver* receiver, const String& value)
{
	static_cast<Window*>(receiver)->setAlpha(PropertyHelper::stringToFloat(value));
}


前面说过,每种Property在程序中只有唯一一个静态对象,该对象一般是相应类的静态成员,例如Alpha就是Window类的静态成员,在Window类的对象实例化的时候,会把Alpha对象的引用添加到Window类的一个map对象中,该map的键值是属性的名字。


属性系统的时序图如下



CEGUI属性系统的优点是抽象层次很高,以统一的方式处理所有属性,但缺点就是效率,因为它需要将具体数值类型和string进行相互转换,我曾经想把Property的虚方法进行扩充,增加set/getInt这样的方法,这样做就可以避免具体数值类型和string之间的转换。但如果这样做,那么属性类型的抽象就没有了,所有依赖属性类型抽象的地方都必然会形成巨大的switch-case或者类似的东西,这会让人很恶心,所以还是算了。


不过属性系统还是有可以优化的地方的:mapNameAndProperty不是指针,每个PropertySet对象都有一份它的实例,而相同类型的PropertySet对象,例如所有Window对象,它们的mapNameAndProperty的是一模一样的,所以我觉得可以把mapNameAndProperty改为指针引用,而真正的实例作为静态变量存储在相应的类中,类图如下:


在某种PropertySet类第一次构造对象的时候,填充这个属性map,并在构造函数中把PropertSet::pMapNameAndProperty指向它,这样可以省一些空间。

CEGUI(Crazy Eddie’s GUI http://www.cegui.org.uk)是一个自由免费的GUI库,基于LGPL协议,使用C++实现,完全面向对象设计。CEGUI开发者的目的是希望能够让游戏开发人员从繁琐的GUI实现细节中抽身出来,以便有更多的开发时间可以放在游戏性上。 CEGUI的渲染需要3D图形API的支持,如OpenGL或Direct3D。另外,使用更高级的图形库也是可以的,比如OGRE、Irrlicht和RenderWare等,关键需求可以简化为二点: 纹理(Texture)的支持直接写屏(RHW的顶点格式、正交投影、或者使用shader实现) 本书截止日时,CEGUI的最新版本是0.6.0(本书的讨论也是基于此版本),本书光盘提供了SDK和全部源码的下载。 除此之外,CEGUI还同步提供了官方界面编辑器LayoutEditor和ImageSet编辑器,以方便UI和图像集的制作。作为界面编辑器,它需要系统级界面以提供编辑器操作,0.3.0版是基于MFC实现的;而在0.4.0版本以后,改为基于wxWidgets(跨平台的本地UI框架,这里的UI指Window操作系统底层,如:Windows、Unix和Mac,详见http://www.wxwidgets.org)实现。 目前将CEGUI作为游戏界面库开发的游戏已经有好多种,国内的天龙八部,巨人等游戏就是很好的例子。 CEGUI的功能是非常强大的,而且使用也非常的灵活,可以和脚本配合。可以通过配置文件自定义窗口外观。通过布局文件实现窗口布局等等特性,使得游戏的界面开发更加方便。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值