osg中添加自定义事件UserEvent
添加自定義事件
首先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函數中對此事件進行響應了。
轉載地址:http://blog.csdn.net/u010133496/article/details/41155033
?
總結
以上是生活随笔為你收集整理的osg中添加自定义事件UserEvent的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美股周四:特斯拉跌近6%,热门中概股强劲
- 下一篇: uboot初识