[osg]osg自定义事件的理解
参考:http://blog.csdn.net/l_andy/article/details/51058907
添加自定义事件
首先osg在其内部通过osgGA::EventQueue类维护了一个事件队列,队列中的每一个事件都是一个osgGA::GUIEventAdapter对象(这个对象是用来存放所系统捕捉到的事件),在仿真循环阶段被系统捕捉到的所有事件都会被添加到这个事件队列中,之后会有一个事件遍历过程,在这个过程中实际上就是遍历这个事件队列,并且对事件队列中的每一个事件,它都会与我们在事件处理类中方法进行响应(如果事件处理类中没有对这个事件的处理则不会响应)。
(此代码来自于王锐老师的Beginner‘s Guide中240页)
- struct TimerInfo : public osg::Referenced
- {
- TimerInfo( unsigned int c ) : _count(c) {}
- unsigned int _count;
- };
- bool TimerHandler::handle( const osgGA::GUIEventAdapter& ea,
- osgGA::GUIActionAdapter& aa )
- {
- switch ( ea.getEventType() )
- {
- case osgGA::GUIEventAdapter::FRAME:
- if (_count % 100 == 0 )
- {
- osgViewer::Viewer* viewer =
- dynamic_cast<osgViewer::Viewer*>(&aa);
- if ( viewer )
- {
- //在这里,我们添加了一个用户自定义的时间,我们只需要在下面的时间类型中对USER类型进行判断即可对此事件进行处理,
- //注意其参数是一个继承自Reference类的对象。
- viewer->getEventQueue()->userEvent(
- new TimerInfo(_count) );
- }
- }
- _count++;
- break;
- case osgGA::GUIEventAdapter::USER:
- if ( _switch.valid() )
- {
- //同过getUserData方法,直接获取用户数据(我们在上面传入的继承自Reference类的对象)
- const TimerInfo* ti =
- dynamic_cast<const TimerInfo*>( ea.getUserData());
- std::cout << "Timer event at: " <<ti->_count<<
- std::endl;
- _switch->setValue( 0, !_switch->getValue(0) );
- _switch->setValue( 1, !_switch->getValue(1) );
- }
- break;
- default:
- break;
- }
- return false;
- }
在上面这个handle函数中,我们定义了对两个事件的处理,一个为FRAME事件,另一个为USER事件,在FRAME事件的处理中,首先判断_count值是否能呗100整除(在每一个FRAME事件中都会使_count值加一),即每过100帧就会执行一遍if语句下面的内容。在if语句中,它通过调用userEvent方法将事件加入到事件队列中。
上面的图片是userEvent函数的实现源码,我们可以看到在调用userEvent方法时,其函数内部的实现如上,首先设置时间类型为USER(即我们用此方法添加到事件队列中的事件的类型为USER),其次调用setUserData方法设置用户数据,之后设置时间,最后通过addEvent方法将其添加到事件队列中去。这样我们就能在事件处理的handle函数中对此事件进行响应了。
[osg]osg自定义事件的理解的更多相关文章
- vue2.0中v-on绑定自定义事件的理解
vue中父组件通过prop传递数据给子组件,而想要将子组件的数据传递给父组件,则可以通过自定义事件的绑定. 每个Vue实例都实现了[事件接口],即: 1.使用 $on(eventName) 监听事件 ...
- Javascript事件模型系列(四)我所理解的javascript自定义事件
被我拖延了将近一个月的javascript事件模型系列终于迎来了第四篇,也是我计划中的最后一篇,说来太惭愧了,本来计划一到两个星期写完的,谁知中间遇到了很多事情,公司的个人的,搞的自己心烦意乱浮躁了一 ...
- 理解的javascript自定义事件
理解的javascript自定义事件 被我拖延了将近一个月的javascript事件模型系列终于迎来了第四篇,也是我计划中的最后一篇,说来太惭愧了,本来计划一到两个星期写完的,谁知中间遇到了很多事情, ...
- 关于vue自定义事件中,传递参数的一点理解
例如有如下场景 先熟悉一下Vue事件处理 <!-- 父组件 --> <template> <div> <!--我们想在这个dealName的方法中传递额外参数 ...
- C#:委托和自定义事件
1. 委托概述 “委托”相当于C++中的“函数指针”,委托必须与所要“指向”的函数在“参数”和“返回类型”上保持一致; // 定义Person类 public class Person { publi ...
- 【2016-11-11】【坚持学习】【Day24】【WPF 自定义控件 附加属性 自定义事件】
UserControl ,自定义控件. 这里刚刚想到一个问题.什么时候应该用usercontrol 定义一个控件.什么时候应该重写控件的template和样式,实现新效果. 引用一下人家的话:http ...
- Qt自定义事件的实现(转)
原文:http://blog.csdn.net/michealtx/article/details/6866094 初学Qt,用了Qt自带的事件,然后想怎么才能定义自己的事件呢?又如何使用自定义事件呢 ...
- 使用C#的自定义事件
public class CarDealer { public Action<string> NewCarInfo; //使用系统定义的泛型委托 public void NewCarCom ...
- Qt自定义事件的实现(军队真正干活,但要增加监军,大平台通知事件,事件内容自定义)
初学Qt,用了Qt自带的事件,然后想怎么才能定义自己的事件呢?又如何使用自定义事件呢?看了篇文章,说先要子类化QEvent,然后定义自己的QEvent::Type,然后重写QWidget::event ...
随机推荐
- VS2013密钥(所有版本)
Visual Studio Ultimate 2013 KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9 Visual Studio Premium 2013 KEY(密钥) ...
- Sublime text 3搭建Python-Anaconda开发环境
网络上的教程各种各样,大同小异.自己安装时还是出了些问题,因此总结一篇博文. Sublime Text 是一款轻量级跨平台的文本编辑器,可通过包(Package)扩充自身功能. 有很多搭建python ...
- Android弹性滑动的三种实现方式
引言 上一篇文章我们介绍了实现弹性滑动的三种方式,但仅仅是给出了代码片段和方法理论.今天我们结合一个具体的例子来谈一下如何使用这三种方法来实现弹性滑动.今天我们的例子是仿IOS的下拉操作,我们知道An ...
- http协议基础(十一)http与https
一.http的缺点 之前有介绍过http协议相关的一些知识,http是相当优秀和方便的,但它也有缺点,主要不足表现在如下几个方面: △ 通信使用明文(不加密),内容可能会被窃听 △ 不验证通信方的身份 ...
- #C语言初学记录(位运算)
位运算 Problem Description7-1 数组元素循环右移问题 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由 ...
- [转]Visual C++ RunTime的特征——非烫即屯
Visual C++ RunTime的特征——非烫即屯 大一刚学C语言,第二次上机课,当我发现我照着书抄写的程序在运行之外的黑框里面跳出一排“烫烫烫烫烫”,当时就震惊了.你们能想象一个来自小城, 在大 ...
- 第一次使用crontab linux选择编辑器问题
第一次使用crontab linux选择编辑器问题 第一次使用crontab 时,会出现no crontab for root - using an empty one“Select a editor ...
- web前端----jQuery属性操作
知识点总结 1.属性 属性(如果你的选择器选出了多个对象,那么默认只会返回出第一个属性). attr(属性名|属性值) - 一个参数是获取属性的值,两个参数是设置属性值 - 点击加载图片示例 remo ...
- Python入门之实现简单的购物车功能
Talk is cheap,Let's do this! product_list = [ ['Iphone7 Plus', 6500], ['Iphone8 ', 8200], ['MacBook ...
- C_Learning(3)
/ 结构体 / 声明结构体类型的一般形式: struct 结构体名[--表示的是这个结构体的类型] { 成员列表 }; [不要漏掉这个";"] / 声明结构可以放在main函 ...