CEGUI事件处理流程简单分析

这段时间看了下CEGUI的代码,简单记录一些东西,防止以后想看的时候忘太多。这次就记录下CEGUI的事件处理流程吧。

CEGUI的事件处理是通过以下几个类来完成的,EventSet, Event , Connection ( BoundSlot ) , SubscriberSlot , SlotFunctionBase ( 以及它的很多子类 )。

他们之间的关系在CEGUI的代码中还是比较清晰的,EventSet通过map来存储多个Event,Event也通过map来存储多个BoundSlot,而每个BoundSlot中有一个SubscriberSlot,每个SubscriberSlot中含有一个SlotFuntionBase的指针,这个指针指向不同的子类。

从逻辑角度讲,EventSet对应一个整个的事件处理集合,任何的类都可以成为一个事件处理集合(只要它继承EventSet就可以),而Event对应一个具体的事件处理(具体的说是对应某一种类型的事件,但是它记录了这个事件处理的不同方法,可以是一个或者多个,或者根本没有处理方法。但是即使事件没有处理方法,Event实体还是存在的),BoundSlot对应着一个Event与一个处理事件之间的联系关系,SubscriberSlot和SlotFuctionBase是具体的事件处理函数。

下面简单对每个类进行下分析,

EventSet通过一个map<String,Event*>存储所有的事件,而每个事件中是否有处理函数与事件本身的存在与否是相对独立的。正常情况下,大部分的事件是没处理函数的,但是事件本身仍然存在。每个事件Event都有一个ID,CEGUI利用String来表示这个ID。

Event代表了一种具体的事件,里面最主要的元素就是一个记录事件处理的集合,而CEGUI利用map来存储,没有直接用vector或者list之类的。原因在于CEGUI在注册事件的时候,用户可以提供一个group(uint)值,从而按照group值的大小顺序(从小到大)执行事件处理,CEGUI利用stl中的Map的默认排序算法实现了这一功能。

Connection或者说BoundSlot,就是记录事件处理函数与Event之间的联系关系,Connection记录了它所属的Event指针以及事件处理函数(SubscriberSlot)。它被用于反注册CEGUI事件处理函数。

SubscriberSlot就针对一个具体的事件处理函数了,里面其实只有一个SlotFunctionBase指针。

SlotFunctionBase有很多子类,例如MemberFunctionSlot,FreeFunctionSlot等,它把不同类型的事件处理函数与上层独立开来,从而使得BoundSlot不需要关系它所联系的处理函数的具体类型是全局的还是类函数。

在一个EventSet接受到一个事件被触发后,它首先通过map找到相应的Event,然后Event遍历这个事件的所有处理函数,就完成了事件处理流程。在一个事件的多个处理函数中,无论函数返回是true还是false,所有的函数都会被执行一遍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值