收藏 分享(赏)

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

上传人:yjrm16270 文档编号:9434621 上传时间:2019-08-07 格式:DOC 页数:11 大小:53.50KB
下载 相关 举报
游戏引擎与游戏引擎开发入门.doc_第1页
第1页 / 共11页
游戏引擎与游戏引擎开发入门.doc_第2页
第2页 / 共11页
游戏引擎与游戏引擎开发入门.doc_第3页
第3页 / 共11页
游戏引擎与游戏引擎开发入门.doc_第4页
第4页 / 共11页
游戏引擎与游戏引擎开发入门.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、早想写一点游戏设计的文章与大家交流,一是经验的问题,二是公司正在紧张的游戏制作期,实在抽不出多少时间,一直没有动手,今天忽然头脑发热,写了一段,以后准备陆续写一些游戏创意,策划,制作,流程管理,和制作工具等方面的文章供大家参考. 我们的游戏设计经验主要是冒险游戏和角色扮演游戏,但我们设计游戏工具时尽量适应其余题材,不过是否可行未经检验. 写这篇文章的意图一是想为游戏界做点事,抛砖引玉吧,另外是公司正在寻找志同道合的战友, 我写一点文章交一交朋友,许多东西仅仅是我们的经验,不一定很好.参考而已吧 游戏设计工具包括游戏编辑工具和游戏引擎两块;游戏编辑工具交互编辑游戏数据,生成游戏引擎所需的数据文件

2、,包括以下几个功能块: 图像编辑,场景编辑,物品编辑,动画编辑,人物编辑,事件编辑等,具体介绍在以后的文章介绍.游戏引擎语言:VC5.0操作系统:WIN95图像引擎:DIRECT X 5.0支持游戏风格:各种类型和视角以及多层次的冒险游戏和角色扮演游戏整个游戏引擎包括以下功能块: 资源管理:图像库 CIMGLIB,声音库 CSOUNDLIB,通过编辑工具形成的资源文件来定义,每种资源包括定义管理和一些操作接口.图像库图“像包括多种格式(BMP,GIF.AVI,FLC 等)以及他形成的内存格式定义,子图定义(每一张图片包括许多小图,需定义它的小图位置,当然可以自动生成),游戏需要的特殊定义,比如

3、行走,身体性质,中心定位点,触发区,可以根据自己的要求扩充各种性质定义. 图像最好允许图像组合定义.声音库包括 WAV 和 MID 的定义和再现. 资源由IMGLIB.DAT 和 SOUNGIMG.DAT 定义,调试版本中最好不要将资源打包,而是指向正常的文件名,发行版本中再打包,这样修改和不同工作人员协调容易一些,否则最好有一个自己的资源管理器.我们在调试版本中数据文件采用文本描述格式.许多数据可以手工编写而不需要专门的编辑工具. 资源管理对象还包括内存管理,比如设置时间阀释放长期不用的资源. 声音管理:CSOUND,包括 Creat(),Sound(char *fileName.),Set

4、Pos(),等,DirectSound 有一些函数,我们要做的是封装简化,减少对外的接口. 窗口系统:接管标准窗口系统,一个完善的游戏引擎最好有一个自己的界面系统,至于简单还是复杂根据自己情况具体分析,一个具备基本功能的界面系统 1000 行程序就可以对付下来,需要窗口系统的原因是一般的图像引擎不支持标准窗口,二是可以便于移植到别的操作系统.在我们的游戏引擎中,游戏只是窗口系统的一种特殊控件(CWINGMCTR),因此可以实现多窗口游戏等特殊要求. CWINGMCTR 是一种特殊控件,通过他来控制游戏.包括控制和显示. 图像引擎:所使用的图像引擎的管理,我们使用的是 DirectX,包括 Cr

5、eat(),CreatSurface(), OutToScr(),Bilt()等对外接口;他不是游戏的重点,我们尽量将图像引擎细节封装起来. 图像管理:这是处理图像的中心,一般处理游戏显示喜欢以某种图像引擎为中心来设计,我觉得最好设计自己的对象来封装别人的图像引擎,这样不会因某引擎而受限制,移植也比较容易,我们虽然使用的 DIRECT X ,但实际上对外的接口是一种 CPICPAGE 的界面,他不但包括 DIRECT X 的surface, 也包括标准的位图,AVI 界面,GIF 动画界面,以及自定义的格式,他将各种类型的图像统一起来,对外使用统一操作,比如 DRAWTEXT,BILT,LIN

6、E 等标准图形图像操作,以及扩充的ALPHA 通道,透明度等操作.为了减少内存的需求,特别是 16M 高彩,不要将全部图像使用DIRECT X 的表面,对一些刷新不多的图像,比如背景,可以使用标准 256 色位图,甚至一种 GIF表面,需要时再解压,我们还使用一种单色位图用来从背景中抠图,比如一所场景中一棵巨大的树,只要不是动画,我们可以用单色抠图的形式从背景中扣除来作为另外一层,这样我们可以大大降低图像的内存需求.因此采用全部手绘(或 3D 场景), 而不是小图拼贴的场景成为可能.通过各种手段可以节约 60%的内存需求. CPICPAGE 可以通过 TimeTrace()以及多线程来改写内容

7、,比如 AVI 的改变. 游戏控制:这部分包括显示和控制,由 CGAME-CGAMEPAGE-CGMOBJ 对象组成,CGAME 是总控对象, 包括许多 CGAMEPAGE 游戏页,CGAMEPAGE 是一个具有连续场景的游戏片断,有点类似于游戏的一关, CGAMEPAGE 由一系列 CGMOBJ 组成,CGMOBJ 是游戏的基本对象,由他继承出地图,物体,物品,人物,武器, 动画,触发器,多媒体按钮等特殊游戏对象,这是一个根据游戏要求不断丰富和改写的部分,对外的接口是:SendDraw(),Draw(),TimeTrace(),AcceptMsg(),SendNetMsg(),AcceptN

8、etMsg()等,他是通过 CWINGMCTR 来调用,每种对象有许多控制参数,对象之间允许通讯,以及有自己的生长死亡发展的控制,尽量做到对象与外界减少直接接口,通过消息实现交流. 对象分为两类:景色对象和活动对象,景色对象定义了组成场景的元素,包括背景和前景两层,可以是由整个图片组成或由 RPG 常用的图片拼贴法的组成,它的特点只作为背景或前景,活动物是在他们的之间活动,一般定义后不做改变, 也不做控制,由于支持图像界面多格式,所以我们可以方便地使用 AVI 或 GIF 动画作为背景来增加场景的效果和真实性.景色还包括了行走性质定义,我们采用的是 8x8 为一单元,每个单元定义了一种性质,比

9、如平地,草地,障碍物等. 活动对象是在背景和前景之间活动,他们之间有相互的位置关系,前后关系随着位置改变会不断改变,因此他在所属的 CGAMEPAGE 中次序是动态的.对象的关系一般是由 Y 轴定义,由于要支持斜视角和复杂的地形结构,光靠 Y 轴是不够的,我们引入了地基线的概念,通过在地基线之上还是之下来判断前后关系,地基线的定义在图像定义中描述.活动对象有复杂的参数,可以接受外界消息,可以有自己的各种反应.我们在引擎中使用了一种描述语言来描述他们的反应,比如对鼠标击打,人物经过等产生参数改变,发声,对话等的回应.描述语言将作为专门的一章来介绍. 游戏显示过程是这样的, 在每次刷新期时窗口的游

10、戏控件调用他所属的游戏页 CGAMEPAGE-SendDraw(); 游戏页将要显示的对象按前后次序送往窗口,同时注明此对象是否改变,窗口分析改写的区域,调用每个对象的 Draw()接口来刷新活动的区域,为了增加速度,并不是显示所有的区域,而是只改写活动区域,因此我们设计了一个 CCLIP 的对象来管理刷新定义,它的原理是将表面分为 16*16 的单元, 最终显示时计算出优化后的多个剪切区域.整个窗口系统和每个游戏控件拥有自己的 CCLIP 对象.另外一项增加速度的方案是游戏控件拥有一个比显示窗大两倍的显示页,这样场景滚动时只要将显示位置改变即可,不用刷新所有区域. 游戏控制的过程是这样的:A

11、cceptMsg()来接受各种消息调用脚本来改变自己参数和状态并影响别的对象,另外每次时钟来时,调用每个对象的 TimeTrace()来改变状态,比如动画改变,运动轨迹改变, 观察周围的对象做出反应等. 系统控制模块:对系统的参数做出反应.不同的题材控制不一样,比如即时战略等.只要改写这部分以及扩充游戏对象,引擎便能支持不同的题材.至于人工智能,智能行走,只是对象的方法,比较简单,只是需要时间. 游戏控制部分比较复杂,每一种游戏对象都有许多控制的细节,在这篇文章里不做具体描述,以后再说吧. 最后一个是网络模块:我们正在开发的是国内第一个图形化 MUD 游戏,网络是它的核心部分,介绍网络的内容很

12、多,需专门文章.我们使用的不是 DirectPlay,使用的是 WinSoct,考虑的是 UNIX 作为服务器的需求.网络要解决的难点是安全,同步和数据压缩,这里要用到许多技巧. 游戏是通过数据文件来定义:数据文件格式:数据文件包括资源定义文件和游戏定义,界面定义文件,文件的数据格式我们采用的是文本形式,类似于 WEB 的文本,这样的好处一是版本升级容易处理,二是可以减少前期对编辑工具的功能要求,因为我们可以用文字编辑器处理大部分数据,然后有时间再设计一个强大的工具比较现实, 当然,最终提供给用户的是处理后的数据文件.他中间有一个转换模块. 游戏的运行流程描述(不是真正的过程,按 DOS 格式

13、描述):CreatGameWindow();/初始化 window 窗口CreatDraw(hWnd); /初始化图像引擎CreatSound();/初始化声音引擎CreatAvi()/初始化 AVI 引擎CreatNet();/初始化网络引擎LoadGameData();/读取游戏定义数据,包括资源定义文件和游戏定义,界面定义While(1)WINTraceMsg();/处理系统消息,比如鼠标,键盘等GameTimeTarce();/处理活动的游戏页的时间反应WinPaint();/刷新游戏显示OutToScr();我们这里介绍的是单线程结构,许多部分可以用多线来加快游戏速度,但结构是一样的

14、,就不多介绍了. 游戏引擎的系统分析是游戏设计技术方面的成功关键,是最容易走弯路的部分,希望我们的文章能给大家一点启发,由于今天的游戏趋向于多类型综合,设计引擎时一定不要拘泥于某一单项题材, 我们在策划这套引擎时要求他支持的游戏非常广,甚至支持多媒体设计,这套引擎只要扩充或改写参数管理以及游戏对象,便能支持各种风格的 2D 类游戏.将来我们要做的是一套可以交互设计各种游戏的开发平台,当然不是似的玩具. 今天就写到这里,这只是对引擎结构的大概介绍,其中每一点将来都有详细的描述,欢迎同志商讨. 我们尽量回答朋友们的意见,欢迎加入我们的队伍.游戏引擎与游戏引擎开发入门 2windows 下比较常用的

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

16、DIRECTDRAWPALETTE palette;CDirectPAGEbakDirectPAGE;/背景表面,是 CPICPAGE 的继承对象 CDirectPAGE 的实例LPDIRECTDRAWCLIPPER clipper;RECT displayrect;int displaydepth;WORD loREDbit, numREDbits;WORD loGREENbit, numGREENbits;WORD loBLUEbit, numBLUEbits;public:DirectDrawWin();DirectDrawWin();BOOL IsWorking(void);int O

17、nCreate(HWND _hWnd,BOOL IsFullWin=FALSE,int colors=16,int width=640,int height=480);void DrawScene();BOOL ClearSurface( LPDIRECTDRAWSURFACE surf, DWORD clr, RECT* rect=0 );BOOL ClearSurface( LPDIRECTDRAWSURFACE surf, DWORD r, DWORD g, DWORD b, RECT* rect=0 );BOOL BltSurface(LPDIRECTDRAWSURFACE dests

18、urf,LPDIRECTDRAWSURFACE srcsurf,int srcInX, int srcInY,DWORD flap,RECT *DecView=NULL,RECT *souRectBlt=NULL,/源图片目标区RECT *lpFillRect=NULL);CPICPAGE *GetDecDrawPage(void);LPDIRECTDRAWSURFACE CreateSurface( DWORD w, DWORD h );HRESULT SetColorKey(IDirectDrawSurface *pdds, COLORREF rgb);/=private:void Set

19、HWnd(HWND _hWnd);HWND GetSafeHwnd()return hWnd;BOOL CreateFlippingSurfaces();void OnDestroy();DWORD RGBtoPixel(DWORD r, DWORD g, DWORD b);void GetSurfaceRect(LPDIRECTDRAWSURFACE surf,RECT *lpRc);DWORD ColorMatch(IDirectDrawSurface *pdds, COLORREF rgb);BOOL GetSurfaceRect( LPDIRECTDRAWSURFACE surf, R

20、ECT/WORD LowBitPos( DWORD dword );WORD HighBitPos( DWORD dword );BOOL StorePixelFormatData();BOOL DetectDisplayMode();大家可以看到,对外的接口有限,主要是初始设置 OnCreate,输出到屏幕 DrawScene, 然后是表面的生成 CreateSurface 和图像操作 ClearSurface,BltSurface; 初始设置 OnCreate():初始 DrectX,设置显示模式,申请前表面,背景表面.对于即时滚屏的游戏,为了加快速度,可以将背景表面设置得比显示区大,这样

21、滚动时只要局部更改活动区,设置 DrawScene 时的起始位置即可.但我们没有使用这项技巧,我们的系统设计原则之一是:尽量少用技巧,靠系统设计提高速度,而不是局部技巧,原因是技巧的适应范围一般有限.系统尽量要求通用. 表面的生成和图像操作被一个叫 CPICPAGE 的通用图像页调用,CPICPAGE 是一个包括各种位图格式的统一管理对象,游戏在进行图像操作时,不直接与 DirectX 图像表面打交道, CPICPAGE 扩展了 DirectX 图像操作功能,比如带 alpha 通道的 BLT,以及带亮度的 BLT,直接对表面的Line,DrawTxt 等.BltSurface()是一个包括许

22、多剪裁定位输求的函数. 对于窗口模式下的DrawScene,为了避免屏幕产生图像撕裂现象,可以利用垂直同步刷新同步地更新屏幕,为了减少此过程的等待时间,可以使用多线程技术. 为了加快游戏显示速度,在使用 DirectX 中有许多可以挖掘的技巧. 有关 DirectX 的部分我不作详细介绍,网上有一部分资料,另外可参阅高性能 WINDOWS 图形设计一书,我们的这个对象就是在其书的基础上简化而来,需要这部分源代码的朋友可来信与我们联系. 游戏引擎与游戏引擎开发入门 3图像页指的是内存中保存图像数据的各种表面,屏幕缓存,各种图片数据,窗口界面的界面数据等,不要只依靠 DirectX 的表面,最好单

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

24、E. 在我们的游戏引擎中,图像页结构是这样的 CPICPAGECBitmapPage/标准 windows 的位图,如果使用 16M 色模式,对于一些不常更新的图像,使用/16M 色的 DirectXDraw 是种巨大的浪费,比如背景,我们可以保存一块比视/口大的 DirectXDraw 表面作为背景区,只在一定条件下才将 256 色原图/CBitmapPage 写入背景区(使用任意调色版可保证非常高的图像质量,特别/是使用 Potoshop 5.0 或 Animatorfor Window 作为真彩转换 256 色工具,颜/色失真极小),平时游戏读的是高速的 DirectXDraw 背景表面

25、CDirectXDrawPage/标准的 DirectXDraw 表面,CGifPage/Gif 动画表面,随着时间自动修改图像内容,继承 CDirectXDrawPageCAviPage/AVi 动画表面,随着时间自动修改图像内容,继承 CDirectXDrawPage,可以带自己线程CFlcPage/Flc 动画表面,随着时间自动修改图像内容,继承 CDirectXDrawPage目前我们只设计了这些类型,但可以供据需要随时扩充.class CPICPAGEprotected:char picStyle;/图像类型BOOL CanWrite;/是否可以写int picWidth,picHe

26、ight;/尺寸DWORD activeMode;/静态,可释放,unsigned shortuseTimeMark;/使用时间标记,如果长时间未使用,则保存到虚拟文件中char *programeBuf;/可以用代码来控制图像的改变,/我们支持脚本语言对图像进行特殊控制char *lpImgBuf;/图像内存long imgBufLen;/内存长度HDC hDC;/标准设备句柄,指对 CDirectXDrawPage 和它的继承对象有效BOOL hasChg;/图像内容是否已经改变BOOL UseClip;/是否设定显示剪裁区RECT clipRc;/显示剪裁区public:CPICPAGE

27、();CPICPAGE();virtual void Destroy(void);char GetPicStyle(void);BOOL GetSize(int *w,int *h);void GetRect(RECT *lpRc);char *GetImgBuf(void);BOOL Load(char *lpFileName,long startOfs=0);从文件中读取内容virtual BOOL LoadFile(FILE *lpFileHandle,longstartOfs=0)return FALSE;virtual void BeginDraw();/如果是标准的 DirectX

28、Draw 表面,再进行/Window 的标准图形读写时要获得 HDC,如果是连续写,不要/马上释放,反复申请和释放 HDC 会大大降低速度virtual void EndDraw();/终止 Window 的标准图形读写,释放 HDCvirtual HDC GetHDC(void)return NULL;virtual void Line(int bx,int by,int ex,int ey,COLORREF rgb);virtual void drawStrgs(char *strg,short bx,short by,char drawBox,short choice);virtual

29、void Draw(RECT *lpRc,COLORREF *lpCr,chardrawStyle,DWORD otherMess);virtual void Fill(RECT *rc=NULL,COLORREF colorFill=0);virtual void DrawRect(RECT *rc,COLORREF colorLeft,COLORREFcolorRight,COLORREF colorFill,COLORREF colorKey,DWORD drawStyle);virtual BOOL BltInView(CPICPAGE *lpDec,int srcInX, int s

30、rcInY,/x,y 是 souRectBlt 相对于整个 des 表面的位置DWORD flap=0,RECT *DecView=NULL,RECT *souRectBlt=NULL,/源图片目标区RECT *lpFillRect=NULL)return FALSE;virtual BOOL FillRect(CPICPAGE *lpSou,RECT *lpSouRect=NULL,RECT*lpDecRect=NULL)return FALSE;virtual BOOL Scroll(int scrollX,int scrollY,RECT*lpRect=NULL)return FALSE

31、;virtual BOOL ChgSize(int chgWidth,int chgHeight,intmode=0)return FALSE;/0 设置尺寸,1 改变尺寸virtual BOOL HasLost(void)return FALSE; /已经丢失图像数据virtual BOOL Scroll(int scrollX,int scrollY,COLORREFfillColor=0,RECT *lpScrollRc=NULL)return FALSE;virtual voidTimeTrace(vodi);/时间跟踪,动画可以在此时更改自己的图像;class CDIBPAGE:pu

32、blic CPICPAGEHDIB hDIB;LPSTR lpDIBHdr;unsigned aLineByte;BYTE biBitCount;char style;char *LpGetIMG(void);public:CDIBPAGE()picStyle=BMPPIC;BOOL Creat(int width,int height,DWORD mode=0);BOOL SetBmp(char *_lpImgBuf);BOOL LoadFile(FILE *lpFileHandle,long startOfs=0);BOOL StretchDIBits(HDC hDC,LPRECT lpD

33、CRect,LPRECTlpDIBRect,DWORD dwRop,BOOL canChg=FALSE);BOOL Blt(HDC hDC,LPRECT lpDCRect,LPRECT lpDIBRect,DWORDdwRop=SRCCOPY);virtual BOOL BltInView(CPICPAGE *lpDec,int srcInX, int srcInY,/x,y 是 souRectBlt 相对于整个 des 表面的位置DWORD flap=0,RECT *DecView=NULL,RECT *souRectBlt=NULL,/源图片目标区RECT *lpFillRect=NULL

34、);class CDirectPAGE:public CPICPAGELPDIRECTDRAWSURFACE surf;public:CDirectPAGE()surf=NULL;picStyle=DIRECTPIC;CDirectPAGE();void Destroy(void);BOOL Creat(int width,int height,DWORD mode=0);LPDIRECTDRAWSURFACE GetSurface(void) EndDraw();return surf;virtual BOOL LoadFile(FILE *lpFileHandle,long startOf

35、s=0);HDC GetHDC(void);void BeginDraw();void EndDraw();virtual BOOL BltInView(CPICPAGE *lpDec,int srcInX, int srcInY,/x,y 是 souRectBlt 相对于整个 des 表面的位置DWORD flap=0,RECT *DecView=NULL,RECT *souRectBlt=NULL,/源图片目标区RECT *lpFillRect=NULL);void Fill(RECT *rc=NULL,COLORREF colorFill=0);BOOL Scroll(int scrol

36、lX,int scrollY,COLORREF fillColor=0,RECT *lpScrollRc=NULL);游戏引擎与游戏引擎开发入门 4这里所说的游戏资源管理不仅仅只是资源打包,它包括了定义和压缩,打包,以及各种性质定义和操作接口. 本章只介绍图像资源管理. 定义文件名:IMGLIB.DAT 在调试版本中我们使用的脚本语言,只有在发行版本中才将其加密和压缩. 文本举例:PATH “.IMGLIB“/放置图片的路径,在调试版本中,图片是不打包的,发行版本中/才打包和压缩在一个文件中#def id=0,name=“1“,file/对象类型,有文件型,图素拼贴型,复合型等,可以扩充自己的

37、类型#begininclude file “man.bmp“ /包含“man.bmp“的图片include file “manalpha.bmp“ /alpha 通道图片makpicpage directXpage/生成的表面类型,缺省是 DirectXDraw 表面,参见“第四章“memctroll TRUE /内存自动管理litImgs 16 /总共有 16 张小图litimg place (0,0,30,30)(30,0,60,30)./子图在图片中的位置,可以自动生成/litimg place auto /子图在图片中的位置,自动生成defgo 0,0,0,0,0,3,5. /行走性质

38、定义,我们使用的 8*8 为一单元touch litimg=0,(10,0,0,1,1,30,30)/可以定义子图复杂的触发区,这在/冒险游戏和多媒体中有时需要middle all in top( or all in bottom or seldef 0,0,)/每张子图片的中心定位点,这在人物行走时特别重要/定位有几种方法:顶点,坐标,#end大家可以看出,这是一个很复杂的定义格式.他不像许多游戏直接使用图片作为资源,而是包含了一些控制描述的复合定义,当然最简单的形式也就是一个文件名,其余可以使用缺省控制. 首先说说素材的类型,我们经常看到地图编辑器的介绍,提来提出无非是什么拼贴视角等等词语

39、, 在我们的引擎中,许多界限都被打破,比如地图的构成,象仙剑奇侠许多游戏使用的是一种我们称为“图素拼贴“的技术构成,它的原理是采用 8*8(或其他尺寸的单元)距阵纪录每个单元对用的材质的序列号,而不是使用实际的点阵数据,这样可以节约大量的内存,另外一种方法是直接使用整张绘制的图像,比如直接由 3D 设计的一个场景,这在象命运之手等游戏中使用过.而在我们的引擎中, 这些游戏类型的定义都打破了,我们统一使用的是大的图片,但这张图片可以是只包含索引的拼贴纪录,甚至可以是其他已定义资源的合成资源. 随着硬件内存的增加,使用整张图片作为连续滚屏(而不是切换)的背景成为可能,但如果不注意压缩,16M 色的

40、内存需求仍然让人恐怖,虽然效果是上去了,所以我们一方面提出了一些场景组成方案, 图像压缩使用方案,在某些局部兼容原来的“图素拼贴“的技术有时也是必要的. 这个资源使用的方法很简单:IMGLIB:Blt(int imgid,int sonImgNo,CPICPAGE *decPage,RECT *decPlace,.);省略的是其他扩展写法,比如亮度控制,alpha 控制等等.不管资源是什么类型,接口一致,保证了系统的扩充性,这就是对象继承的优势,在整个系统构架中,我们都注意了这些,比如前面提到的 “三:图像页 CPICPAGE 介绍“.子图:每一张图片可以包含许多小图片,比如一个人的一套动作包

41、含一张图片中,这样容易管理, 子图数要定义其在图像中的 Rect,我们使用一种色为子图边框色,这样可以自动得到位置,而不是每个手工测量,也没有子图必须使用统一尺寸的要求.当然怎么做不重要,只要你得到了结果,生成尺寸也是配套的开发工具必须解决的事情. 每一张图片可以带对应的一张图片作为 alpha 通道图片,这是生成一些特技效果的需求,我们会在另外一张专门介绍当前比较常用的一些特技效果技术比如光影烟雾等和实现办法以及他对提高游戏效果的意义. 行走性质的定义:定义每张图片的一些性质,比如地面,悬崖,障碍等,对如人物,还有头,手,心等详细定义,这样可以制作一些格斗游戏. 触发区:普通的图片触发区要么

42、是包含它的方框,要么是实体区,对于一些多媒体,要求在一张图片中包含多个非规则的触发区,比如一个人的图片,击打不同的躯体位置显示不同的动画,这便用到此定义,使用:int IMGLIB:GetTouch(int imgId,int sonImgNo,POINT *pt);得到此点在触发区的序号. 生成表面类型:定义此资源生成的 CPICPAGE 的类型,这是为了尽量减少内存的需要. 见第三章. 中心定位点:一般地图背景使用的做左上角为定位点,而人物通常使用的是图片的下部中间为定位点,我们在脚本语言中规定了几种标准定位方式,但对于一些非规则体,比如中心位置不标准的人物图片,允许使用坐标标定. 图像资

43、源管理使用的是一个 CIMGLIB 的对象,对象包含了一个资源的列表单. 通过前几章,我们基本上可以显示一个地图和人物动画了,再加上控制,一个简单的游戏就可以演示了.下面简单的描述一下过程:hWnd=InitWindow(640,480)DirectXWin.OnCreat(640,480,TRUE);ImgLib.Load(“IMGLIB.DAT“);while(1)/按 dos 写法delay(100);time+;/刷新游戏显示CPIGPAGE *lpPage=DirectXWin.GetBakPage();/得到背景图像页Imglib.Blt(0,1,lpPage,0,10);/将序号为 0,子图号为 1 的背景图片显示在 0,10 上Imglib.Blt(2,time%10,lpPage,100,100);/将序号为 2,子图号不断改变的人物图片显示在背景上 DirectXWin.OutToScr();/输出到屏幕一个游戏引擎包含了太多的内容,不知这篇文章什么时候能写完?! 由于这套引擎本身功能比较全,要介绍的特别具体我们时间不允许,里面许多地方由于时间关系语言逻辑没有条理, 甚至不通,大家原谅.

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报