zoukankan      html  css  js  c++  java
  • Ogre 中使用OIS的两种模式

    关于OIS的输入
    要开始考虑游戏输入的问题了,以及开始加入CEGUI也要考虑加入输入的问题。先把OIS的输入简单回忆一下。
    OIS有两种输入模式:非缓冲输入以及缓冲输入。
    无论用哪种输入方式,都应该有个输入设备管理器先,例如:(这代码仅仅是举例而已)
        在Ogre中的一个例子。。。。
        OIS::InputManager*                            m_pInputManager;
        size_t windowHnd = 0;
        std::ostringstream windowHndStr;
        OIS::ParamList pl;
        RenderWindow *win = m_pRoot->getAutoCreatedWindow();
        win->getCustomAttribute("WINDOW", &windowHnd);
        windowHndStr << windowHnd;
        m_pInputManager = OIS::InputManager::createInputSystem(pl);
    非缓冲输入:
    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();
    }
    非缓冲输入以及缓冲输入使用效果的最大区别:
    非缓冲能处理 键盘或者鼠标 按住的事件
    缓冲不能处理 键盘或者鼠标 按住的事件
    使用CEGUI时需要自己注入输入消息,使用缓冲模式条理比较清晰,处理比较简单。
    在同一个游戏中是能同时存在缓冲以及非缓冲输入的!

  • 相关阅读:
    错误代码 0x800700b7 配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler”节
    字符型设备驱动程序-first-printf以及点亮LED灯(一)
    翻译 TI SerialBLEbridge V 1.4.1
    lwip TCP client & FreeRTOS 打开TCP 的 保活机制 LWIP_TCP_KEEPALIVE==1
    lwip TCP client 客户端 & FreeRTOS
    CC2540 OSAL 学习其中原理,以及 给任务 添加 一个事件(定时发送串口消息)
    跟我一起学Linux-线程创建,类似FreeRTOS创建任务
    用 S5PV210 学习 Linux (三) SD卡下载
    用 S5PV210 学习 Linux (二) 刷机(二)
    用 S5PV210 学习 Linux (一) 刷机(一)
  • 原文地址:https://www.cnblogs.com/nafio/p/9137696.html
Copyright © 2011-2022 走看看