CEGUI中对于UI元素的操作

     在UI系统中,当我们在窗口上点击鼠标,移动鼠标,输入数据的时候,是如何来得到那个对应的 UI对象的呢?

    在CEGUI中,system中记录了当前活动的rootwindow modalTarget wndWidthMouse的相关窗口。当我们操作键盘的时候,首先会通过getKeyboardTargetWindow去system中得到当前能接受键盘输入的对象,然后调用该对象的onKey***就完成了。getKeyboardTargetWindow是通过查找rootWindow的活动孩子来返回相应对象,这里优先级被设置成了如果d_modalTarget存在的话就直接到了那里去了。window 的getActiveChild函数是通过在d_drawList里面的window执行递归调用getActiveChild,最终找到那个对象(在CEGUI中他先渲染的是d_drawList前面的窗口,所以这里是从尾部开始查找,因为后渲染的窗口会在上层)。对于一个window是否被设置成active,是可以由我们来设置的,不过通常是通过鼠标的点击来设置。当某个window收到onMouseButtonDown消息的时候(injectMouseButtonDown产生)他会调用moveToFront_impl(true)函数,在这个函数中就会调用onActivated(args)函数,args参数中otherWindow值:如果没有父窗口则直接0且调用完onActivated后就返回。如果有parent则调用parent的moveToFront(递归),这样就从顶层的parent起执行下面的内容了:找到该window的活动窗口,没有好说 直接跳过,有的话则则用args.window = activedWnd去调用onActivated,这样就可以完成对点击到的那个对象的所有父对象都调用一次onActivated,并对之前的窗口调用了onDeactivated函数了,且最后调用的才是自己的onActivated。window的onActivated函数就把该窗口的d_active属性设置成true了。前面有个问题是,如何才知道在收到injectMouseButtonDown的时候调用哪个window的onMouseButtonDown呢,那就用到一个函数getTargetWindow,该函数通过鼠标的位置来得到该窗口。

    getTargetWindow首先是看window里的d_captureWindow(一个静态变量)是否有值,没有的话就调用activeSheet的getTargetChildAtPosition函数来根据鼠标的positon来找出要找的窗口。如果有值的话就要进一步看该窗口是否分发,是的话就也需要调用它的getTargetChildAtPositon函数来找。他是通过递归调用每个孩子节点的getTargetChildAtPostion来找到想要的那个窗口,而getTargetChildAtPosition函数主要是通过测试相应的孩子是否与鼠标接触,函数为isHist参数为鼠标位置。Window的isHit函数通过将position与自己的hitTestRect进行运算(看点是否在该矩形内)从而得到结果。

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的功能是非常强大的,而且使用也非常的灵活,可以和脚本配合。可以通过配置文件自定义窗口外观。通过布局文件实现窗口布局等等特性,使得游戏的界面开发更加方便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值