OSG学习笔记9-处理键盘事件
2016-05-06 21:14
615 查看
//处理键盘事件 #include"stdafx.h" #include<osg/Switch> #include<osgDB/ReadFile> #include<osgGA/GUIEventHandler> #include<osgViewer/Viewer> class KeyboardHandler :public osgGA::GUIEventHandler//人机交互事件处理器 { public: //重构父类GUIEventHandler.handle,事件处理函数,自定义交互操作, //参数1:当前传入此处理器的事件,只可以被获取,不能被修改 //参数2:反馈动作,动作适配器,可以获取也可以修改的参数,大部分时候这个传入值表示当前所用的视图对象View,可以用它来获取 // 或控制视景器的状态变化。如:osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa); //参数3:对象指针obj,保存该处理器的对象,可能是当前事件回调所在的Node节点指针,也可能是Drawable指针 //参数4:传递该事件的访问器(EventVisitor),nv通常为当前时间访问器指针。 virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa, osg::Object* obj, osg::NodeVisitor* nv) { osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa); if (!viewer)return false; switch (ea.getEventType())//判断事件,做出响应 { case osgGA::GUIEventAdapter::KEYDOWN://ea.getEventType()获取到的如果是键盘事件 if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Space)//空格,控制鼠标到屏幕中间 { int width = ea.getWindowWidth(); int heigth = ea.getWindowHeight(); viewer->requestWarpPointer(width*0.5, heigth*0.5); } else { osg::Switch* root = dynamic_cast<osg::Switch*>(viewer->getSceneData()); if (!root) return false; //按下1为第一个不着火的飞机,2,着火飞机,3,牛 if (ea.getKey() == '1') { root->setValue(0, true); root->setValue(1, false); root->setValue(2, false); } else if (ea.getKey() == '2') { root->setValue(0, false); root->setValue(1, true); root->setValue(2, false); } else if (ea.getKey() == '3') { root->setValue(0, false); root->setValue(1, false); root->setValue(2, true); } return true; } break; default:break; } return false; } }; int main(int argc, char** argv) { osg::ref_ptr<osg::Switch> root = new osg::Switch; root->addChild(osgDB::readNodeFile("cessna.osg"), true);//为开关节点添加3个子节点。第一个设置为可见,true。 root->addChild(osgDB::readNodeFile("cessnafire.osg"), false); root->addChild(osgDB::readNodeFile("cow.osg"), false); osgViewer::Viewer viewer; viewer.setSceneData(root.get()); viewer.addEventHandler(new KeyboardHandler);//追加用户自定义的交互事件处理器,这里是键盘响应事件。这时就开始接受事件了。 return viewer.run(); }代码思路如下图:主函数中建立一个root根节点,该节点是开关节点,具有开关属性,设置了三个子节点,给viewer添加了键盘事件处理器,可以对键盘事件进行响应。
键盘人机交互事件处理器,获取键盘事件,并对需要被操作的,视图对象,root开关节点对象做出响应。
b
相关文章推荐
- Dubbo源码分析(五):Dubbo内核实现之SPI简单介绍
- 6.fork + execve:一个进程的诞生
- KMP算法的个人理解
- js 事件冒泡和事件捕获的区别
- C++实验5-字符串
- Java通过JDBC连接到MySQL
- node.js 读写文件
- 动态规划1001
- Handler
- Android Studio JNI 环境搭建
- 引用MSScriptControl.ScriptControl 在服务器上运行报错 字符转换公式
- 全文检索的基本原理
- #1040 : 矩形判断
- hdu4745区间dp
- 存档……【假装自己会刷题【怎么写着写着成了日记啊
- select 源码学习记录
- UVA 10003 Cutting Sticks(区间 DP)
- 新的Visual C++代码优化器
- Ubuntu16.04 配置环境变量的三种方法
- 读取磁盘文件