Ogre中SDL转为OIS相关内容

Xcode Ogre1.10中加入OIS库实现SDL和OIS切换

 

一.         关于OIS库以及头文件的引用

关于OIS库及头文件我自己引用的Ogre1.9中的库及文件,

首先将文件导入Ogre1.10中

Ogre中SDL转为OIS相关内容

                                                               图 1.1 导入OIS.a文件

接下来导入.H文件

Ogre中SDL转为OIS相关内容

图1.2 导入OIS.h文件

二、将OIS类嵌入Ogre1.10框架中

   Ogre1.10与Ogre1.9的区别在于1.10中新添加了一个OgreBites文件,这个文件里的主要放的东西应该是关于实现Ogre控制器的一些文件,主要更改的就是这个文件还有SampleBrowser这个文件。

1.     第一步,首先首先我们要定义一个宏,在Ogre1.10中在

Ogre中SDL转为OIS相关内容

2.1 图 OgreBuilSetting文件路径

有一个OgreBuildSetting.h文件,原本其中有一个SDL的宏要想实现OIS和SDL的切换我们需要在这个文件中再添加一个OIS的宏定义,这个文件相当于一个开关可以选择所使用的库。

 

添加内容如下

 Ogre中SDL转为OIS相关内容

图2.2 添加OIS的宏定义

宏定义后的1,0相当于true和false 是否使用,1为使用,0为不适用。

2.     接下来要对Ogre的相关框架进行修改,首先在ogrebites文件夹中有一个OgreInput.h文件我们要在这个文件中定义关于OIS的结构类型当然首先要将IOS.H这个头文件引入进来

然后定义相关的结构类型

Ogre中SDL转为OIS相关内容

                                                   图 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分别继承几个类,

 Ogre中SDL转为OIS相关内容

                                       图 2.4 SampleContext继承的类

用OIS就需要继承这几个类。

 

4.      其实主要更改的地方还是在SampleBrowser中,首先要改的几个主要函数分别是 KeyPressed

代码如下:

Ogre中SDL转为OIS相关内容

                                       图2.5  键盘事件的相关函数

 

这个函数是当键盘上的键被摁下时触发,OIS和SDL中对键盘事事件的区分如图所示。只是定义的方式有些不同,原理还是差不多的。

 

 

 

 

 

 

 

 

接下来的这里主要是改变几个key值而已

这几个判断的内容是关于选择哪一个Sample来运行的然后将值传给runSample()这个函数来进行运行。

Ogre中SDL转为OIS相关内容

                                                              图2.6keyPressed

接下来这个函数中还有几处改动的地方和上面改的方法一样,我就不一一赘述了。

 

mousePressed

该函数是对鼠标键摁下时进行处理,首先OgreContext继承了

Ogre中SDL转为OIS相关内容

图2.7 OgreContext继承的父类

OgreContext继承的三个OIS的设备监听类。在MouseListener类中有三个纯虚函数

Ogre中SDL转为OIS相关内容

                                                     图2.8 MouseListener类中的纯虚函数

OIS鼠标函数调用流程如下:CocoaMouseView(这个函数是ogre自己封装的)—>OIS::MouseListener(OIS中关于鼠标监听的基类)——>SampleContext(继承了MouseListener这个监听类在该类中重写了虚函数mouseReleased)——>SampleContext(继承了SampleContext重写了虚函数mouseReleased【这个函数是控制Ogre demo的主界面的鼠标事件】)

Ogre中SDL转为OIS相关内容

                                                        图2.9OIS调用流程

 

 

 

 

重写mouseReleased函数

Ogre中SDL转为OIS相关内容

 图2.10 重写mouseReleased函数

注:重写该函数是需要有两个值传入一个mouse事件和一个OIS定义的Button枚举类型的ID

虽然在后面我是通过OIS mouse evt中的state属性中的buttons属性来判断用户摁下的是哪一个键 这个是一种方法,另一种是通过这个ID类型来判断。但是不论用哪一个方法都需两个参数,因为基类中的纯虚函数是两个参数的。

 

 

其他的函数修改和这个函数一样。

5.     将这些基本的东西改好之后,接下来要建立一个设备管理器然后还需要一个setupInput函数 这个函数相当于获取到是哪一个设备正在输入然后进行回调

代码如下

Ogre中SDL转为OIS相关内容

Ogre中SDL转为OIS相关内容

                                                 图2.11setupInput函数

 

 

 

 

createInputDevices函数创建一个设备管理器

代码如下  该函数需要在setupInput中进行调用

 Ogre中SDL转为OIS相关内容

                                                     图2.12 createInputDevices函数

这个setupInput函数最后要在SampleBrowser中进行调用

Ogre中SDL转为OIS相关内容

Ogre中SDL转为OIS相关内容

Ogre中SDL转为OIS相关内容

                 图2.13 setup函数

6.     最后需要在frameStarted帧开始时执行的函数中调用OIS的回调函数,captureInputDevices()函数,在Ogre1.9中用的是这个函数,1.10中SDL用的是pollEvents()函数

Ogre中SDL转为OIS相关内容

                                                       图2.14frameStarted函数

这个函数获取到是使用了哪一个设备,该函数实在SampleContext中重写的frameStarted中进行调用。

                                             Ogre中SDL转为OIS相关内容

图2.15 回调OIS的capture函数

OIS中的capture中是个纯虚函数,


                                                             Ogre中SDL转为OIS相关内容 图 2.15 capture函数

 

InputContext中进行的函数实现,这个InputContext头文件在1.10中没有好像是OIS中带有的一个文件,我直接将这个文件加入到了1.10的Include文件夹下,直接进行的引用

Ogre中SDL转为OIS相关内容

                   图 2.16 capture函数的具体实现

这六步做完后,再将一些小错误更改一下就可以了。

本人也是初学Ogre,如果有什么错误,请大家多多包涵,也请大家不吝赐教。