设计工具之游戏引擎 小谢 早想写一点游戏设计的文章与你们交流,一是经验的问题,二是公司正在紧张的游戏制做期,实在抽不出多少时间,一直没有动手,今天突然头脑发热,写了一段,之后准备陆续写一些游戏创意,策划,制做,流程管理,和制做工具等方面的文章供你们参考. 咱们的游戏设计经验主要是冒险游戏和角色扮演游戏,但咱们设计游戏工具时尽可能适应其他题材,不过是否可行未经检验. 写这篇文章的意图一是想为游戏界作点事,抛砖引玉吧,另外是公司正在寻找志同道合的战友,我写一点文章交一交朋友,许多东西仅仅是咱们的经验,不必定很好.参考而已吧。 游戏设计工具包括游戏编辑工具和游戏引擎两块; 编辑工具:交互编辑游戏数据,生成游戏引擎所需的数据文件,包括如下几个功能块: 图像编辑,场景编辑,物品编辑,动画编辑,人物编辑,事件编辑等,具体介绍在之后的文章介绍. 先从游戏引擎提及. 语言:VC5.0 操做系统:WIN95 图像引擎:DIRECT X 5.0 支持游戏风格:各类类型和视角以及多层次的冒险游戏和角色扮演游戏 整个游戏引擎包括如下功能块: 资源管理:图像库CIMGLIB,声音库CSOUNDLIB,经过编辑工具造成的资源文件来定义,每种资源包括定义管理和一些操做接口.图像库图像包括多种格式(BMP,GIF.AVI,FLC等)以及他造成的内存格式定义,子图定义(每一张图片包括许多小图,需定义它的小图位置,固然能够自动生成),游戏须要的特殊定义,好比行走,身体性质,中心定位点,触发区,能够根据本身的要求扩充各类性质定义. 图像最好容许图像组合定义.声音库包括WAV和 MID的定义和再现. 资源由IMGLIB.DAT和SOUNGIMG.DAT定义,调试版本中最好不要将资源打包,而是指向正常的文件名,发行版本中再打包,这样修改和不一样工做人员协调容易一些,不然最好有一个本身的资源管理器.咱们在调试版本中数据文件采用文本描述格式.许多数据能够手工编写而不须要专门的编辑工具. 资源管理对象还包括内存管理,好比设置时间阀释放长期不用的资源. 声音管理:CSOUND,包括Creat(),Sound(char *fileName...),SetPos(),等,DirectSound有一些函数,咱们要作的是封装简化,减小对外的接口. 窗口系统:接管标准窗口系统,一个完善的游戏引擎最好有一个本身的界面系统,至于简单仍是复杂根据本身状况具体分析,一个具有基本功能的界面系统1000行程序就能够对付下来,须要窗口系统的缘由是通常的图像引擎不支持标准窗口,二是能够便于移植到别的操做系统.在咱们的游戏引擎中,游戏只是窗口系统的一种特殊控件(CWINGMCTR),所以能够实现多窗口游戏等特殊要求. CWINGMCTR是一种特殊控件,经过他来控制游戏.包括控制和显示. 图像引擎:所使用的图像引擎的管理,咱们使用的是DirectX, 包括Creat(),CreatSurface(),OutToScr(),Bilt()等对外接口;他不是游戏的重点,咱们尽可能将图像引擎细节封装起来. 图像管理:这是处理图像的中心,通常处理游戏显示喜欢以某种图像引擎为中心来设计,我以为最好设计本身的对象来封装别人的图像引擎,这样不会因某引擎而受限制,移植也比较容易,咱们虽然使用的DIRECT X,但实际上对外的接口是一种CPICPAGE的界面,他不但包括DIRECT X 的surface,也包括标准的位图,AVI界面,GIF动画界面,以及自定义的格式,他将各类类型的图像统一块儿来,对外使用统一操做,好比DRAWTEXT,BILT,LINE等标准图形图像操做,以及扩充的ALPHA通道,透明度等操做.为了减小内存的需求,特别是16M高彩,不要将所有图像使用DIRECT X的表面,对一些刷新很少的图像,好比背景,可使用标准256色位图,甚至一种GIF表面,须要时再解压,咱们还使用一种单色位图用来从背景中抠图,好比一所场景中一棵巨大的树,只要不是动画,咱们能够用单色抠图的形式从背景中扣除来做为另一层,这样咱们能够大大下降图像的内存需求.所以采用所有手绘( 或3D场景), 而不是小图拼贴的场景成为可能.经过各类手段能够节约60%的内存需求. CPICPAGE能够经过TimeTrace()以及多线程来改写内容,好比AVI的改变. 游戏控制:这部分包括显示和控制,由CGAME->CGAMEPAGE->CGMOBJ对象组成,CGAME是总控对象,包括许多CGAMEPAGE游戏页,CGAMEPAGE是一个具备连续场景的游戏片段,有点相似于游戏的一关,CGAMEPAGE由一系列CGMOBJ组成,CGMOBJ是游戏的基本对象,由他继承出地图,物体,物品,人物,武器,动画,触发器,多媒体按钮等特殊游戏对象,这是一个根据游戏要求不断丰富和改写的部分,对外的接口是:SendDraw(),Draw(),TimeTrace(),AcceptMsg(),SendNetMsg(),AcceptNetMsg()等,他是经过CWINGMCTR来调用,每种对象有许多控制参数,对象之间容许通信,以及有本身的生长死亡发展的控制,尽可能作到对象与外界减小直接接口,经过消息实现交流. 对象分为两类:景色对象和活动对象, 景色对象定义了组成场景的元素,包括背景和前景两层,能够是由整个图片组成或由RPG经常使用的图片拼贴法的组成,它的特色只做为背景或前景,活动物是在他们的之间活动,通常定义后不作改变,也不作控制,因为支持图像界面多格式,因此咱们能够方便地使用AVI或GIF动画做为背景来增长场景的效果和真实性.景色还包括了行走性质定义,咱们采用的是8x8为一单元,每一个单元定义了一种性质,好比平地,草地,障碍物等. 活动对象是在背景和前景之间活动,他们之间有相互的位置关系,先后关系随着位置改变会不断改变,所以他在所属的CGAMEPAGE中次序是动态的.对象的关系通常是由Y轴定义,因为要支持斜视角和复杂的地形结构,光靠Y轴是不够的,咱们引入了地基线的概念,经过在地基线之上仍是之下来判断先后关系,地基线的定义在图像定义中描述.活动对象有复杂的参数,能够接受外界消息,能够有本身的各类反应.咱们在引擎中使用了一种描述语言来描述他们的反应,好比对鼠标击打,人物通过等产生参数改变,发声,对话等的回应.描述语言将做为专门的一章来介绍. 游戏显示过程是这样的,在每次刷新期时窗口的游戏控件调用他所属的游戏页CGAMEPAGE->SendDraw();游戏页将要显示的对象按先后次序送往窗口,同时注明此对象是否改变,窗口分析改写的区域,调用每一个对象的Draw()接口来刷新活动的区域,为了增长速度,并非显示全部的区域,而是只改写活动区域,所以咱们设计了一个CCLIP的对象来管理刷新定义,它的原理是将表面分为16*16的单元,最终显示时计算出优化后的多个剪切区域.整个窗口系统和每一个游戏控件拥有本身的CCLIP对象.另一项增长速度的方案是游戏控件拥有一个比显示窗大两倍的显示页,这样场景滚动时只要将显示位置改变便可,不用刷新全部区域. 游戏控制的过程是这样的:AcceptMsg()来接受各类消息调用脚原本改变本身参数和状态并影响别的对象,另外每次时钟来时,调用每一个对象的TimeTrace()来改变状态,好比动画改变,运动轨迹改变,观察周围的对象作出反应等. 系统控制模块:对系统的参数作出反应.不一样的题材控制不同,好比即时战略等.只要改写这部分以及扩充游戏对象,引擎便能支持不一样的题材.至于人工智能,智能行走,只是对象的方法,比较简单,只是须要时间. 游戏控制部分比较复杂,每一种游戏对象都有许多控制的细节,在这篇文章里不作具体描述,之后再说吧. 最后一个是网络模块:咱们正在开发的是国内第一个图形化MUD游戏,网络是它的核心部分,介绍网络的内容不少,需专门文章.咱们使用的不是DirectPlay,使用的是WinSoct,考虑的是UNIX做为服务器的需求.网络要解决的难点是安全,同步和数据压缩,这里要用到许多技巧. 游戏是经过数据文件来定义: 数据文件格式:数据文件包括资源定义文件和游戏定义,界面定义文件,文件的数据格式咱们采用的是文本形式,相似于WEB的文本,这样的好处一是版本升级容易处理,二是能够减小前期对编辑工具的功能要求,由于咱们能够用文字编辑器处理大部分数据,而后有时间再设计一个强大的工具比较现实,固然,最终提供给用户的是处理后的数据文件.他中间有一个转换模块. 游戏的运行流程描述(不是真正的过程,按DOS格式描述): CreatGameWindow();//初始化window窗口 CreatDraw(hWnd); //初始化图像引擎 CreatSound();//初始化声音引擎 CreatAvi()//初始化AVI引擎 CreatNet();//初始化网络引擎 LoadGameData();//读取游戏定义数据,包括资源定义文件和游戏定义,界面定义 While(1) { WINTraceMsg();//处理系统消息,好比鼠标,键盘等 GameTimeTarce();//处理活动的游戏页的时间反应 WinPaint();//刷新游戏显示 OutToScr(); } 咱们这里介绍的是单线程结构,许多部分能够用多线来加快游戏速度,但结构是同样的,就很少介绍了. 游戏引擎的系统分析是游戏设计技术方面的成功关键,是最容易走弯路的部分,但愿咱们的文章能给你们一点启发,因为今天的游戏趋向于多类型综合,设计引擎时必定不要拘泥于某一单项题材,咱们在策划这套引擎时要求他支持的游戏很是广,甚至支持多媒体设计,这套引擎只要扩充或改写参数管理以及游戏对象,便能支持各类风格的2D类游戏.未来咱们要作的是一套能够交互设计各类游戏的开发平台,固然不是<<游戏工厂>>似的玩具.