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的输入的使用的更多相关文章

  1. Ogre 中使用OIS的两种模式

    关于OIS的输入 要开始考虑游戏输入的问题了,以及开始加入CEGUI也要考虑加入输入的问题.先把OIS的输入简单回忆一下. OIS有两种输入模式:非缓冲输入以及缓冲输入. 无论用哪种输入方式,都应该有 ...

  2. 教你一招:在PowerPoint中自定义可输入文本的占位符

    日常生活中,当我们设计多媒体课件时,默认的版式其实已经够用了.但是,很多时候,我们需要更加个性一点,所以,我们需要自定义很多东西.本文介绍在PowerPoint中自定义可输入文本的占位符. 一.占位符 ...

  3. firefox浏览器中silverlight无法输入问题

    firefox浏览器中silverlight无法输入问题 今天用firefox浏览silverlight网页,想在文本框中输入内容,却没想到silverlight插件意外崩溃了.google一下,发现 ...

  4. 在Ogre中加载自己的资源包

    转自:http://www.cnblogs.com/minggoddess/archive/2011/02/19/1958472.html 由于数据保护的需要,一款游戏一般都会有自己独有的资源包,这样 ...

  5. Android中EditText设置输入条件

    一.应用场景 之前做商城应用时,会有对用户资料的设置情况进行限制,如下: (1)用户邮箱,应当只允许输入英文字母,数字和@.两个符号, (2)用户手机,应当只能输入数字,禁止输入其他字符. (3)用户 ...

  6. Settings > Editor > Live Templates 中自定义快速输入

    Settings > Editor > Live Templates 中自定义快速输入

  7. OGRE中Any 类型的实现

    [OGRE中Any类型的实现] OGRE中实现了一个class Any,使用Any 可以在上下文中传递任意类型的数据.其本质实现原理就是通过指针. Any 只包含一个成员变量,类型为 placehol ...

  8. unigui 在单据中,某输入为必填项的 JS代码

     给大家分享下在单据中,某输入为必填项,用红框标示的简单处理方法:UniSession.AddJS(UniEdit1.JSName+ '.el.setStyle({"border" ...

  9. Axiom3D:Ogre中Mesh网格分解成点线面。

    这个需求可能比较古怪,一般Mesh我们组装好顶点,索引数据后,直接放入索引缓冲渲染就好了.但是如果有些特殊需要,如需要标注出Mesh的顶点,线,面这些信息,以及特殊显示这些信息. 最开始我想的是自己分 ...

随机推荐

  1. Altium Designer自动更新——解决方法

    今天,打开AD,一直显示更新,关机重启也不管事. 然后,我把AD安装目录下,system文件夹下的Installation文件夹删了.就不再更新了.

  2. Java_DOM创建XML

    import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream; ...

  3. 数论学习笔记之解线性方程 a*x + b*y = gcd(a,b)

    ~>>_<<~ 咳咳!!!今天写此笔记,以防他日老年痴呆后不会解方程了!!! Begin ! ~1~, 首先呢,就看到了一个 gcd(a,b),这是什么鬼玩意呢?什么鬼玩意并不 ...

  4. iOS socket保持后台连接 ios9.0 xcode8.0

    可以保持后台,但申请上架是肯定会被拒的 本教程是基于AsyncSocket库的简单开发! socket机制今天就不说了,毕竟百度上太多太详尽了! 1.先new一个工程: ​2.要写socket的界面遵 ...

  5. What does it mean to “delegate to a sister class” via virtual inheritance?

    Consider the following example: class Base { public: ; ; }; class Der1 : public virtual Base { publi ...

  6. 捉虫记(四)线程安全导致的HighCpu

    一个朋友QQ群里说网站启动后会cpu很高,想要帮忙看一下dump. 1.打开windbg加载dump文件后第一个命令lmf,这个命令显示加载的dll以及路径,这样子可以找个dll来帮忙加载sos,(额 ...

  7. Enable rsh on MAC OS with command line

    1. Enable rsh on macos. 1). os version (10.0) Enabling the "Allow remote login" option tur ...

  8. android 定时任务

    使用timertask进行定时任务 首先创建TimerTask: class SynchroTimerTask extends TimerTask { @Override public void ru ...

  9. UVA 572 油田连通块-并查集解决

    题意:8个方向如果能够连成一块就算是一个连通块,求一共有几个连通块. 分析:网上的题解一般都是dfs,但是今天发现并查集也可以解决,为了方便我自己理解大神的模板,便尝试解这道题目,没想到过了... # ...

  10. ae学习

    Ae           提供者CoSA 1993年1月 版本1.0 代号Egg 主要加入法人功能layered compositing with mask, effect, transforms, ...