查看: 1171|回复: 4

单键切换画面怎么实现呢?总是出错,请大家帮帮忙,急啊

[复制链接]

该用户从未签到

发表于 2013-6-14 19:03:17 | 显示全部楼层 |阅读模式
  1. #include <osg/Group>
  2. #include <osg/Geode>
  3. #include <osg/PositionAttitudeTransform>
  4. #include <osgViewer/Viewer>
  5. #include <osgDB/readFile>
  6. #include <osg/ShapeDrawable>
  7. #include <osg/TexEnv>
  8. #include <osgDB/Registry>
  9. #include <iostream>
  10. #include <osgSim/MultiSwitch>
  11. #include <osg/DrawPixels>
  12. #include <osgUtil/Optimizer>

  13. //helpBoard的值在每次按下F1时改变一次
  14. class EventStateType
  15. {
  16. public:
  17.         EventStateType(void)
  18.         {
  19.                 helpBoard = true;
  20.         }

  21.         ~EventStateType(void)
  22.         {
  23.         }

  24.         bool helpBoard;
  25. };

  26. //定义一个人机交互事件处理器
  27. class helpNodeCallback : public osgGA :: GUIEventHandler
  28. {
  29. public:
  30.         virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor*)
  31.         {
  32.                 //动作适配器的对象为当前的场景视图
  33.                 osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);

  34.                 switch(ea.getEventType())
  35.                 {
  36.                 case osgGA::GUIEventAdapter::KEYDOWN:
  37.                         {
  38.                                 osg::Switch* helpNode = dynamic_cast<osg::Switch*>(viewer->getSceneData());
  39.                                 if(ea.getKey() == osgGA::GUIEventAdapter::KEY_F1)
  40.                                 {
  41.                                         //当捕获到键盘F1按下时改变bool型变量helpBoard(上文keyState类中)的值
  42.                                         keyState->helpBoard = !keyState->helpBoard;
  43.                                         //根据keyState->helpBoard的值来设定switch节点值
  44.                                         if(keyState->helpBoard == true)
  45.                                         {
  46.                                                 helpNode->setValue(0, true);
  47.                                                 helpNode->setValue(1, false);
  48.                                         }
  49.                                         else if(keyState->helpBoard == false)
  50.                                         {
  51.                                                 helpNode->setValue(0, false);
  52.                                                 helpNode->setValue(1, true);
  53.                                         }
  54.                                 }
  55.                         }
  56.                 default:
  57.                         break;
  58.                 }
  59.                 return false;
  60.         }

  61. protected:
  62.         EventStateType* keyState;

  63. };

  64. int main(int argc, char** argv)
  65. {
  66.         osg::ref_ptr<osg::Switch> helpNode = new osg::Switch;
  67.         helpNode->addChild(osgDB::readNodeFile("cessna.osg"),true);
  68.         helpNode->addChild(osgDB::readNodeFile("cessnafire.osg"),false);

  69.         osgViewer::Viewer viewer;
  70.         viewer.setSceneData(helpNode.get());
  71.         viewer.addEventHandler(new helpNodeCallback);
  72.         return viewer.run();
  73. }
复制代码
参考《OSG三维渲染引擎设计与实践》中处理键盘事件的范例设计一个键盘响应程序,打算实现按下F1画面由正常飞机切换为着火飞机,再次按F1画面由着火飞机切换回正常飞机,就是用F1单键实现切换如此往复的一个过程。可是总是报错,不知道什么原因,请大家帮帮给我指点指点啊,谢谢~~

该用户从未签到

发表于 2013-6-17 08:03:00 | 显示全部楼层
哪里有错??

该用户从未签到

 楼主| 发表于 2013-6-17 19:29:14 | 显示全部楼层
liuzhiyu123 发表于 2013-6-17 08:03
哪里有错??

编译的时候一点问题都没有,可是一旦运行后按下F1就不行了,自动停止工作了,找来找去发现不了问题……

该用户从未签到

发表于 2013-6-19 21:56:50 | 显示全部楼层
没有看到任何地方初始化了您的keyState

该用户从未签到

 楼主| 发表于 2013-6-19 22:35:51 | 显示全部楼层
array 发表于 2013-6-19 21:56
没有看到任何地方初始化了您的keyState

谢谢!看来我的基础实在太差了……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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