读书人

[OGRE]基础教程回七发:来谈一谈缓冲绑

发布时间: 2013-10-12 11:54:02 作者: rapoo

[OGRE]基础教程来七发:来谈一谈缓冲绑定

上一章我们处理监听的方案是,每一帧只处理一次。

这一次,当鼠标键盘的事件发生时,我们会立即处理它。

这里只是对缓冲输入的一个简单介绍,而不是完整的如何使用OIS的教程。

若想了解更多内容,请查阅相关的OIS使用教程。


初始的项目源码如下:

上一次我们使用的是无缓冲的输入,也就是说,在每一帧里我们查询OIS::Keyboard和OIS::Mouse实例的状态,以判断它们是否被按下。

而缓冲输入使用了一个listener接口,以便在事件发生时通知你的程序。

比如,当一个键被按下时,会触发一个 KeyListener::keyPressed事件,

而当这个键被释放(不再按下)时,KeyListener::keyReleased事件被触发给所有已注册的KeyListener类。

这些能用在追踪按键的时间,或判断按键在上一帧中是否没有被按下。


关于OIS的监听系统有一点要注意的是,对于每一个Keyboard,Mouse,Joystick对象只能有一个监听器,这样是为了简单(也为了速度)。

多次调用setEventCallback函数的结果是只有最后一次注册的监听器才得到事件消息。

如果你有多个对象需要获得Key,Mouse事件,你只有自己写一个消息分发。


还有,千万记得在frameStarted方法里调用Keyboard::capture和Mouse::capture。

OIS不会使用线程来确定键盘鼠标的状态,所以你必须指明什么时候去获取输入。


OIS的KeyListener接口提供了两个纯虚函数。

第一个是keyPressed函数,每次按下某个键时调用它,

还一个是keyReleased,每次离开某个键时调用它,

传入这些函数的参数是一个KeyEvent,它包含被按下/释放的按键的键码。


鼠标监听界面MouseListener接口比KeyListener接口要稍微复杂一些。

它包含查看何时鼠标键被按下/释放的函数: MouseListener::mousePressed和 MouseListener::mouseReleased。

它还包含一个mouseMoved函数,当鼠标移动时调用它。

这些函数都接收一个MouseEvent对象,在state变量里保存着当前鼠标的状态。


需要注意的是,MouseState对象即包含了鼠标移动的相对XY坐标(即,从上一次调用MouseListener::mouseMoved开始,它所移动的距离),

还包含了绝对XY坐标(即,屏幕上的准确位置)。


在我们开始修改TutorialFrameListener之前,请注意先对TutorialFrameListener类做两处大的改变:

我们继承了OIS的MouseListener和KeyListener类,这样我们才能从它们那里接收事件。


同样,调用ExampleFrameListener构造器也有变化:

再对类中的变量稍作修改:

mContinue变量是frameStarted方法的返回值。

当mContinue为false的时候,程序退出。

mDirection变量指定了在每一个帧里我们如何移动摄像机节点。


在构造器里,我们像在上次那样初始化一些变量,并把mContinue设成true。添加如下代码到TutorialFrameListener的构造器里:

在ExampleFrameListener的构造器里已经取得了OIS的mMouse和mKeyboard对象。

我们调用这些输入对象的setEventCallback方法,把TutorialFrameListener注册成一个监听器。

最后,我们还要把mDirection初始化成零向量(因为我们最开始不需要它动):

找到TutorialFrameListener::keyPressed方法,每当键盘上一个键被按下时,都会调用这个方法并传入一个KeyEvent对象。

我们能够通过这个对象的key变量来获取按键的键码(KC_*)。基于这个值,我们构造一个switch,为绑定所有程序里用到的按钮。


我们需要在switch语句里为其它按钮做绑定。首先我们要让用户按1、2键进行视口的切换。

代码基本上与上次相同:

接下来我们要添加键盘移动。每次用户按下移动按键,我们都要朝正确的方向加上或者减去mMove:

当按键被释放时,我们要立即取消mDirection向量上的移动。找到keyReleased方法,添加如下代码:

好了,我们能根据按键输入对mDirection进行更新了。下面的代码与上次是一样的,添加到frameStarted函数里:

找到mousePressed函数并看看它的参数。用OIS,我们可以访问MouseEvent和MouseButtonID。

我们用MouseButtonID作为switch条件,来确定按下的是哪个按钮。用下面的代码替换掉mousePressed函数里的:

每当鼠标移动时我们都检查右键是否按下。如果是,我们基于相对运动来转动摄像机。

通过传入函数的MouseEvent对象,我们能获取相对运动。它包含一个switch变量,里面有鼠标的状态(是关于鼠标的详细信息)。

MouseState::buttonDown告诉我们是否一个特定的按钮被按下,而“X”和“Y”变量告诉我们鼠标的相对运动。找到mouseMoved方法,用以下代码替换掉原来的:

[OGRE]基础教程回七发:来谈一谈缓冲绑定





读书人网 >编程

热点推荐