Ogre监听器原理详解

本文详细介绍了Ogre中的监听器原理,包括ExampleFrameListener、MouseListener和KeyListener的使用。ExampleFrameListener作为帧监听器和窗体事件监听器的组合,负责管理OIS输入设备。MouseListener和KeyListener则分别处理鼠标和键盘事件。监听器的工作方式分为缓冲和非缓冲输入,缓冲输入使用事件回调,而非缓冲输入则需要在每一帧中手动查询设备状态。Ogre的SdkTray系统提供了一个更高级别的事件处理机制,简化了用户对控件事件的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值