ogre3D学习基础10 -- 键盘控制与鼠标控制(缓冲控制)
2013-09-05 16:50
495 查看
带缓冲的鼠标、键盘操作,这里的鼠标、按键事件会被各自的监听器捕获。其中OIS中定义的两个类MouseListener,KeyListener负责对事件的处理。我们需要使用这两个类的接口。
当一个键被按下时,会触发一个 KeyListener::keyPressed 事件,而当这个键被释放(不再按下)时,KeyListener::keyReleased 事件被触发给所有已注册的KeyListener 类。
鼠标键被按下/释放的函数: MouseListener::mousePressed 和MouseListener::mouseReleased. 它还包含一个 mouseMoved 函数,当鼠标移动时调用它。
第一,和上一节不一样的就是,TutorialFrameListener的父类又增加了两个,如下
而且我们增加了两个成员变量,用于获取指代鼠标和键盘。
第二,同样需要在每一帧渲染前捕获鼠标和键盘
第三,处理鼠标监听事件,首先实现鼠标左键开关灯,右键旋转摄像机
鼠标左键按下:
鼠标右键拖拽:
看过上一章,这里就不解释了。
键盘处理:
代码
这样写起来看着很明了,比上一章的if()好多了。同样可以在bool keyReleased(const OIS::KeyEvent &e);里做相应处理。
其他的没有改动。代码参考上一章的。
当一个键被按下时,会触发一个 KeyListener::keyPressed 事件,而当这个键被释放(不再按下)时,KeyListener::keyReleased 事件被触发给所有已注册的KeyListener 类。
鼠标键被按下/释放的函数: MouseListener::mousePressed 和MouseListener::mouseReleased. 它还包含一个 mouseMoved 函数,当鼠标移动时调用它。
第一,和上一节不一样的就是,TutorialFrameListener的父类又增加了两个,如下
class TutorialFrameListener:public ExampleFrameListener,public OIS::MouseListener ,public OIS::KeyListener { public: TutorialFrameListener(RenderWindow *win,Camera *cam,SceneManager *sceneMgr) :ExampleFrameListener(win,cam,true,true)//第三个参数指明是否使用带缓冲的键盘输入,第四个参数指明是否使用带缓冲的鼠标输入 { mCamNode = cam->getParentSceneNode(); mSceneMgr = sceneMgr; mRotate = 0.13;//滚动常量 mMove = 250;//移动常量 mContinue = true;//继续渲染 mMouse->setEventCallback(this);//注册鼠标监听 mKeyboard->setEventCallback(this);//注册键盘监听 mDirection = Vector3::ZERO;//初始化为零 } //其他代码 }
而且我们增加了两个成员变量,用于获取指代鼠标和键盘。
第二,同样需要在每一帧渲染前捕获鼠标和键盘
bool frameStarted(const FrameEvent& evt) { if (mMouse) { mMouse->capture(); } if (mKeyboard) { mKeyboard->capture(); } //实现更光滑的移动 mCamNode->translate(mDirection*evt.timeSinceLastFrame,Node::TS_LOCAL);//根据从上一帧到现在的时间,对平移大小进行缩放 return mContinue; }
第三,处理鼠标监听事件,首先实现鼠标左键开关灯,右键旋转摄像机
鼠标左键按下:
bool mousePressed(const OIS::MouseEvent &e,OIS::MouseButtonID id) { Light *light = mSceneMgr->getLight("light1"); switch(id) { case OIS::MB_Left: light->setVisible(!light->isVisible()); break; } return true; }
鼠标右键拖拽:
bool mouseMoved(const OIS::MouseEvent &e) { if (e.state.buttonDown(OIS::MB_Right)) { //拖动实体 mCamNode->yaw(Degree(-mRotate * e.state.X.rel),Node::TS_WORLD);// mCamNode->pitch(Degree(-mRotate * e.state.Y.rel),Node::TS_LOCAL);// } return true; }
看过上一章,这里就不解释了。
键盘处理:
bool keyPressed(const OIS::KeyEvent &e) { switch (e.key) { case OIS::KC_ESCAPE://按下esc时推出 mContinue = false; break; case OIS::KC_1://数字键1 mCamera->getParentSceneNode()->detachObject(mCamera); mCamNode = mSceneMgr->getSceneNode("CamNode1"); mCamNode->attachObject(mCamera); break; case OIS::KC_2://数字键2 mCamera->getParentSceneNode()->detachObject(mCamera); mCamNode = mSceneMgr->getSceneNode("CamNode2"); mCamNode->attachObject(mCamera); break; case OIS::KC_UP://前 case OIS::KC_W: mDirection.z -= mMove; break; case OIS::KC_DOWN://后 case OIS::KC_S: mDirection.z += mMove; break; case OIS::KC_LEFT://左 case OIS::KC_A: mDirection.x -= mMove; break; case OIS::KC_RIGHT://右 case OIS::KC_D: mDirection.x += mMove; break; case OIS::KC_PGDOWN://上 case OIS::KC_E: mDirection.y -= mMove; break; case OIS::KC_PGUP://下 case OIS::KC_Q: mDirection.y += mMove; break; } return true; }
代码
这样写起来看着很明了,比上一章的if()好多了。同样可以在bool keyReleased(const OIS::KeyEvent &e);里做相应处理。
其他的没有改动。代码参考上一章的。
相关文章推荐
- ogre3D学习基础10 -- 键盘控制与鼠标控制(直接控制)
- ogre3D学习基础13 -- 键盘控制网格动画mesh
- unity3d基础学习笔记9:3d动画控制
- 20171012学习笔记Selenium 2 第四章WebDriver API 4.2控制浏览器 4.3简单元素操作4.4鼠标事件4.5键盘事件
- ogre3D学习基础19 --- 材质的继承,纹理的滚动与旋转
- ogre3D学习基础15 -- 创建BSP Scene Manager
- 基础学习三(光照和键盘控制)
- ogre3D学习基础14 -- 雾化效果与天空面,天空盒,天空穹
- ogre3D学习基础3 -- 粒子与表层脚本
- ogre3D学习基础18 -- 材质的使用与脚本的简单书写
- ogre3D学习基础1 -- 核心对象与脚本技术
- ogre3D学习基础3 -- 粒子与表层脚本
- ogre3D学习基础17 --- 如何手动创建ogre程序
- Python学习笔记(十七)——用GUI自动化控制键盘鼠标
- 第四章 OGRE中的帧监听、鼠标键盘控制、绘画模式、计时器
- ogre3D学习基础9 -- 光源程序实例
- 【Unity 3D学习】鼠标点击控制人物移动到目标位置
- Ogre场景、节点、摄像机通过自动、鼠标、键盘控制移动
- OGRE缓冲鼠标键盘输入无法响应的问题
- 【Unity 3D学习】获取鼠标滑动方向(上下左右)-控制摄像机围绕物体旋转