OSG学习笔记9-处理键盘事件

//处理键盘事件

#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

时间: 2024-10-07 08:43:43

OSG学习笔记9-处理键盘事件的相关文章

笔记-[2]-JS键盘事件.

键盘事件主要有两种: onkeydown:当键盘按下的时候触发 onkeyup:当键盘按键抬起的时候触发 例子: <script type="text/javascript"> window.onload=function(){ var oTxt=document.getElementById('txt'); oTxt.onkeyup=function(ev){ var ev=ev || window.event; if(ev.keyCode==13 &&

jquery学习笔记(三)事件和动画

一.ready机制 $(document).ready( function(){} ) $().ready( function(){} ) $( function(){} )  jquery的ready函数会在dom准备完毕后执行,并且可以多次使用 $(selector).load( function(){} ) 此方法相当于js自身的onload方法 如 $(window).load(function(){})    相当于  window.onload=function(){} ------

JS学习笔记9之event事件及其他事件

-->鼠标事件-->event事件对象-->默认事件-->键盘事件(keyCode)-->拖拽效果 一.鼠标事件 onclick ---------------鼠标点击事件oncontextmenu------鼠标右键点击onmouseover --------鼠标移上onmouseout ---------鼠标移出onmousedown -------鼠标按下onmousemove -------鼠标移动onmouseup ----------鼠标抬起 1 <head

React学习笔记(5)--事件

分类: web前端2015-08-29 08:42 33人阅读 评论(0) 收藏 举报 1.事件处理函数的使用 组件: React 自有方法 用户定义方法 事件处理函数可以接受event参数: 如之前用过的: [html] view plaincopy //监听内容的变化并且记录在状态中 handleChange: function(event){ this.setState({inputText: event.target.value}); }, //添加提交按钮并打印结果 handleSub

【OSG学习笔记之一:】OSG+VS2010+win7 64位环境搭建

虽然出生的时候,没有说过“Hello World!”,但是自从走上了编程之路,每一次输出“Hello World!”的时候,都觉得好比中了彩票大奖似的: 仔细算算,从2012年暑假到现在,经历了3年半的光阴,这段时间,不仅是知识.阅历.成长获得最大的一段,也是人生的一大转折点.在这期间,得以继续深造学习自己的专业,虽然踏入这行的时候,也是调剂来的,但是我用这3年的时间,恶补自己7年的不足:2015年,发生了三件大事,我毕业了,我工作了,我有女票了(三件事的重要程度递增):吃得苦中苦,方位人上人,

[读书笔记]C#学习笔记二: 委托和事件的用法及不同.

前言:  C#委托是什么 c#中的委托可以理解为函数的一个包装, 它使得C#中的函数可以作为参数来被传递, 这在作用上相当于C++中的函数指针. C++用函数指针获取函数的入口地址, 然后通过这个指针来实现对函数的操作. 委托的定义和方法的定义类似, 只是在定义的前面多了一个delegate关键字. 正文: 委托可以被视为一个更高级的指针,它不仅仅能把地址传指向另一个函数,而且还能传递参数,返回值等多个信息. 系统还为委托对象自动生成了同步,异步的调用方式,开发人员使用BeginInvoke,E

Java学习笔记(二)事件监听器

Java实现对组件事件(如单击.输入等)的监听和JavaScript类似,都是先添加Listener,再写触发函数,不同的是,Java实现监听前必须使用implements将各个接口添加到类内. 相关的库为java.awt.event.* 例如要添加行为事件的接口ActionListener,则需要在实现窗口的类内作如下操作: public class Test extends JFrame implements ActionListener{     public Test(){       

Quick cocos2dx-Lua(V3.3R1)学习笔记(十三)-----继续触摸事件之多点触摸

在前面,我们提过了单点触摸,下面我们就试一下多点触摸的用法(我用的是cocos code ide进行手机调试,不会的,进入前一篇查看) function MainScene:ctor() local sprite = display.newSprite("close.png") --自己随便找个图片资源吧 sprite:align(display.CENTER, display.cx, display.cy) sprite:addTo(self) sprite:setTouchEnab

ExtJS学习笔记2:响应事件、使用AJAX加载数据

响应事件: 1.设置一个html标记 <div id="my-div">Ext JS 4 Cookbook</div> 2.使用get函数获取此标记对象 var el = Ext.get('my-div'); 3.将响应函数和对象的事件绑定 el.on('click', function(e, target, options){ alert('The Element was clicked!'); alert(this.id); }, this); 4.一次也可