游戏引擎与游戏引擎开发入门.docx

上传人:b****6 文档编号:4393983 上传时间:2022-12-01 格式:DOCX 页数:14 大小:25.37KB
下载 相关 举报
游戏引擎与游戏引擎开发入门.docx_第1页
第1页 / 共14页
游戏引擎与游戏引擎开发入门.docx_第2页
第2页 / 共14页
游戏引擎与游戏引擎开发入门.docx_第3页
第3页 / 共14页
游戏引擎与游戏引擎开发入门.docx_第4页
第4页 / 共14页
游戏引擎与游戏引擎开发入门.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

游戏引擎与游戏引擎开发入门.docx

《游戏引擎与游戏引擎开发入门.docx》由会员分享,可在线阅读,更多相关《游戏引擎与游戏引擎开发入门.docx(14页珍藏版)》请在冰豆网上搜索。

游戏引擎与游戏引擎开发入门.docx

游戏引擎与游戏引擎开发入门

游戏引擎与游戏引擎开发入门

早想写一点游戏设计的文章与大家交流,一是经验的问题,二是公司正在紧张的游戏制作期,实在抽不出多少时间,一直没有动手,今天忽然头脑发热,写了一段,以后准备陆续写一些游戏创意,策划,制作,流程管理,和制作工具等方面的文章供大家参考.

我们的游戏设计经验主要是冒险游戏和角色扮演游戏,但我们设计游戏工具时尽量适应其余题材,不过是否可行未经检验.写这篇文章的意图一是想为游戏界做点事,抛砖引玉吧,另外是公司正在寻找志同道合的战友,我写一点文章交一交朋友,许多东西仅仅是我们的经验,不一定很好.参考而已吧

游戏设计工具包括游戏编辑工具和游戏引擎两块;

游戏编辑工具

交互编辑游戏数据,生成游戏引擎所需的数据文件,包括以下几个功能块:

图像编辑,场景编辑,物品编辑,动画编辑,人物编辑,事件编辑等,具体介绍在以后的文章介绍.

 

游戏引擎

 

语言:

VC5.0

操作系统:

WIN95

图像引擎:

DIRECTX5.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()等对外接口;他不是游戏的重点,我们尽量将图像引擎细节封装起来.

图像管理:

这是处理图像的中心,一般处理游戏显示喜欢以某种图像引擎为中心来设计,我觉得最好设计自己的对象来封装别人的图像引擎,这样不会因某引擎而受限制,移植也比较容易,我们虽然使用的DIRECTX,但实际上对外的接口是一种CPICPAGE的界面,他不但包括DIRECTX的surface,也包括标准的位图,AVI界面,GIF动画界面,以及自定义的格式,他将各种类型的图像统一起来,对外使用统一操作,比如DRAWTEXT,BILT,LINE等标准图形图像操作,以及扩充的ALPHA通道,透明度等操作.为了减少内存的需求,特别是16M高彩,不要将全部图像使用DIRECTX的表面,对一些刷新不多的图像,比如背景,可以使用标准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类游戏.将来我们要做的是一套可以交互设计各种游戏的开发平台,当然不是<<游戏工厂>>似的玩具.

今天就写到这里,这只是对引擎结构的大概介绍,其中每一点将来都有详细的描述,欢迎同志商讨.我们尽量回答朋友们的意见,欢迎加入我们的队伍.

游戏引擎与游戏引擎开发入门2

windows下比较常用的图像引擎是DirectX,国内资料比较少,我给大家推荐过《高性能WINDOWS图形设计》这本书,大家不妨找一下.在我们的游戏引擎中,目前使用的也是DirectX,网上见到有关DirectX的简化接口的对象库,没有使用过,不知如何,最好是自己做这些对象,灵活些.图像引擎在游戏中的作用是这样的,设置显示模式,管理操作一种特殊图像表面,显示到屏幕.

图像引擎对象:

classDirectDrawWin

{

HWNDhWnd;

BOOLIsUse;

intwinWidth,winHeight;

LPDIRECTDRAW2ddraw2;

LPDIRECTDRAWSURFACEprimsurf;

LPDIRECTDRAWPALETTEpalette;

CDirectPAGE

bakDirectPAGE;//背景表面,是CPICPAGE的继承对象CDirectPAGE的实例

LPDIRECTDRAWCLIPPERclipper;

RECTdisplayrect;

intdisplaydepth;

WORDloREDbit,numREDbits;

WORDloGREENbit,numGREENbits;

WORDloBLUEbit,numBLUEbits;

public:

DirectDrawWin();

~DirectDrawWin();

BOOLIsWorking(void);

intOnCreate(HWND_hWnd,BOOLIsFullWin=FALSE,intcolors=16,intwidth=640,intheight=480);

voidDrawScene();

BOOLClearSurface(LPDIRECTDRAWSURFACEsurf,DWORDclr,RECT*rect=0);

BOOLClearSurface(LPDIRECTDRAWSURFACEsurf,DWORDr,DWORDg,DWORDb,RECT*rect=0);

BOOLBltSurface(LPDIRECTDRAWSURFACEdestsurf,LPDIRECTDRAWSURFACEsrcsurf,

intsrcInX,intsrcInY,DWORDflap,

RECT*DecView=NULL,RECT*souRectBlt=NULL,//源图片目标区

RECT*lpFillRect=NULL);

CPICPAGE*GetDecDrawPage(void);

LPDIRECTDRAWSURFACECreateSurface(DWORDw,DWORDh);

HRESULTSetColorKey(IDirectDrawSurface*pdds,COLORREFrgb);

//======================================================================

private:

voidSetHWnd(HWND_hWnd);

HWNDGetSafeHwnd(){returnhWnd;};

BOOLCreateFlippingSurfaces();

voidOnDestroy();

DWORDRGBtoPixel(DWORDr,DWORDg,DWORDb);

voidGetSurfaceRect(LPDIRECTDRAWSURFACEsurf,RECT*lpRc);

DWORDColorMatch(IDirectDrawSurface*pdds,COLORREFrgb);

BOOLGetSurfaceRect(LPDIRECTDRAWSURFACEsurf,RECT&rect);

//////////////////////////////////////////////////////////////////////

WORDLowBitPos(DWORDdword);

WORDHighBitPos(DWORDdword);

BOOLStorePixelFormatData();

BOOLDetectDisplayMode();

};

大家可以看到,对外的接口有限,主要是初始设置OnCreate,输出到屏幕DrawScene,然后是表面的生成CreateSurface和图像操作ClearSurface,BltSurface;初始设置OnCreate():

初始DrectX,设置显示模式,申请前表面,背景表面.对于即时滚屏的游戏,为了加快速度,可以将背景表面设置得比显示区大,这样滚动时只要局部更改活动区,设置DrawScene时的起始位置即可.但我们没有使用这项技巧,我们的系统设计原则之一是:

尽量少用技巧,靠系统设计提高速度,而不是局部技巧,原因是技巧的适应范围一般有限.系统尽量要求通用.表面的生成和图像操作被一个叫CPICPAGE的通用图像页调用,CPICPAGE是一个包括各种位图格式的统一管理对象,游戏在进行图像操作时,不直接与DirectX图像表面打交道,CPICPAGE扩展了DirectX图像操作功能,比如带alpha通道的BLT,以及带亮度的BLT,直接对表面的Line,DrawTxt等.BltSurface()是一个包括许多剪裁定位输求的函数.对于窗口模式下的DrawScene,为了避免屏幕产生图像撕裂现象,可以利用垂直同步刷新同步地更新屏幕,为了减少此过程的等待时间,可以使用多线程技术.为了加快游戏显示速度,在使用DirectX中有许多可以挖掘的技巧.有关DirectX的部分我不作详细介绍,网上有一部分资料,另外可参阅《高性能WINDOWS图形设计》一书,我们的这个对象就是在其书的基础上简化而来,需要这部分源代码的朋友可来信与我们联系.

游戏引擎与游戏引擎开发入门3

图像页指的是内存中保存图像数据的各种表面,屏幕缓存,各种图片数据,窗口界面的界面数据等,不要只依靠DirectX的表面,最好单独用一个对象来管理这些内容,避免直接与DirectX打交道,这样改变引擎和移植到别的操作系统的工作量会小得多.在我们的游戏引擎设计中,CPICPAGE是一个功能强大而且扩充性极好的对象,比如我们不想使用DirectX表面,而想自己设计一种表面结构,游戏的其余部分不须任何改变,只要从CPICPAGE发展出CSELFPAGE的对象即可.象我知道的"腾图"公司的余雪松和吴冬黎(两个非常优秀的程序师,我从他们那里收益非浅,他们也是国内比较早的"xx"游戏站点的主人)就有一套自己的功能强大的图像表面.游戏对图像的操作一般不是直接对具体类型的表面操作,而是调用他们的根对象CPICPAGE.

在我们的游戏引擎中,图像页结构是这样的

CPICPAGE

CBitmapPage//标准windows的位图,如果使用16M色模式,对于一些不常更新的图像,使用

//16M色的DirectXDraw是种巨大的浪费,比如背景,我们可以保存一块比视

//口大的DirectXDraw表面作为背景区,只在一定条件下才将256色原图

//CBitmapPage写入背景区(使用任意调色版可保证非常高的图像质量,特别

//是使用Potoshop5.0或AnimatorforWindow作为真彩转换256色工具,颜

//色失真极小),平时游戏读的是高速的DirectXDraw背景表面

CDirectXDrawPage//标准的DirectXDraw表面,

CGifPage//Gif动画表面,随着时间自动修改图像内容,继承CDirectXDrawPage

CAviPage//AVi动画表面,随着时间自动修改图像内容,继承CDirectXDrawPage,可以带自己线程

CFlcPage//Flc动画表面,随着时间自动修改图像内容,继承CDirectXDrawPage

目前我们只设计了这些类型,但可以供据需要随时扩充.

classCPICPAGE

{

protected:

charpicStyle;//图像类型

BOOLCanWrite;//是否可以写

intpicWidth,picHeight;//尺寸

DWORDactiveMode;//静态,可释放,

unsignedshort

useTimeMark;//使用时间标记,如果长时间未使用,则保存到虚拟文件中

char*programeBuf;//可以用代码来控制图像的改变,

//我们支持脚本语言对图像进行特殊控制

char*lpImgBuf;//图像内存

longimgBufLen;//内存长度

HDChDC;//标准设备句柄,指对CDirectXDrawPage和它的继承对象有效

BOOLhasChg;//图像内容是否已经改变

BOOLUseClip;//是否设定显示剪裁区

RECTclipRc;//显示剪裁区

public:

CPICPAGE();

~CPICPAGE();

virtualvoidDestroy(void);

charGetPicStyle(void);

BOOLGetSize(int*w,int*h);

voidGetRect(RECT*lpRc);

char*GetImgBuf(void);

BOOLLoad(char*lpFileName,longstartOfs=0);从文件中读取内容

virtualBOOLLoadFile(FILE*lpFileHandle,long

startOfs=0){returnFALSE;};

virtualvoidBeginDraw(){};//如果是标准的DirectXDraw表面,再进行

//Window的标准图形读写时要获得HDC,如果是连续写,不要

//马上释放,反复申请和释放HDC会大大降低速度

virtualvoidEndDraw(){};//终止Window的标准图形读写,释放HDC

virtualHDCGetHDC(void){returnNULL;};

virtualvoidLine(intbx,intby,intex,intey,COLORREFrgb);

virtualvoiddrawStrgs(char*strg,shortbx,shortby,

chardrawBox,shortchoice);

virtualvoidDraw(RECT*lpRc,COLORREF*lpCr,char

drawStyle,DWORDotherMess);

virtualvoidFill(RECT*rc=NULL,COLORREFcolorFill=0);

virtualvoidDrawRect(RECT*rc,COLORREFcolorLeft,COLORREF

colorRight,

COLORREFcolorFill,COLORREFcolorKey,

DWORDdrawStyle);

virtualBOOLBltInView(

CPICPAGE*lpDec,

intsrcInX,intsrcInY,//x,y是souRectBlt相对于整个des表面的位置

DWORDflap=0,

RECT*DecView=NULL,

RECT*souRectBlt=NULL,//源图片目标区

RECT*lpFillRect=NULL)

{returnFALSE;};

virtualBOOLFillRect(CPICPAGE*lpSou,RECT*lpSouRect=NULL,RECT

*lpDecRect=NULL){returnFALSE;};

virtualBOOLScroll(intscrollX,intscrollY,RECT

*lpRect=NULL){returnFALSE;};

virtualBOOLChgSize(intchgWidth,intchgHeight,int

mode=0){returnFALSE;};//0设置尺寸,1改变尺寸

virtualBOOLHasLost(void){returnFALSE;};//已经丢失图像数据

virtualBOOLScroll(intscrollX,intscrollY,COLORREF

fillColor=0,

RECT*lpScrollRc=NULL){returnFALSE;};

virtualvoid

TimeTrace(vodi);//时间跟踪,动画可以在此时更改自己的图像

};

classCDIBPAGE:

publicCPICPAGE

{

HDIBhDIB;

LPSTRlpDIBHdr;

unsignedaLineByte;

BYTEbiBitCount;

charstyle;

ch

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1