键盘为了保证实时性,一定要用立即模式!
鼠标可以使用缓冲的,这样可以得到一个连贯的输入状态。
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很优美!
另有一篇: