Ogre的主循环(Root::startRendering)类似这样:
1、Root object调用frameStarted方法在所有已经注册的FrameListeners中。
2、Root object渲染一帧。
3、Root object调用frameEnded方法在所有已经注册的FrameListeners中。
帧的注册方法
mRoot->addFrameListener(mFrameListener);
每一帧都有方法frameStarted、frameEnded
bool frameStarted(const FrameEvent& evt)
bool frameEnded(const FrameEvent& evt)
对于在每一帧需要做什么,都可以在上面两个方法中实现
利用这一点,可实现鼠标、键盘的非缓冲方式
步骤:
1、设置帧监听器继承方式public ExampleFrameListener
设置鼠标键盘的处理方式
在构造函数中:ExampleFrameListener(win, cam, false, false)
在 frameStarted中:
2、鼠标键盘指针捕获事件
mMouse->capture();
mKeyboard->capture();
3、通过事件类型进行相应的处理
if(mKeyboard->isKeyDown(OIS::KC_ESCAPE))
return false;
if(mMouse->getMouseState().buttonDown(OIS::MB_Left))
return true;
鼠标、键盘的缓冲方式
1、设置帧监听器继承方式public ExampleFrameListener, public OIS::MouseListener, public OIS::KeyListener
设置鼠标键盘的处理方式
在构造函数中:ExampleFrameListener(win, cam, true, true)
这样就不再需要手工写捕获事件的代码capture
2、构造函数里注册侦听器
mMouse->setEventCallback(this);
mKeyboard->setEventCallback(this);
3、实现消息处理函数
// MouseListener
bool mouseMoved(const OIS::MouseEvent &e)
bool mousePressed(const OIS::MouseEvent &e, OIS::MouseButtonID id)
bool mouseReleased(const OIS::MouseEvent &e, OIS::MouseButtonID id)
// KeyListener
bool keyPressed(const OIS::KeyEvent &e)
bool keyReleased(const OIS::KeyEvent &e)