Ogre中OIS的输入的使用
OIS的使用有两种模式:缓冲模式和非缓冲模式。非缓冲方式能处理鼠标或键盘长按的事件,实时性强缓冲方式则不能长按事件,用于非实时响应。
非缓冲输入:
1、创建方式:其中 false 参数代表使用非缓冲模式
- OIS::Keyboard* mKeyboard;
- OIS::Mouse* mMouse ;
- mKeyboard = static_cast<OIS::Keyboard*>
- (mInputManager->createInputObject(OIS::OISKeyboard, false));
- mMouse = static_cast<OIS::Mouse*>
- (mInputManager->createInputObject(OIS::OISMouse, false));
2、在监听帧中的用法:
- bool frameStarted(const FrameEvent& evt)
- {
- mKeyboard->capture();
- mMouse->capture();
- if(mKeyboard->isKeyDown(OIS::XXXX))
- {
- }
- }
---------------------------------------------------------------------------------------------------------------------------------
缓冲输入:
1创建方式:其中 true参数代表使用非缓冲模式
- mKeyboard = static_cast<OIS::Keyboard*>
- (mInputManager->createInputObject(OIS::OISKeyboard, true));
- mMouse = static_cast<OIS::Mouse*>
- (mInputManager->createInputObject(OIS::OISMouse, true));
2、在监听帧中的用法:
首先,监听帧必须拥有回调的方法,就是说监听器应该这样:继承KeyListener,MouseListener
class ExitListener : public FrameListener,public OIS::KeyListener,public OIS::MouseListener
其次,监听帧必须实现以下方法:
bool mouseMoved(const OIS::MouseEvent &arg)
bool mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
bool mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
bool keyPressed(const OIS::KeyEvent &arg)
bool keyReleased(const OIS::KeyEvent &arg)
这些方法都是父类的纯虚接口,不得不实现他们。。正常运行时,发生事件后讲执行对应的函数。
要让这些函数起作用,还要做的事情是:
在 ExitListener 的构造函数(随便)中注册该类为回调类
- mMouse->setEventCallback(this);
- mKeyboard->setEventCallback(this);
最后,还要在每一帧更新输入
- bool frameStarted(const FrameEvent& evt)
- {
- mKeyboard->capture();
- mMouse->capture();
- }
非缓冲输入以及缓冲输入使用效果的最大区别:
非缓冲能处理 键盘或者鼠标 按住的事件
缓冲不能处理 键盘或者鼠标 按住的事件
非缓冲模式创建代码:
- OIS::ParamList pl;
- std::ostringstream windowHndStr;
- windowHndStr << (size_t)hwnd;
- pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
- //设置鼠标和键盘非游戏独占(鼠标可以显示在屏幕上并可以移动到窗口外)
- pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND" )));
- pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE")));
- m_InputManager = OIS::InputManager::createInputSystem(pl);
- //设置为缓冲模式,需要设置帧监听器继承方式public ExampleFrameListener,
- //public OIS::MouseListener, public OIS::KeyListener
- m_Keyboard = (OIS::Keyboard*)m_InputManager->createInputObject(OIS::OISKeyboard,true);
- m_Mouse = (OIS::Mouse*)m_InputManager->createInputObject(OIS::OISMouse,true);
- //注册侦听器
- m_Keyboard->setEventCallback(this);
- m_Mouse->setEventCallback(this);
- bool EditorFrameListener::mouseMoved(const OIS::MouseEvent &arg)
- {
- return true;
- }
- bool EditorFrameListener::mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
- {
- //std::ostringstream ss;
- //ss << "mousePressed_" << id;
- //LogManager::getSingletonPtr()->logMessage(ss.str().c_str());
- return true;
- }
- bool EditorFrameListener::mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
- {
- //std::ostringstream ss;
- //ss << "mouseReleased_" << id;
- //LogManager::getSingletonPtr()->logMessage(ss.str().c_str());
- return true;
- }
- bool EditorFrameListener::keyPressed(const OIS::KeyEvent &arg)
- {
- //std::ostringstream ss;
- //ss << "keyPressed" << arg.key;
- //LogManager::getSingletonPtr()->logMessage(ss.str().c_str());
- return true;
- }
- bool EditorFrameListener::keyReleased(const OIS::KeyEvent &arg)
- {
- //std::ostringstream ss;
- //ss << "keyReleased" << arg.key;
- //LogManager::getSingletonPtr()->logMessage(ss.str().c_str());
- return true;
- }
参考链接:
http://blog.sina.com.cn/s/blog_68f6e8a90100xz0z.html
http://blog.sina.com.cn/s/blog_515326f90100pici.html
Ogre中OIS的输入的使用的更多相关文章
- Ogre 中使用OIS的两种模式
关于OIS的输入 要开始考虑游戏输入的问题了,以及开始加入CEGUI也要考虑加入输入的问题.先把OIS的输入简单回忆一下. OIS有两种输入模式:非缓冲输入以及缓冲输入. 无论用哪种输入方式,都应该有 ...
- 教你一招:在PowerPoint中自定义可输入文本的占位符
日常生活中,当我们设计多媒体课件时,默认的版式其实已经够用了.但是,很多时候,我们需要更加个性一点,所以,我们需要自定义很多东西.本文介绍在PowerPoint中自定义可输入文本的占位符. 一.占位符 ...
- firefox浏览器中silverlight无法输入问题
firefox浏览器中silverlight无法输入问题 今天用firefox浏览silverlight网页,想在文本框中输入内容,却没想到silverlight插件意外崩溃了.google一下,发现 ...
- 在Ogre中加载自己的资源包
转自:http://www.cnblogs.com/minggoddess/archive/2011/02/19/1958472.html 由于数据保护的需要,一款游戏一般都会有自己独有的资源包,这样 ...
- Android中EditText设置输入条件
一.应用场景 之前做商城应用时,会有对用户资料的设置情况进行限制,如下: (1)用户邮箱,应当只允许输入英文字母,数字和@.两个符号, (2)用户手机,应当只能输入数字,禁止输入其他字符. (3)用户 ...
- Settings > Editor > Live Templates 中自定义快速输入
Settings > Editor > Live Templates 中自定义快速输入
- OGRE中Any 类型的实现
[OGRE中Any类型的实现] OGRE中实现了一个class Any,使用Any 可以在上下文中传递任意类型的数据.其本质实现原理就是通过指针. Any 只包含一个成员变量,类型为 placehol ...
- unigui 在单据中,某输入为必填项的 JS代码
给大家分享下在单据中,某输入为必填项,用红框标示的简单处理方法:UniSession.AddJS(UniEdit1.JSName+ '.el.setStyle({"border" ...
- Axiom3D:Ogre中Mesh网格分解成点线面。
这个需求可能比较古怪,一般Mesh我们组装好顶点,索引数据后,直接放入索引缓冲渲染就好了.但是如果有些特殊需要,如需要标注出Mesh的顶点,线,面这些信息,以及特殊显示这些信息. 最开始我想的是自己分 ...
随机推荐
- CFD计算
47 求解器为flunet5/6在设置边界条件时,specify boundary types下的types中有三项关于interior,interface,internal设置,在什么情况下设置相应 ...
- Scala深入浅出实战经典-----002Scala函数定义、流程控制、异常处理入门实战
002-Scala函数定义.流程控制.异常处理入门实战 Scala函数定义 语句结束无分号 定义无参函数 def 函数名称(参数名称:参数类型)[:Unit=]{ 函数体 } 老师的代码 我的实际代码 ...
- Ubuntu下freeradius的EAP-MD5,PEAPv0/EAP-MSCHAPv2,EAP-TTLS/MD5,EAP-TTLS/MSCHAPv2方式认证(基于mysql)
基于freeradius+mysql,今天验证下freeradius的EAP认证:1.EAP-MD5:2.EAP-PEAP 一.EAP-MD5方式认证 1.修改配置文件 (1)/usr/local/e ...
- C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别 <转>
作者:Statmoon 出处:http://leolis.cnblogs.com/ 在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为整型(int)来讲,有四种方法 ...
- aspx在页面跳转(Response.Redirect)时丢失session问题及解决办法
[问题描述] 假设a.aspx.cs页面保存有Session["empid"]="3",当a.aspx.cs通过Response.Redirect(" ...
- 第三章 DOM
节点的概念 5个常用的DOM方法:getElementById.getElementsByTagName.getElementsByClassName.getAttribute.getAttribut ...
- 移动混合开发之android文件管理-->flexbox,webFont。
增加操作栏,使用felxbox居中,felx相关参考网址:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html 使用webFont添加图标, ...
- wchar_t内置还是别名?小问题一则(升级公司以前代码遇到的问题)
问题: 原来的2008工程用2010编译后,运行程序出现无法定位程序输入点 *@basic_string@_WU@*和*@basic_string@G@* 解决: 关闭“语言选项”中“将WChar_t ...
- Android异步消息处理机制
安卓子线程无法直接更改UI,所以需要异步消息处理机制来解决 <?xml version="1.0" encoding="utf-8"?><Li ...
- DOM扩展之HTML5 插入标记
11.3.6 插入标记 当需要在文档中插入大量的HTML标记时,通过DOM操作就会是非常麻烦的,相对而言,使用插入标记的技术,直接插入HTML字符串不仅简单而且更快.以下插入标记相关的DOM操作已经纳 ...