cegui的事件机制

最近的编码中接触到了cegui,于是顺便看了一下它的事件机制,可以动态注册事件响应。

在高层次上,每一个窗口都是由EventSet派生而来,每当希望增加对一个Event的响应时,调用如下接口就可以动态的把一个

类的普通成员函数注册到一个事件map(以事件名称作为关键字)中:

Event::Connection subscribeEvent(const String& name, Event::Subscriber subscriber);

当窗口的对应事件发生时,程序会去map中查找到Subscriber然后调用其中保存的对象的成员函数。

在这之前我一直以为C++中只能做到通过类的继承注册派生类的普通成员函数(类似MFC中的做法),但是cegui中任何类的成员函数都可以注册。

cegui中是通过这几个类实现这样一种灵活的机制的:

 

 

 SlotFunctorBase是一个普通的基类。

MemberFunctionSlot为一个包含有对象指针及成员函数指针的类模板。FreeFunctionSlot等则包含一个函数对象的类模板。它们两者皆从SlotFunctorBase派生而来。

SubscriberSlot是一个普通类,它保存一个SlotFunctorBase指针指向SlotFunctorBase的几个派生类模板的实例对象。

这样当调用subscribeEvent时,就会创建一个SubscriberSlot对象,指向某对象的成员函数,事件发生时查找map找到SubscriberSlot即可以通过它调用某对象的成员函数。

这其中容易出现的一个问题是,注册了某事件,但是对应的对象销毁了,于是map中保存的数据无效,当这个事件发生时通过map调用响应函数就会出现异常。

 总的来说,cegui通过还不错的方式(比MFC好太多了)实现了C++中的委托吧,

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CEGUI的详细笔记和文档,学习游戏编程的朋友一定要看看 第1章 CEGUI的简介 - 5 - 1.1CEGUI历史和本书使用的版本 - 5 - 1.2 CEGUI的编译和例子介绍 - 5 - 1.2.1CEGUI源代码的简介 - 5 - 1.2.2CEGUI源代码编译 - 7 - 1.3 CEGUI官方编辑器的介绍 - 10 - 1.3.1 CEGUI布局编辑器 - 10 - 1.3.2 图像集编辑器 - 12 - 1.4 CEGUI总体架构 - 13 - 第2章 CEGUI事件系统和属性系统 - 15 - 2.1 CEGUI事件系统 - 16 - 2.2 CEGUI的属性系统 - 29 - 2.3 属性事件与布局文件 - 32 - 第3章 CEGUI基类的实现 - 39 - 3.1 窗口设计原理 - 39 - 3.2 Window类 - 40 - 3.2.1 Window类的继承关系以及与其相关的函数。 - 40 - 3.2.2 窗口的组织结构 - 41 - 3.2.3 窗口位置和大小 - 45 - 3.2.4窗口渲染 - 51 - 3.2.5 事件响应与处理 - 59 - 3.2.6 窗口状态 - 60 - 3.2.7 窗口与输入系统 - 61 - 3.2.8 窗口的其他功能 - 63 - 3.3 窗口类厂和类厂管理 - 64 - 3.3.1 窗口的类厂和类厂管理 - 64 - 3.3.2 渲染窗口的类厂和类厂管理 - 72 - 3.4 窗口管理系统 - 76 - 第4章 CEGUI核心控制体系 - 80 - 4.1 系统控制 - 80 - 4.1.1 系统变量 - 80 - 4.1.2 初始化和退出流程 - 82 - 4.1.3 输入系统的事件派遣流程 - 87 - 4.2 资源管理 - 96 - 4.2.1资源管理模式 - 96 - 4.2.2 图像集 - 102 - 4.3 系统接口 - 106 - 4.3.1 脚本接口 - 107 - 4.3.2 XML相关接口 - 107 - 4.3.3 图像解码接口 - 108 - 4.3.4 资源提供接口 - 109 - 4.4渲染机制 - 109 - 第5章 CEGUI应用程序框架 - 118 - 5.1 OpenGL程序框架 - 118 - 5.1.1 WIN32应用程序框架 - 118 - 5.1.2 OpenGL应用程序框架 - 122 - 5.1.3 CEGUI应用程序框架 - 124 - 5.2 CEGUI例子程序 - 125 - 5.2.1 加载资源和创建窗口 - 126 - 5.2.2 窗口的逻辑处理 - 127 - 第6章 外观系统 - 131 - .........
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值