查看: 1981|回复: 6

事件回调

[复制链接]

该用户从未签到

发表于 2009-11-19 17:13:31 | 显示全部楼层 |阅读模式
时间回调应该注意哪些问题呢,我什么我用的时候有错误, 间歇性的,就是运行时偶尔有错误,偶尔又正常。
当出现错误时跳到这里
void __cdecl _CRT_DEBUGGER_HOOK(int _Reserved)
{
    /* assign 0 to _debugger_hook_dummy so that the function is not folded in retail */
    (_Reserved);
    _debugger_hook_dummy = 0;
}
程序被强制中断了
上面的函数是dbghook.c 下的

该用户从未签到

发表于 2009-11-19 21:47:42 | 显示全部楼层
您给我看的代码段是没有意义的,它只是调试的出口而已,本身不会有什么问题,有问题也没有人(除了M$的人)能改得了。如果您希望与大家讨论自己的问题,请给出运行堆栈中与您的程序有关的部分

该用户从未签到

 楼主| 发表于 2009-11-20 14:24:10 | 显示全部楼层
本帖最后由 lxlbgd1 于 2009-11-20 14:26 编辑

#include <osgGA/GUIEventAdapter>
#include <osgGA/GUIEventHandler>
#include <osgGA/EventVisitor>

#include "TrInterfaceVedio.h"

//继承自osg::NodeCallback类,写一个事件回调类
class TrInterfaceVedioStateCallback : public osg::NodeCallback
{
public:
        TrInterfaceVedioStateCallback(TrInterfaceVedio* vedio)
        {
                _vedio = NULL;
                _vedio = vedio;        
        }

        virtual void operator()(osg::Node* node, osg::NodeVisitor* nv )
        {
                //判断访问器类型
                if (nv->getVisitorType()==osg::NodeVisitor::EVENT_VISITOR)
                {        //创建一个事件访问器并初始化
                        osgGA::EventVisitor* ev = dynamic_cast<osgGA::EventVisitor*>(nv);
                        if (ev)
                        {
                                //得到执行动作
                                osgGA::GUIActionAdapter* aa = ev->getActionAdapter();
                                //得到事件队列
                                osgGA::EventQueue::Events& events = ev->getEvents();

                                for(osgGA::EventQueue::Events::iterator itr=events.begin();
                                        itr!=events.end(); ++itr)
                                {
                                        //处理事件
                                        handle(*(*itr),*(aa));
                                }
                        }
                }
        }

        virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)
        {
                //得到场景数据
                /*osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);*/
                //osg::MatrixTransform* mt = dynamic_cast<osg::MatrixTransform*>(viewer->getSceneData());
                /*osg::Camera* camera = dynamic_cast<osg::Camera*> (viewer->getCamera());*/
                switch(ea.getEventType())
                {
                        case(osgGA::GUIEventAdapter::KEYDOWN):
                        {
                                if (ea.getKey()=='p')
                                  {
                                        {
                                                if( _vedio != NULL)
                                                {
                                                        if(_playToggle)
                                                        {
                                                                _playToggle = !_playToggle ;
                                                                _vedio->pauseVedio();
                                                               
                                                                // playing, so pause
                                                                std::cout<<"Pause"<<std::endl;
                                                        }
                                                        else
                                                        {
                                                                _playToggle = !_playToggle ;
                                                                _vedio->playVedio();
                                                               
                                                                // playing, so pause
                                                                std::cout<<"bofang"<<std::endl;
                                                        }
                                                }
                                                else
                                                        break;
                                                }
                                                return true;                        
                                  }
                                else if (ea.getKey()=='b')
                                  {
                                        //std::cout<<"Restart"<<std::endl;
                                        if(_vedio!=NULL)
                                        {
                                                _vedio->playVedio();
                                                // playing, so pause
                                                std::cout<<"bofang"<<std::endl;
                                        }
                                        return true;
                                  }
                                 // else if (ea.getKey()=='y')
                                 // {
                                        ////std::cout<<"yanshi"<<std::endl;
                                        //if(_text!=NULL)
                                        //{
                                        //        _text->autoHideText();
                                        //        /*_text->delay(1);
                                        //        _text->setCamera();*/
                                        //        
                                        //        // playing, so pause
                                        //        std::cout<<"yanshi"<<std::endl;
                                        //}
                                        //return true;
                                 // }
                                  //else if (ea.getKey()=='x')
                                  //{
                                         // //std::cout<<"yanshi"<<std::endl;
                                         // if(_text!=NULL)
                                         // {
                                                //
                                                //  //_text->autoHideText();
                                                //
                                                //  _text->delay(1);
                                                //
                                                //  _text->setCamera();
                                                // // playing, so pause
                                                //  std::cout<<"xianshi"<<std::endl;
                                         // }
                                         // return true;
                                  //}
                          }
                          default:
                                 return false;
                }
                return false;
}
               


private:
        TrInterfaceVedio* _vedio;
        
        // gif播放标志
        bool _playToggle;
};


然后进行 节点时间回调,回调有时能触发事件,但按几次键后,就出现我上面提到的错误。

该用户从未签到

 楼主| 发表于 2009-11-20 14:27:05 | 显示全部楼层
然后进行 节点时间回调,回调有时能触发事件,但按几次键后,就出现我上面提到的错误。

该用户从未签到

 楼主| 发表于 2009-11-20 14:28:28 | 显示全部楼层
p.s. 请问osgGA::GUIActionAdapter& aa是什么意思,可以不用吗? 谢谢

该用户从未签到

发表于 2009-11-20 15:28:41 | 显示全部楼层
我不同意把GUIEventHandler放在节点回调中的做法,那样得不到统一管理。正确的做法是加入到Viewer的addEventHandler队列中。此外那些动态变更的场景对象(例如您的_video和_text,如果它们是场景中绘制的对象的话),都必须设置为DYNAMIC

GUIActionAdapter相当于回馈事件的接收者,通常它可以转换为View*对象。例如,我们在接收了某个交互事件之后,希望因此将鼠标光标定位到屏幕中心(可以用requestWarpPointer来实现),这就是我们回馈的事件

该用户从未签到

 楼主| 发表于 2009-11-23 09:55:10 | 显示全部楼层
6# array
3ks
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表