osg中添加自定义事件UserEvent
2016-06-30 09:17
211 查看
添加自定义事件
首先osg在其内部通过osgGA::EventQueue类维护了一个事件队列,队列中的每一个事件都是一个osgGA::GUIEventAdapter对象(这个对象是用来存放所系统捕捉到的事件),在仿真循环阶段被系统捕捉到的所有事件都会被添加到这个事件队列中,之后会有一个事件遍历过程,在这个过程中实际上就是遍历这个事件队列,并且对事件队列中的每一个事件,它都会与我们在事件处理类中方法进行响应(如果事件处理类中没有对这个事件的处理则不会响应)。
(此代码来自于王锐老师的Beginner‘s Guide中240页)
[cpp] view
plain copy
struct TimerInfo : public osg::Referenced
{
TimerInfo( unsigned int c ) : _count(c) {}
unsigned int _count;
};
[cpp] view
plain copy
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类型进行判断即可对此事件进行处理,
[cpp] view
plain copy
//注意其参数是一个继承自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函数中对此事件进行响应了。
转载地址:http://blog.csdn.net/u010133496/article/details/41155033
首先osg在其内部通过osgGA::EventQueue类维护了一个事件队列,队列中的每一个事件都是一个osgGA::GUIEventAdapter对象(这个对象是用来存放所系统捕捉到的事件),在仿真循环阶段被系统捕捉到的所有事件都会被添加到这个事件队列中,之后会有一个事件遍历过程,在这个过程中实际上就是遍历这个事件队列,并且对事件队列中的每一个事件,它都会与我们在事件处理类中方法进行响应(如果事件处理类中没有对这个事件的处理则不会响应)。
(此代码来自于王锐老师的Beginner‘s Guide中240页)
[cpp] view
plain copy
struct TimerInfo : public osg::Referenced
{
TimerInfo( unsigned int c ) : _count(c) {}
unsigned int _count;
};
[cpp] view
plain copy
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类型进行判断即可对此事件进行处理,
[cpp] view
plain copy
//注意其参数是一个继承自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函数中对此事件进行响应了。
转载地址:http://blog.csdn.net/u010133496/article/details/41155033
相关文章推荐
- JConsole监控远程Tomcat服务器
- php上传中文文件名出现乱码
- 增加cacti监控对象时导致数据库出问题
- java基础之队列
- printf打印是字体和背景带颜色的输出的方法
- 两种方法实现在HTML页面加载完毕后运行
- 安卓获得状态栏高度
- java导出txt文本
- Matlab读取ply文件,polydata
- HTTPS加密传输数据,加强P2P平台网络安全和信任
- 4.php设计模式:状态模式的使用场景
- 48. Rotate Image ---leetcode算法笔记
- 项目中Gson解析的上拉加载下拉刷新(HttpUtils)
- Java学习2
- 如何通过插件携带第二个单据体到下游单据
- HTTPS加密传输数据,加强P2P平台网络安全和信任
- GCD网络加载图片
- 上拉下拉分页加载
- python-操作hive
- C#设置软件开机自动运行的方法(修改注册表)