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时需要自己注入输入消息,使用缓冲模式条理比较清晰,处理比较简单。
    在同一个游戏中是能同时存在缓冲以及非缓冲输入的!

  • 相关阅读:
    svn command line tag
    MDbg.exe(.NET Framework 命令行调试程序)
    Microsoft Web Deployment Tool
    sql server CI
    VS 2010 One Click Deployment Issue “Application Validation did not succeed. Unable to continue”
    mshtml
    大厂程序员站错队被架空,只拿着五折工资!苟活和离职,如何选择?
    揭秘!Windows 为什么会蓝屏?微软程序员竟说是这个原因...
    喂!千万别忘了这个C语言知识!(~0 == -1 问题)
    Linux 比 Windows 更好,谁反对?我有13个赞成理由
  • 原文地址:https://www.cnblogs.com/nafio/p/9137696.html
Copyright © 2011-2022 走看看