当前位置: 首页 > news >正文

十四、OSG学习笔记-事件响应

上一章节

十三、OSG学习笔记-osgDB文件读写-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146165712

本章节代码:

OsgStudy/EventHandle · CuiQingCheng/OsgStudy - 码云 - 开源中国https://gitee.com/cuiqingcheng/osg-study/tree/master/OsgStudy/EventHandle

一、事件的概念

事件:是计算机应用程序和人通过外设进行交互的途径。

核心模块 OSG::GA,通过事件回调,遍历响应各个事件处理的handle方法,所以在是现实时,可以通过自定义handle处理方法,从而实现事件操作器;

示例代码如下:

/**
	osg 事件处理器
**/

#include <windows.h>
#include <iostream>

#include <osgViewer/Viewer>
#include <osgDB/ReaderWriter>
#include <osgDB/ReadFile>
#include <osgGA/GUIEventHandler>
#include <osg/MatrixTransform>


class TestInput:public osgGA::GUIEventHandler
{
public:
	// aa ,就是viewer
	bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa) override
	{
		osgViewer::Viewer* vw = dynamic_cast<osgViewer::Viewer*>(&aa);
		switch (ea.getEventType())
		{
		case osgGA::GUIEventAdapter::KEYDOWN:
			std::cout << ea.getKey() << std::endl;
			_keyMap[ea.getKey()] = true;
			if (((_keyMap['w'] == true) || (_keyMap['W'] == true)) && ((_keyMap['a'] == true) || (_keyMap['A'] == true)))
			{
				std::cout << "应该向左前方走" << std::endl;
			}

			if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Alt_L)
			{
				std::cout << "按下了左边的ALT键" << std::endl;
			}
			break;
		case osgGA::GUIEventAdapter::KEYUP:
			_keyMap[ea.getKey()] = false;
			break;
		case osgGA::GUIEventAdapter::PUSH:
			if (ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON)
			{
				std::cout << "左键点击(" << ea.getX() << "," << ea.getY() << ")" << std::endl;
			}
			else if (ea.getButton() == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON)
			{
				std::cout << "右键点击(" << ea.getX() << "," << ea.getY() << ")" << std::endl;
			}
			else if (ea.getButton() == osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON)
			{
				std::cout << "中键点击(" << ea.getX() << "," << ea.getY() << ")" << std::endl;
			}
			else {
			}
			break;

		case osgGA::GUIEventAdapter::DRAG:// 拖拽
			std::cout << "你DRAG了" << std::endl;
			break;
		case osgGA::GUIEventAdapter::SCROLL: // 滚轮事件
			if (ea.getScrollingMotion() == osgGA::GUIEventAdapter::SCROLL_UP)// 滚轮向上
			{
				osg::ref_ptr<osg::MatrixTransform> mx = new osg::MatrixTransform;
				mx->addChild(vw->getSceneData());
				mx->setMatrix(osg::Matrix::rotate(0.1, osg::Vec3f(1.0, 0, 0)));
				vw->setSceneData(mx);
			}
			else if (ea.getScrollingMotion() == osgGA::GUIEventAdapter::SCROLL_DOWN) // 滚轮向下
			{
				osg::ref_ptr<osg::MatrixTransform> mx = new osg::MatrixTransform;
				mx->addChild(vw->getSceneData());
				mx->setMatrix(osg::Matrix::rotate(-0.1, osg::Vec3f(1.0, 0, 0)));
				vw->setSceneData(mx);
			}
			break;
		case osgGA::GUIEventAdapter::RESIZE:
			std::cout << "改变窗口大小" << std::endl;
			break;
		default:
			break;
		}
		//return true;// 如果为true,这这个事件不往后传递。
		return false;
	}

private:
	std::map<int, bool>	_keyMap; // 按键状态记录map
};



int main()
{
	osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;

	viewer->setUpViewInWindow(50, 50, 1500, 1000);
	viewer->setSceneData(osgDB::readNodeFile("glider.osg"));
	osg::ref_ptr<TestInput> Test = new TestInput;
	viewer->addEventHandler(Test);// 加入事件
	viewer->run();
	return 0;
}

相关文章:

  • WEB攻防-PHP反序列化-字符串逃逸
  • 如何测试交换机数据回流
  • C#中修饰符——abstract、virtual
  • 天梯赛 PTAL2-009 抢红包
  • Hugging Face模型国内镜像HF Mirror下载
  • Python Pyecharts面试题及参考答案
  • OpenHarmony 开源鸿蒙北向开发——linux使用make交叉编译第三方库
  • 计算机四级 - 数据库原理(操作系统部分)- 第3章「进程线程模型」
  • 数据结构-------栈
  • AJAX的理解和原理还有概念
  • AI综合应用及办公应用
  • 工业控制系统中的信号传输格式解析
  • 函数闭包的学习
  • [JavaScript]如何利用作用域块避免闭包内存泄漏?
  • Moonlight-16B-A3B: 变革性的高效大语言模型,凭借Muon优化器打破训练效率极限
  • DNS缓存使用中有什么问题?DNS缓存有哪些作用?
  • 蓝桥杯day2:解码异或 后的数组
  • test_cases测试用例层/test_1_login
  • ubuntu中的环境变量文件 bashrc、profile、environment简要总结
  • 【Java篇】一气化三清:类的实例化与封装的智慧之道
  • 海警巡航时海豚围舰艇嬉戏,专家:证明海域生态环境持续向好
  • 先去上海后赴北京,苏中城市泰州为何接连拥抱顶流“大城”?
  • 七部门联合发布《终端设备直连卫星服务管理规定》
  • 庄语乐︱宋代历史是被“塑造”出来的吗?
  • 节前A股持续震荡,“五一”假期持股还是持币过节胜率更高?
  • 俄罗斯延长非法滞留外国人限期离境时间至9月