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

来源:互联网 发布:大数据时代概念 编辑:程序博客网 时间:2024/05/01 14:25
(转自)http://hi.baidu.com/%D3%EF%D1%D4%D7%B7%C7%F3%D5%DF/blog/item/5288a6828a9d5ad7bc3e1e85.html
在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 在屏幕上的绝对坐标。

 

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

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

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

 

原创粉丝点击