游戏引擎的组成成分我们通常说一个优秀的游戏引擎必须支持大量完善的功能。这些功能包括:曲线面、动态光源、体积雾、镜面反射、框架、天空盒、顶点阴影、粒子系统、静态和动态网格模型。如果你已经知道他们是如何工作的,你也许就能很好的把他们加入你的游戏引擎中。不过别急,在你开始编写你的引擎之前,请构思一下你的引擎框架。如果你急于立即编写你的引擎,那么很遗憾,你将不得不为新加入的特效和功能重写大量代码。所以在编写引擎之前,我们先要认真的思考这个问题。让我们来分析一下一个完善的3D游戏引擎是由哪些部分组成的。注意,我不能肯定这样分类是最好的,但至少它在我的游戏中工作得很好。好了,废话少说,游戏引擎的基本组成分为:系统、控制台、支持、着色器/引擎核心、游戏界面,和工具/数据。工具/数据在游戏开发过程中数据报告,你肯定会用到一些数据,然而很不幸,他们不象写一段文本或定义一个立方体那样简单,你至少需要3D模型编辑器,关卡编辑器以及图形软件。你能买到或者在网上找到一些免费的软件来满足你的要求。但不幸的是,你可能需要更多的工具软件,而这些软件现在没有,那么你就需要自己编写他们。你可能需要编写出一个关卡编辑器或者你需要的其他东西因为你无法从别的途径终获得。
你也可能需要写一段代码把大量的文件打包,当然,整天对着这么多文件是非常痛苦的。你还可能需要写一个转换器,能把3D模式编辑器格式转换成你需要的格式。你可能需要用工具处理游戏数据,如可能的计算和光照图(lightmaps).最重要的是你可能为工具软件所编写的代码跟游戏代码一样长或更长。开始你能找到你要的格式和工具,但你迟早会发现他们不能适用于你的引擎,最终你将放弃他们。在你编码时,要小心这些工具是否适用于你的引擎。你要时刻注意,修改和扩展你的工具,特别是当你将引擎发布为开源的和允许修改的。你也许要花同样多的时间去制作图形,关卡,声音,音乐和模型。系统系统是引擎和计算机进行交流的一部分.判断一个引擎的好坏是看他的系统是否能很好的移植到不同的平台.系统包括几个子系统,他们是图象,输入,声音,时间器,结构.系统能很好地安装,更新,卸载他全部的子系统.图象子系统很简单.他负责把一些东西在屏幕上画出来.人们写这一部分一般用OpenGL,Direct3D,Glide或者软件渲染器.最好你能提供多个API接口,把图象子系统放在他们的上面,这样能给用户更多的选择.这是一个很大的困难,因为不是所有的API都是相同的.输入子系统接受所有的输入(键盘,鼠标,游戏键盘和操纵杆),并统一他们以便于控制子系统的提取.例如,在游戏中,将需要检查是否用户想改变他的游戏角色的位置.输入子系统将检查用户的每一个输入操作,并检查所有的设备.这便于用户的控制,也便于多个输入执行相同的活动.声音子系统是用于载入和播放声音.这看起来很简单,但许多当前的游戏支持3D声音,因此这件事也变得很复杂.3D游戏引擎的许多东西是建立在时间的基础上(在这里,我指的是real-time游戏),因此你需要一些时间管理程序,这就是时间器子系统.这里很简单,但是做任何事都要花时间,同样一个象样的时间器程序将让你不断的重写代码.结构单元建立在上述的子系统基础上.他用于读取结构文件,共同的线参数(commandlineparameters),安装需要的方法.当他们是被安装和运行时,其他的子系统排列在这个系统中.这使他很容易改变决定(resolution),颜色深度,键值绑定,声音支持项,或者导入的游戏.使你的游戏引擎结构化,这样能使他容易测试并也许用户按他们喜欢的方式设置.控制我知道每个人喜欢跟着流行走,喜欢Quake的控制方式.但这确实是个好建议.你能在你的游戏和你的引擎中改变设置通过控制变量和函数,而不用重新开始他.对于在开发中输出调试信息是最好的.通常你将需要测试一些变量并输出,有时控制是很快,有时又比运行调试器好.有时你的引擎运行时,如果有错误,你不得不退出程序,你应该好好的对待这些错误.如果你不想你的用户看见或者使用这个控制系统,最好的办法是使他失效,但这肯定是不明智的.支持在引擎中,这个系统是用于支持其他的系统.这包括所有的数学程序(矢量,面,矩阵等等),内存管理器,文件管理器,包容器(如果你对自己的没信心,用STL).这个东西很基本,你能很好的用于其他的项目.渲染器/引擎核心我敢打赌没有一个人不喜欢3D图形渲染.因为有如此多的方法渲染3D世界.但最重要的就是渲染器,确认一下对于不同的事情,你有不同的组件。
在这个子系统中,我把渲染器分成了下面几个部分:Visibility,冲突检测,回应,摄象机,静态几何,动态集合,粒子系统,Billboarding,网格,天空盒,灯光,雾,顶点明暗和输出。这一部分需要一个接口,以便于设置,位置,方向和其他系统需要的部分容易改变。一个最应该注意的部分是featurbloat.想一下你在设计阶段应该做什么。一个非常好的方法是用三角形renderpipeline穿过相同的点。(在这里,我不是指一个三角形,而是三角形列,扇形,条,等等)你也可以用同样的方法将要的东西转化成能穿过相同的灯光,雾和阴影,最后,你将高兴的发现在你的游戏中,只简单的改变材质/纹理ID就能做一个多边形。这不能影响你画的图形的多个点,但是你不小心的话,你的代码将很长。最后,不得不告诉你,你想要的这些效果编写一个游戏引擎,将有15%或更少的代码不得不自己写,因为多数游戏引擎不是图表。游戏界面3D游戏引擎最为重要的引擎橙光游戏,但他不是游戏。实际的游戏中,没有任何部分进入游戏引擎。在游戏和引擎之间有一个层,这个层是为了清洁代码并是游戏容易上手。他是一段特别的代码,他不仅使游戏引擎非常清楚,而且使用语言表诉游戏逻辑更容易,或把游戏代码归类。
如果你不重视游戏中的游戏逻辑,后面就会有许多的问题和修改。也许你在引擎和游戏提供者之间感到疑惑。答案是控制。动态的道具作为游戏引擎的一个部分,游戏/引擎层提供修改这些道具的界面。这一方面的事包括摄象机,模型道具,灯光,粒子系统物理学,播放声音,播放音乐,使用输入,更改关卡编写一个游戏引擎,冲突检测,回应,用于显示,瓷砖屏幕的2D图象的布局,如果你想你的游戏能使用他,就必须在引擎中加入他。游戏引擎慢慢来实现