在Ogre中使用OIS的两种模式(非缓冲输入和缓冲输入)

转载 2011年01月22日 15:14:00
在Ogre中使用OIS的两种模式(非缓冲输入和缓冲输入)

一.非缓冲方式能处理鼠标或键盘长按的事件,实时性强

缓冲方式则不能长按事件,用于非实时响应。

非缓冲方式

步骤:

1、设置帧监听器继承方式public ExampleFrameListener

    设置鼠标键盘的处理方式

    在构造函数中:ExampleFrameListener(win, cam, false, false)

在 frameStarted中:

2、鼠标键盘指针捕获事件

bool frameStarted(const FrameEvent &evt)
{

    mMouse->capture();
     mKeyboard->capture();

//3、通过事件类型进行相应的处理

    if(mKeyboard->isKeyDown(OIS::KC_ESCAPE))
        return false;
    if(mMouse->getMouseState().buttonDown(OIS::MB_Left))

        return true;
}

 

缓冲方式

1、设置帧监听器继承方式public ExampleFrameListener, public OIS::MouseListener, public OIS::KeyListener

    设置鼠标键盘的处理方式

    在构造函数中:ExampleFrameListener(win, cam, true, true)

    这样就不再需要手工写捕获事件的代码capture

2、构造函数里注册侦听器

        mMouse->setEventCallback(this);
       mKeyboard->setEventCallback(this);
3、实现消息处理函数

// MouseListener
    bool mouseMoved(const OIS::MouseEvent &e)
    bool mousePressed(const OIS::MouseEvent &e, OIS::MouseButtonID id)
    bool mouseReleased(const OIS::MouseEvent &e, OIS::MouseButtonID id)

// KeyListener
    bool keyPressed(const OIS::KeyEvent &e);
    bool keyReleased(const OIS::KeyEvent &e);

 

二.OIS 输入系统中的缓冲输入与无缓冲输入的区别是无缓冲输入是每帧监听键盘和鼠标的输入状态,而缓冲输入则是用触发式的方法监听输入状态。

当某个键被按下时,那么该键的按下事件就被触发,当一个键被释放时,该键的释放事件就被触发,而且事件触发后,这个事件会告知注册的监听该设备的帧监听器。

特别重要的是OIS 输入系统对键盘,鼠标和手柄分别只能建立一个监听关系,这完全是为了简洁和效率。多次调用setEventCallback 函数的结果是真正起作用的是最后一次调用。如果你有多个对象需要接受键盘,鼠标或者手柄消息,你必须手动发送消息。值得一提的是我们仍然在frameStarted 中调用Mouse::capture 或者Keyboard::capture 来捕获状态。OIS 没有应用多线程技术,因而在你的程序中,你必须指定在何时捕获设备的输入状态。

KeyListener 接口
KeyListener 接口提供了两个纯虚函数,其中之一是keyPressed 函数和keyRelease 函数,函数参数是KeyEvent。
MouseListener 接口
MouseListener 接口比KeyListener 接口稍微复杂一点,不仅包含处理鼠标按键函数,还包括处理鼠标移动的函数。参数是MouseEvent。必须记住的时,鼠标移动所触发的事件中的MouseState 对象不仅包含X,Y 移动的相对坐标,也包含X,Y 在屏幕上的绝对坐标。

 

非缓冲输入以及缓冲输入使用效果的最大区别:

非缓冲能处理 键盘或者鼠标 按住的事件

缓冲不能处理 键盘或者鼠标 按住的事件

 

对C语言输入输出流和缓冲区的深入理解

导读:对C语言输入输出流和缓冲区的深入理解,C语言缓冲区(缓存)详解,缓冲区又称为缓存,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,缓冲区根据其对应的是输入设备还是输出设备,分...
  • SHRDLU
  • SHRDLU
  • 2015年10月06日 10:08
  • 9827

Java输入输出流与缓冲区的使用

Input/Output流: 将外设中的数据读取到内存中就是输入。 将内存中的数据写入到外设中就是出。 I/O流就是用来处理设备间的数据传输。用于操作流的对象都放在IO包中。 流按操作方式分为...
  • fu755383249
  • fu755383249
  • 2014年10月17日 17:51
  • 2083

sed原理及sed命令格式 ,缓存区,模式空间

4.1            Sed工作原理   sed是一个非交互式的流编辑器。所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出;而所谓流编辑器,是...
  • huangjin0507
  • huangjin0507
  • 2016年04月28日 14:40
  • 1308

Ogre 中使用OIS的两种模式

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

Ogre笔记七:基础教程四—帧监听器和非缓冲输入

非缓冲输入,个人觉得不怎么好用,但是在某些特殊场景下可能会有大用。 首先,我们了解一下这一节教程想实现个什么东西: 我们将把一个忍者放到屏幕中,并在场景中加上点光源。 当你点击鼠标左键,灯光会打...
  • tyyzqmf
  • tyyzqmf
  • 2011年09月14日 18:48
  • 869

Ogre基础教程5:有缓冲输入

介绍利用OIS的有缓冲输入。 设置场景 对有缓冲输入的介绍 键盘监听器以及交互 鼠标监听器交互 为摄像机定位设置场景节点 注册监听器 捕获输入状态 处理输入事件 改变视点 摄像机运动...
  • u010930289
  • u010930289
  • 2015年06月18日 09:05
  • 556

Ogre笔记八:基础教程五—缓冲输入

没太多好说的,这一章要实现的目标跟上一章一样,但是用到的方法相比较而言高级一点,我懒得解释直接复制教程里的。 缓冲输入的介绍:       在上一次课里,我们使用的是无缓冲的输入,也就是说,在每一...
  • tyyzqmf
  • tyyzqmf
  • 2011年09月15日 21:35
  • 561

Ogre基础教程4:监听器类与无缓冲输入处理

Ogre 基础教程 4 监听器与无缓冲输入
  • u010930289
  • u010930289
  • 2015年06月17日 22:16
  • 297

关于Ogre自带输入系统OIS(Object-Oriented Input System)的源码分析

在看Ogre源码的时候注意到了这个开源的输入系统OIS,全称是Object-Oriented Input System。 好像我看到有人称为 Open Input System,不管叫什么总之还挺好...
  • love0_0xin
  • love0_0xin
  • 2012年03月25日 18:08
  • 2896

我的字符缓冲输入流(装饰设计模式)

装饰设计
  • u010423091
  • u010423091
  • 2015年07月30日 02:32
  • 200
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在Ogre中使用OIS的两种模式(非缓冲输入和缓冲输入)
举报原因:
原因补充:

(最多只允许输入30个字)