参考:http://blog.csdn.net/l_andy/article/details/51058907

添加自定义事件

首先osg在其内部通过osgGA::EventQueue类维护了一个事件队列,队列中的每一个事件都是一个osgGA::GUIEventAdapter对象(这个对象是用来存放所系统捕捉到的事件),在仿真循环阶段被系统捕捉到的所有事件都会被添加到这个事件队列中,之后会有一个事件遍历过程,在这个过程中实际上就是遍历这个事件队列,并且对事件队列中的每一个事件,它都会与我们在事件处理类中方法进行响应(如果事件处理类中没有对这个事件的处理则不会响应)。

(此代码来自于王锐老师的Beginner‘s Guide中240页)

  1. struct TimerInfo : public osg::Referenced
  2. {
  3. TimerInfo( unsigned int c ) : _count(c) {}
  4. unsigned int _count;
  5. };
  1. bool TimerHandler::handle( const osgGA::GUIEventAdapter& ea,
  2. osgGA::GUIActionAdapter& aa )
  3. {
  4. switch ( ea.getEventType() )
  5. {
  6. case osgGA::GUIEventAdapter::FRAME:
  7. if (_count % 100 == 0 )
  8. {
  9. osgViewer::Viewer* viewer =
  10. dynamic_cast<osgViewer::Viewer*>(&aa);
  11. if ( viewer )
  12. {
  13. //在这里,我们添加了一个用户自定义的时间,我们只需要在下面的时间类型中对USER类型进行判断即可对此事件进行处理,
  1. //注意其参数是一个继承自Reference类的对象。
  2. viewer->getEventQueue()->userEvent(
  3. new TimerInfo(_count) );
  4. }
  5. }
  6. _count++;
  7. break;
  8. case osgGA::GUIEventAdapter::USER:
  9. if ( _switch.valid() )
  10. {
  11. //同过getUserData方法,直接获取用户数据(我们在上面传入的继承自Reference类的对象)
  12. const TimerInfo* ti =
  13. dynamic_cast<const TimerInfo*>( ea.getUserData());
  14. std::cout << "Timer event at: " <<ti->_count<<
  15. std::endl;
  16. _switch->setValue( 0, !_switch->getValue(0) );
  17. _switch->setValue( 1, !_switch->getValue(1) );
  18. }
  19. break;
  20. default:
  21. break;
  22. }
  23. return false;
  24. }

在上面这个handle函数中,我们定义了对两个事件的处理,一个为FRAME事件,另一个为USER事件,在FRAME事件的处理中,首先判断_count值是否能呗100整除(在每一个FRAME事件中都会使_count值加一),即每过100帧就会执行一遍if语句下面的内容。在if语句中,它通过调用userEvent方法将事件加入到事件队列中。

上面的图片是userEvent函数的实现源码,我们可以看到在调用userEvent方法时,其函数内部的实现如上,首先设置时间类型为USER(即我们用此方法添加到事件队列中的事件的类型为USER),其次调用setUserData方法设置用户数据,之后设置时间,最后通过addEvent方法将其添加到事件队列中去。这样我们就能在事件处理的handle函数中对此事件进行响应了。

[osg]osg自定义事件的理解的更多相关文章

  1. vue2.0中v-on绑定自定义事件的理解

    vue中父组件通过prop传递数据给子组件,而想要将子组件的数据传递给父组件,则可以通过自定义事件的绑定. 每个Vue实例都实现了[事件接口],即: 1.使用 $on(eventName) 监听事件 ...

  2. Javascript事件模型系列(四)我所理解的javascript自定义事件

    被我拖延了将近一个月的javascript事件模型系列终于迎来了第四篇,也是我计划中的最后一篇,说来太惭愧了,本来计划一到两个星期写完的,谁知中间遇到了很多事情,公司的个人的,搞的自己心烦意乱浮躁了一 ...

  3. 理解的javascript自定义事件

    理解的javascript自定义事件 被我拖延了将近一个月的javascript事件模型系列终于迎来了第四篇,也是我计划中的最后一篇,说来太惭愧了,本来计划一到两个星期写完的,谁知中间遇到了很多事情, ...

  4. 关于vue自定义事件中,传递参数的一点理解

    例如有如下场景 先熟悉一下Vue事件处理 <!-- 父组件 --> <template> <div> <!--我们想在这个dealName的方法中传递额外参数 ...

  5. C#:委托和自定义事件

    1. 委托概述 “委托”相当于C++中的“函数指针”,委托必须与所要“指向”的函数在“参数”和“返回类型”上保持一致; // 定义Person类 public class Person { publi ...

  6. 【2016-11-11】【坚持学习】【Day24】【WPF 自定义控件 附加属性 自定义事件】

    UserControl ,自定义控件. 这里刚刚想到一个问题.什么时候应该用usercontrol 定义一个控件.什么时候应该重写控件的template和样式,实现新效果. 引用一下人家的话:http ...

  7. Qt自定义事件的实现(转)

    原文:http://blog.csdn.net/michealtx/article/details/6866094 初学Qt,用了Qt自带的事件,然后想怎么才能定义自己的事件呢?又如何使用自定义事件呢 ...

  8. 使用C#的自定义事件

    public class CarDealer { public Action<string> NewCarInfo; //使用系统定义的泛型委托 public void NewCarCom ...

  9. Qt自定义事件的实现(军队真正干活,但要增加监军,大平台通知事件,事件内容自定义)

    初学Qt,用了Qt自带的事件,然后想怎么才能定义自己的事件呢?又如何使用自定义事件呢?看了篇文章,说先要子类化QEvent,然后定义自己的QEvent::Type,然后重写QWidget::event ...

随机推荐

  1. Map<String, String>循环遍历的方法

    Map<String, String>循环遍历的方法 Map<String, String>循环遍历的方法 Map<String, String>循环遍历的方法 下 ...

  2. gcc升级

    升级到4.8[这个应该是目前最新的啦,不过网上查的话已经到5.2啦,感觉落后一点比较稳,当然还有就是这个版本是新的里面使用最多的]wget http://people.centos.org/tru/d ...

  3. php端口号设置和查看

  4. php 5.0 新字符串

    简介:新字符串以“<<<”开始,后边紧跟子字符串标记,之后为字符串内容,最后用标记和分号结束. 说明:"<<<标记"后不要有空格符,否则可能出现 ...

  5. 多线程---ReentrantLock

    package com.test; import java.util.Collection; import java.util.concurrent.locks.Lock; import java.u ...

  6. python基础七--集合

    12.221.昨日内容回顾 小数据池: int:-5--256 str:1.不能有特殊字符 2.*int不能超过20 编码:所能看到的最小构成单位叫字符 ascii : 8位 1字节 表示1个字符 u ...

  7. 为什么采用4~20mA的电流来传输模拟量?(转)

    源: 为什么采用4~20mA的电流来传输模拟量?

  8. Python Web学习笔记之TCP的3次握手与4次挥手过程

    前言 尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务.TCP提供一种面向连接的.可靠的字节流服务. 面向连接意味着两个使用TCP的应用(通常是一个客户和一个服 ...

  9. Python网络爬虫案例(二)——爬取招聘信息网站

    利用Python,爬取 51job 上面有关于 IT行业 的招聘信息 版权声明:未经博主授权,内容严禁分享转载 案例代码: # __author : "J" # date : 20 ...

  10. android 实践项目 总结 (修改)

    Android手机定位与地图实现 在一个不熟悉的环境中,获得自己的位置,选择合适的就餐地点,住宿和公交路线成为一项难题.本次的实践项目就是为了解决上述难题的,通过调用百度地图的接口实现定位.查询公交路 ...