当前位置: 首页 > 工具软件 > Irrlicht > 使用案例 >

Irrlicht源码解析(一)

班言
2023-12-01

 

1、什么是Irrlicht

Irrlicht是一个3D游戏引擎。它具有高效,实时等特点,是个完全跨平台的引擎,使用D3D、OpenGL和它的自己的渲染程序。支持动态的阴影,粒子系统,角色动画,室内和室外技术以及碰撞检测等。(http://www.oschina.net/p/irrlicht)

 

Irrlicht的源码写的非常棒,结构非常清晰,也非常简单易读,建议希望进一步学习软件或者C++的童鞋都读一下。

 

2、Irrlicht源码结构

gui impl:

对gui控件进行一些封装,当然都是自绘的控件。这样就可以在游戏中显示出不同的控件来。比如聊天系统,背包等。

io impl:

对文件系统,xml,zip,tar等进行封装,里面的文件系统都只采用了crt的函数,所以能够实现跨平台的支持。

irr impl:

这里对各个平台的窗口机制以及其他的一些API进行封装。

scene impl:

这里貌似对图形处理的一些类。

video impl:

对图形引擎进行封装,比如将d3d,Opengl等绘图的部分进行封装,对外部进行隔离起来。

 

3、Irrlicht窗口封装(仅分析Windows部分)

为了有个思路,这里我们用irr自带的example1(Hello World)来说明,下面是main的代码:

 

 

这里可以看到,使用Irrlicht实际上是很简单的,它帮助我们完成了大多数的功能。下面对这段代码这段代码进行详细说明(仅针对Windows平台,下面未说明都指Windows平台),首先创建设备对象:

 

createDevice会调用到Irrlicht.cpp里面的createDeviceEx函数,如下所示:

createDeviceEx利用宏隔离各个平台的差异,这里产生了一个CIrrDeviceWin32对象,这个类里面对Windows的窗口机制进行了封装,下面我们详细说明一下这个类:

CIrrDeviceWin32的构造函数里面,先后完成了注册窗口类,创建窗口等工作后,最底下有一句代码将句柄和window类的指针加入到一个全局的map里面,方便在窗口消息来临的时候进行回调。一般来说,游戏的窗口都很少,所以这样对速度也不会有太大影响。


然后用这几句代码分别创建了一个鼠标控制器、driver和Scene,以后再详细说明。

 

 

 

构造函数我们看完了,现在回到main函数,下面几句设置窗口标题(其实里面就调用了SetWindowText),然后添加一个text为“Hello World! This is the Irrlicht Software renderer!”的静态控件,Irr里面用IGUIEnvironment接口来对窗口里面的控件进行管理,这个接口定义了一系列的增加控件的方法。

 

 

 

再往下面,就是游戏编程的典型逻辑,在run里面对Windows消息进行处理,不处理消息的时候就进行绘图。收到close消息的时候循环退出。有几句跟窗口逻辑关系不大的没有罗列出来。

 

 

在beginScene和endScene之间完成绘图的逻辑。我们现在只看看消息处理的部分,在device->run里面可以看到,跟典型的Windows消息派发一样,现在我们来看看消息处理函数:

 

 

在全局函数WndProc(位于CIrrDeviceWin32.cpp)里面(代码太多,就不罗列了)将消息转换为Irr的Event格式,然后从全局表里面找到窗口的this指针,最后调用postEventFromUser进行转发消息。第二篇会我们在看一下irr的控件结构。

 

 

4、结语

本文简单的介绍了Irrlicht的窗口管理,给初学者一些参考,后续会陆续对这个引擎进行其他的介绍,如果有不对的地方,尽管拍砖。希望能够给您带来帮助。

 

 类似资料: