Ogre中SDL转为OIS相关内容
Xcode Ogre1.10中加入OIS库实现SDL和OIS切换
一. 关于OIS库以及头文件的引用
关于OIS库及头文件我自己引用的Ogre1.9中的库及文件,
首先将文件导入Ogre1.10中
图 1.1 导入OIS.a文件
接下来导入.H文件
图1.2 导入OIS.h文件
二、将OIS类嵌入Ogre1.10框架中
Ogre1.10与Ogre1.9的区别在于1.10中新添加了一个OgreBites文件,这个文件里的主要放的东西应该是关于实现Ogre控制器的一些文件,主要更改的就是这个文件还有SampleBrowser这个文件。
1. 第一步,首先首先我们要定义一个宏,在Ogre1.10中在
2.1 图 OgreBuilSetting文件路径
有一个OgreBuildSetting.h文件,原本其中有一个SDL的宏要想实现OIS和SDL的切换我们需要在这个文件中再添加一个OIS的宏定义,这个文件相当于一个开关可以选择所使用的库。
添加内容如下
图2.2 添加OIS的宏定义
宏定义后的1,0相当于true和false 是否使用,1为使用,0为不适用。
2. 接下来要对Ogre的相关框架进行修改,首先在ogrebites文件夹中有一个OgreInput.h文件我们要在这个文件中定义关于OIS的结构类型当然首先要将IOS.H这个头文件引入进来
然后定义相关的结构类型
图 2.3 定义OIS相关类型
在OIS中是定义的关于鼠标键盘等相关的几个类,而SDL中是一些结构类型,不过基本相似,其次SDL中细分出了多个类型比如:SDL_MouseWheelEventSDL_MouseButtonEvent等,就是将鼠标的相关事件拆分了出来,而在OIS中是MouseEvent 类中包含了所有的鼠标事件,这个影响不大。只是在你用到那个鼠标的属性的时候直接调用就可以了。
3. 下一步开始改正各个文件(我做的时候是先编译一遍,看哪里有错就改,因为我之前对Ogre中调用SDL库的流程不太清楚,所有只能一点一点的改),首先在Ogre1.10中有一个叫OgreApplictionContext的头文件,这个是在1.9版本中没有的,这个文件主要就是将一些Window的和帧的监听类封装到了一起,所以再写OgreContext是直接继承这一个文件就可以了,而在1.9版本中还需要对这几个监听类分别进行继承。所以在SampleContext.h中我们给SampleContext分别继承几个类,
图 2.4 SampleContext继承的类
用OIS就需要继承这几个类。
4. 其实主要更改的地方还是在SampleBrowser中,首先要改的几个主要函数分别是 KeyPressed
代码如下:
图2.5 键盘事件的相关函数
这个函数是当键盘上的键被摁下时触发,OIS和SDL中对键盘事事件的区分如图所示。只是定义的方式有些不同,原理还是差不多的。
接下来的这里主要是改变几个key值而已
这几个判断的内容是关于选择哪一个Sample来运行的然后将值传给runSample()这个函数来进行运行。
图2.6keyPressed
接下来这个函数中还有几处改动的地方和上面改的方法一样,我就不一一赘述了。
mousePressed:
该函数是对鼠标键摁下时进行处理,首先OgreContext继承了
图2.7 OgreContext继承的父类
OgreContext继承的三个OIS的设备监听类。在MouseListener类中有三个纯虚函数
图2.8 MouseListener类中的纯虚函数
OIS鼠标函数调用流程如下:CocoaMouseView(这个函数是ogre自己封装的)—>OIS::MouseListener(OIS中关于鼠标监听的基类)——>SampleContext(继承了MouseListener这个监听类在该类中重写了虚函数mouseReleased)——>SampleContext(继承了SampleContext重写了虚函数mouseReleased【这个函数是控制Ogre demo的主界面的鼠标事件】)
图2.9OIS调用流程
重写mouseReleased函数
图2.10 重写mouseReleased函数
注:重写该函数是需要有两个值传入一个mouse事件和一个OIS定义的Button枚举类型的ID
虽然在后面我是通过OIS mouse evt中的state属性中的buttons属性来判断用户摁下的是哪一个键 这个是一种方法,另一种是通过这个ID类型来判断。但是不论用哪一个方法都需两个参数,因为基类中的纯虚函数是两个参数的。
其他的函数修改和这个函数一样。
5. 将这些基本的东西改好之后,接下来要建立一个设备管理器然后还需要一个setupInput函数 这个函数相当于获取到是哪一个设备正在输入然后进行回调
代码如下
图2.11setupInput函数
createInputDevices函数创建一个设备管理器
代码如下 该函数需要在setupInput中进行调用
图2.12 createInputDevices函数
这个setupInput函数最后要在SampleBrowser中进行调用
图2.13 setup函数
6. 最后需要在frameStarted帧开始时执行的函数中调用OIS的回调函数,captureInputDevices()函数,在Ogre1.9中用的是这个函数,1.10中SDL用的是pollEvents()函数
图2.14frameStarted函数
这个函数获取到是使用了哪一个设备,该函数实在SampleContext中重写的frameStarted中进行调用。
图2.15 回调OIS的capture函数
OIS中的capture中是个纯虚函数,
图 2.15 capture函数
InputContext中进行的函数实现,这个InputContext头文件在1.10中没有好像是OIS中带有的一个文件,我直接将这个文件加入到了1.10的Include文件夹下,直接进行的引用
图 2.16 capture函数的具体实现
这六步做完后,再将一些小错误更改一下就可以了。
本人也是初学Ogre,如果有什么错误,请大家多多包涵,也请大家不吝赐教。