zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    纹理mag filter不能取GL_XXX_MIPMAP_XXXX
    (转)No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VA 解决办法
    轻松制作儿童趣味算术软件
    批处理设置IP地址
    安卓手机文件管理器简单横向评比
    Linux基础和网络管理上机试题
    值得收藏的批处理程序
    王垠:完全用Linux工作
    XINU安装程序.exe一键配置好XINU实验环境
    很全面的WinRAR实用技巧系列
  • 原文地址:https://www.cnblogs.com/beeasy/p/6127758.html
Copyright © 2011-2022 走看看