TutorialFrameListener是示例教程给的监听器,从下面可以看出它继承哪些监听器
class TutorialFrameListener : public ExampleFrameListener, public OIS::MouseListener, public OIS::KeyListener
下面一个个分析:
(1)ExampleFrameListener
这个监听器声明如下:
class ExampleFrameListener: public FrameListener, public WindowEventListener
可以看出它继承与FrameListener帧监听器和WindowEventListener 窗体事件监听器
ExampleFrameListener类中定义了几个跟键盘和鼠标以及游戏手柄有关的成员变量如下:
//OIS Input devices
OIS::InputManager* mInputManager;
OIS::Mouse* mMouse;
OIS::Keyboard* mKeyboard;
OIS::JoyStick* mJoy;
类的构造函数原型如下:
ExampleFrameListener(RenderWindow* win, Camera* cam, bool bufferedKeys = false, bool bufferedMouse = false,bool bufferedJoy = false ) ;
其中,bufferedXXX由客户继承此类决定是否使用缓冲输入对应的设备。
在类的构造函数中实例化上面几个成员变量:
win->getCustomAttribute("WINDOW", &windowHnd);
windowHndStr << windowHnd;
pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
mInputManager = OIS::InputManager::createInputSystem( pl ); //输入管理器需要要一个窗口相关的参数
//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; }
ExampleFrameListener类剩下的东西就是实现部分他的父类FrameListener和 WindowEventListener 的virtual方法。
FrameListener帧监听器:
下面是FrameListener类的截图
可以看出,监听器就是一个简单的显示器,这个类里只有三个简单的被root对象在它的renderOneFrame函数里依次调用的三个函数。
WindowEventListener监听器:
这个类在示例教程中没用到,它也很简单,就只有5个关于窗体状态变化的函数,截图如下:
另外在这个窗体监听器类的头文件中还定义了一个WindowEventUtilities类,好像是Ogre封装了windows消息循环,以配合WindowEventListener使用。
(2)MouseListener鼠标监听器
这个监听器所在头文件截图如下:
从图中可以看出,MousListener类很简单,就是三个关于鼠标状态的函数。
关于MoueButtonID是个OIS命名空间下的枚举类型:
enum MouseButtonID
{
MB_Left = 0, MB_Right,