OIS并不是ogre的一部分,它是一个独立的轻量级的开源输入框架,想使用它需要引入一个类似OIS_d.dll的动态库(也可以自己编译源码获取)。
InputManager :作为OIS的管理者是得到所有输入设备的入口
- InputManager * g_InputManager = 0;
- g_InputManager = InputManager::createInputSystem(g_hWnd);
这里需要注意得的是必须传入一个窗口句柄进去,明确当前InputManager是为谁服务的。
1.非缓冲输入: 这种模式最大的特点就是没有特点(没有对输入控制对象进行特殊处理),这种模式下OIS基本上只是取到了一个创建和管理输入设备的作用,比较原始。
- 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));
第二个参数为false即为非缓冲输入。
在ogre中使用:
- bool frameStarted(const FrameEvent& evt)
- {
- mKeyboard->capture();
- mMouse->capture();
- if(mKeyboard->isKeyDown(OIS::XXXX))
- {
- }
- }
2.缓冲输入 :OIS通过回调的方式,让代码看起来更加整洁,除此之外或许还做了其他的事情。
- OIS::Object* obj = mInputMgr->createInputObject(OIS::OISKeyboard, true);
- mKeyboard = static_cast<OIS::Keyboard*>(obj);
- mMouse = static_cast<OIS::Mouse*>(mInputMgr->createInputObject(OIS::OISMouse, true));
-
- mKeyboard->setEventCallback(this);
- mMouse->setEventCallback(this);
除第二个参数为true以外,每个对象还需要通过回调函数获取一个事件处理对象,针对不同的输入设备,事件处理对象的类型不同。
OIS::KeyListener
bool keyPressed(const OIS::KeyEvent &arg)
bool keyReleased(const OIS::KeyEvent &arg)
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)
ogre里面使用:
- bool frameStarted(const FrameEvent& evt)
- {
- mKeyboard->capture();
- mMouse->capture();
- }
非缓冲输入与缓冲输入的区别:非缓冲输入可以相应鼠标或键盘持续按下的事件。