DirectInput的立即模式与缓冲模式

键盘为了保证实时性,一定要用立即模式!
鼠标可以使用缓冲的,这样可以得到一个连贯的输入状态。
第一段引用自http://blog.csdn.net/sosidami/archive/2009/10/23/4719465.aspx
DirectInput 设备以立即模式获取输入信息,例如,如果键盘按键的速度非常快,那么在DirectInput读取数据那一刻之前的案件数据将不能被DirectInput设备读取。与立即模式相对的是缓冲模式,此时设备输入数据即将被放进缓冲区中供DirectInput设备使用。对于游戏开发来说,通常依照键盘和游戏杆的各种按键执行画面的更新,因此,利用DirectInput设备的立即模式来读取它们的输入数据较为适宜。相反在一个画面中鼠标的移动式连贯的,为了在游戏程序可多次连续的鼠标移动量,就需要采用DirectInput的缓冲模式来读取鼠标的输入。

看看Ogre提供的ExampleFrameListener的构造函数声明:
ExampleFrameListener(
                          RenderWindow* win, 
                          Camera* cam, 
                          bool bufferedKeys = false, 
                          bool bufferedMouse = false,
                          bool bufferedJoy = false
)
Keyboard,mouse,joystick默认都是立即模式。
假如需要要对keyboard采取立即模式,对mouse采取缓冲模式,可以这样新建ExampleFrameListener对象,new ExampleFrameListenr(win, cam, false, true);
然后还需要实现一些鼠标的响应函数,例如mousePressed,mouseMouved,mouseReleased.
最终在ExampleFrameListener的构造函数中创建keyboard与mouse的代码如下:
//Create all devices (We only catch joystick exceptions here, as, most people have Key/Mouse)
mKeyboard = static_cast<OIS::Keyboard*>
                      (mInputManager->createInputObject( OIS::OISKeyboard, bufferedKeys ));
mMouse = static_cast<OIS::Mouse*>
                      (mInputManager->createInputObject( OIS::OISMouse, bufferedMouse ));
try {
mJoy = static_cast<OIS::JoyStick*>
                      (mInputManager->createInputObject( OIS::OISJoyStick, bufferedJoy ));
} catch(...) {
        mJoy = 0;
}
代码采取异常方式创建Joy stick很优美!
另有一篇:

你可能感兴趣的:(游戏,keyboard,CAM)