Ogre 是使用 OIS 这个开源的输入框架来处理用户的键盘或鼠标事件的。
需要引入 OIS.h 头文件
#include "OIS.h"
int main()
{
Ogre::Root* root = new Ogre::Root("plugins_d.cfg");
// 创建我们的主窗口
Ogre::RenderWindow* window = root->initialise(true,"My Ogre Render Window");
// 首先需要创建一个InputManager对像的指针,它来负责管理所有的输入事件
// 使用 OIS::InputManager::createInputSystem(size_t winHandle); 方法。它需要用户提拱一个窗口的句柄,也就是告诉OIS。这个输入系统是为哪个窗口服务的。
size_t winHnd;
// 我们使用 RenderWindow 的 getCustomAttribute() 方法来得到这个主窗口的句柄.
window->getCustomAttribute("WINDOW",&winHnd);
// OK . 这样我们就可以创建一个做用为 window窗口的 输入系统了。
OIS::InputManager Input = OIS::InputManager::createInputSystem(winHnd);
// 使用这个输入 系统创建 键盘输入处理物体
OIS::Keyboard* keyboard = static_cast<OIS::Keyboard*>(Input->createInputObject(OIS::OISKeyboard,false));
// 创建鼠标处理物体
OIS::Mouse* mouse = static_cast<OIS::Mouse*>(Input->createInputObject(OIS::OISMouse,false));
// 渲染
while(!window->isClosed()) {
// 得到键盘事件,当按下 Escape 时,关闭主窗口.
keyboard->capture();
if (keyboard->isKeyDown(OIS::KC_ESCAPE))
window->destroy();
// 渲染一帧
root->renderOneFrame();
// 处理其它事件
Ogre::WindowEventUtilities::messagePump();
}
return 0;
}
注意: 你可以将N个 FrameListener 加入在Root中。 不过。。。。 你不能在每个 FrameStarted 的代码段里都加入 mouse->capture(). 这样。只会有一个 Listener的Mouse事件被运行。 你可需要在第一个加入 capture() 即可。 其它的Listener中 就不需要加了。