浅谈RPG游戏中简单地图的制作_第1页
浅谈RPG游戏中简单地图的制作_第2页
浅谈RPG游戏中简单地图的制作_第3页
浅谈RPG游戏中简单地图的制作_第4页
浅谈RPG游戏中简单地图的制作_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.蒀羇艿莀螈羆羈膂螄羅膁莈蚀羄芃芁薆羃羃蒆蒂羂肅艿螁羁膇蒄蚇肁艿芇薃肀罿蒃葿聿肁芆袇肈芄薁螃肇莆莄虿肆肆蕿薅蚃膈莂蒁蚂芀薈螀螁羀莀蚆螀肂薆薂蝿膅荿蒈螈莇膁袆螈肇蒇螂螇腿芀蚈螆芁蒅薄螅羁芈蒀袄肃蒄蝿袃膅芆蚅袃芈蒂蚁袂肇芅薇袁膀薀蒃袀节莃螂衿羂薈蚈袈肄莁薄羇膆薇蒀羇艿莀螈羆羈膂螄羅膁莈蚀羄芃芁薆羃羃蒆蒂羂肅艿螁羁膇蒄蚇肁艿芇薃肀罿蒃葿聿肁芆袇肈芄薁螃肇莆莄虿肆肆蕿薅蚃膈莂蒁蚂芀薈螀螁羀莀蚆螀肂薆薂蝿膅荿蒈螈莇膁袆螈肇蒇螂螇腿芀蚈螆芁蒅薄螅羁芈蒀袄肃蒄蝿袃膅芆蚅袃芈蒂蚁袂肇芅薇袁膀薀蒃袀节莃螂衿羂薈蚈袈肄莁薄羇膆薇蒀羇艿莀螈羆羈膂螄羅膁莈蚀羄芃芁薆羃羃蒆蒂羂肅艿螁羁膇蒄蚇肁艿芇薃肀罿蒃葿聿肁芆袇肈芄

2、薁螃肇莆莄虿肆肆蕿薅蚃膈莂蒁蚂芀薈螀螁羀莀蚆螀肂薆薂蝿膅荿蒈螈莇膁袆螈肇蒇螂螇腿芀蚈螆芁蒅薄螅羁芈蒀袄肃蒄蝿袃膅芆蚅袃芈蒂蚁袂肇芅薇袁膀薀蒃袀节莃螂衿羂薈蚈袈肄莁薄羇膆薇蒀羇艿莀螈羆羈膂螄羅膁莈蚀羄芃 浅谈RPG游戏中简单地图的制作李东日(青岛飞洋职业技术学院,266111)摘 要:本文介绍了小型RPG游戏中的地图的制作,并对其进行了分析。关键词:RPG游戏,索引,地图。引言:地图是游戏中的一个不可缺少的元素。大中型游戏的地图规模比较大,一般采用专门的地图编辑器生成地图文件。但这种地图的制作方法较复杂,并且使用了许多高级算法。这里我给大家介绍一种小型RPG游戏地图的制作方法,旨在帮助初学者快速

3、的理解游戏地图的组织与制作方法。正文: 经常有游戏编程爱好者抱怨游戏的设计和编写太难,搞了好几个月还不见成效,就会对游戏的编程感到深不可测,最后就是放弃了游戏的编写。实际上,以上的结果完全没有必要,游戏编程和其他编程一样,都需要坚定的毅力。不可能在很短的时间内就上手然后拥有自己的作品。游戏编程和其他编程不一样的地方是涉及的方面比较多,需要了解的东西比较多。但是一个人的世界过去了,现在讲求的都是团队。团队中每个人的分工都是不一样的,所以也没必要什么都会,那样只会落到什么都会什么都不精通的地步。废话说到这,下面我就讲一下在小型RPG游戏中地图的制作方法,帮助初学者快速理解和掌握。在讲制作方法之前,

4、先了解一下地图的表现形式:根据游戏的画面视角可分为以下几种形式:平面直视:这中视角的设计最为简单,就是直接俯视视角。 90度直视,这一视角的引擎设计简单, 2D格斗、动作类游戏大都用这种视角。 45度俯视,这一视角的设计同前一种类似,只是地图表现的要大和逼真,可用于RPG的制作。斜45度俯视,这一视角的引擎设计复杂,但表现却非常的逼真。以上就是现在比较流行的地图表现形式,不过有3D、2D之分,第一人称、第三人称之分。按地图组成方法的不同,大致可分为以下几种:第一种:拼图式,由许许多多的这种图片拼凑而成的,这种方法的好处是对内存的使用量少,读盘时间少,处理速度快。但它的缺点也是十分明显的,需要在

5、程序中通过一定的逻辑进行拼接。第二种:图片式,使用一张大的图片作为地图,优点是图象效果非常好,但缺点也是很多的,不利于碰撞检测,占用内存大,处理速度比较慢,一般不建议使用。第三种:索引式,这种方法是我自己设计的一种方案。由于得到论证,使用比较简单,下面就着重讲解一下这种索引式地图生成法。索引式地图是将场景所需的各种图片,如城墙、路、屋子之类,按照一定的逻辑写进一个特定的地图文件里。写进的东西并非图片本身,而是图片的索引。例如,我们指定背景的索引是0,草坪是1,其他的依次类推。这样存到地图文件。当加载地图的时候,直接读取地图文件里的0、1等字符,然后根据字符进行图片的加载。下面以全屏800600

6、,每副小图片4030来讲解。由于全屏800600而每副小图片是4030,所以显示的图片索引正好可以存储在一个20*20的数组里。事先定义:LPDIRECTDRAWSURFACE7 lpDDprimary;/ DirectDraw 主画面LPDIRECTDRAWSURFACE7 lpDDback;/DirectDraw 后备页面LPDIRECTDRAWSURFACE7 lpDDgrouparray3;/小地图页面,假设有3种图片可以使用char array400; /全局变量,保存地图数据信息/* 函数名: MapInit* 功 能:载入各种地图页面* 返回值: int*/int GameIni

7、t(void)/创建地面贴图页面 /普通地面/LPDIRECTDRAWSURFACE7 CreatePicSurface(char *filename, int mem_flags, int colorkey );/创建bmp画面 ,返回到DirectDraw对象上。 /地面if(!(lpDDgrouparray0 = CreatePicSurface(pic/group/back.bmp,0,0)MessageBox(NULL,TEXT(Create backpic Surface error),TEXT(Wrong),MB_OK);return 1;/路if(!(lpDDgrouparra

8、y1 = CreatePicSurface(pic/group/road.bmp,0,0)MessageBox(NULL,TEXT(Create backpic Surface error),TEXT(Wrong),MB_OK);return 1;/树if(!(lpDDgrouparray2 = CreatePicSurface(pic/group/tree.bmp,0,0)MessageBox(NULL,TEXT(Create backpic Surface error),TEXT(Wrong),MB_OK);return 1;/其他的依次类推memset(&ddbltfx,0,sizeof

9、(ddbltfx);ddbltfx.dwSize = sizeof(ddbltfx);ddbltfx.dwFillColor = _RGB16BIT565(0,0,0);if( FAILED(lpDDback-Blt(NULL,NULL,NULL,DDBLT_COLORFILL|DDBLT_WAIT,&ddbltfx)MessageBox(NULL,TEXT(backsurface fill error),TEXT(Wrong),MB_OK);return 1; return 0;在地图初始化中,加载所有能用到的图片,然后,加载数据到数组/*/* 函数名: MapLoad* 功 能: 地图的数

10、据加载* 输 入: 存储地图信息的地图文件* 返回值: int*/*/int MapLoad(char *filename) /场景地图现实 int i = 0,j=0;FILE *fp; fp = fopen(filename,r);char c = fgetc(fp);/读取地图文件里的字符。int index = 0;while( c != EOF )if( c != n ) /回车符不属于地图数据,去掉arrayi+ = c; /ifc = fgetc(fp); /while /关闭必须 fclose(fp); 数组里已经存储了,整张地图的数据,下面就是数据和图片的对应使用/*/* 函

11、数名: Show* 功 能: 显示图片* 输 入: 如果地图大于一屏,输入左上角的数据在变量中的位置,也就是起到了移动的作用(背景动,人不动),在这里,由于元素正好是20*20,所以正好是一屏,x和y在这里不起作用* 返回值: int*/*/int show(int x, int y) int i, j;for(i=0; i20; i+) for(j=0; j20; j+)mapij = arrayindex+;/forfor(i=0; i20; i+)for(j=0; j= 3) /因为只加载了3幅图片,所以如果字符有大于3或等于3的将会出错。 MessageBox(NULL,TEXT(Ma

12、p Load error),TEXT(Wrong),MB_OK); return 1; /if/* int SurfaceToBack(LPDIRECTDRAWSURFACE7 sourcesurface, 源 int x1, int y1, int x2, int y2, LPDIRECTDRAWSURFACE7 destsurface, 目的 int x3, int y3, int x4, int y4); 将源图片的图片矩阵拷贝到目的图片的相关矩阵上。 */SurfaceToBack(lpDDgrouparraytmp,0,0,40,30,lpDDback,j*40,i*30,j*40+

13、40,i*30+30);/for memset(&ddsd,0,sizeof(ddsd);ddsd.dwSize = sizeof(ddsd);if( FAILED(lpDDback-Lock(NULL,&ddsd,DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR,NULL)MessageBox(NULL,TEXT(lock Surface error),TEXT(Wrong),MB_OK);return 1;/ifif( FAILED(lpDDback-Unlock(NULL)MessageBox(NULL,TEXT(Unlock Surface error),TEXT

14、(Wrong),MB_OK);return 1;ifwhile(FAILED(lpDDprimary-Flip(NULL,DDFLIP_WAIT);return 1; /Show好了,函数先写到这里,下面就介绍一下它的运行过程。首先先准备一个地图文件,可以自己定义:例如:map.txt 00000000000000000000 01111200000000000000 02221222222222222220 01111111111111111110 02221222222222222220 00021200000000000000 00021200000000000000 000212000

15、00000000000 00021200000000000000 00021200000000000000 00021200000000000000 00021200000000000000 00021200000000000000 00021222222222222220 00001111111111111120 00000000000000002120 00000000000000002120 00000000000000002120 00000000000000002120 00000000000000002120以上就是自己定义20*20的地图数据。0代表地面,1代表路,2代表树。首先

16、在游戏的初始化函数中运行MapInit,将所有将要用到的地图图片加载到小地图页面,然后 MapShow(”map.txt”)来加载地图数据文件,将文件里的数据保存到一个数组里,然后根据数组的信息进行图片的匹配拼接并显示。由于小图片是4030, 数据存入20*20的数组里,所以根据数组正好可以显示800600的全屏画面。这样,实现碰撞检测也就方便了。在hero的移动事件里,只要下一个将要到达的地方的值是2就说明是障碍物,就无法到这个方向。这种方法显示的是一屏,下面讲解一下如何利用上面的方法,实现大地图。类似的,将地图文件里的数据改成你要设计的地图的大小,例如:100*100,这样,应该修改的地方

17、有以下几个:1char array400;改成char array10000;/数据多了,数组的空间自然要设大点。2.for(i=0; i20; i+) for(j=0; j20; j+)mapij = arrayindex+;/for虽然数据多了,但显示一屏的数据是一样的,这个时候show函数里的x和y参数就有作用了,所以上面的代码应改成:for(i=0; i20; i+) for(j=0; j20; j+)mapij = array(i + x) 100 /*第x行*/+(j+y)/*第y列*/;/i之所以要乘于100是因为地图文件里存放的是100行100列;/for /通过改变x和y的值

18、,显示的拼图就会运动。因为是大地图,为了防止hero乱走,将其固定在屏幕中央,也就是(400, 300)。这样让hero不动,改变x和y的值就能实现人物在地图上行走。 还有就是边缘检测,因为hero被规定在中央,如果是第一屏,往左走的话,y的值已经是0了,所以不能再减了,这时使用另一种方法,就是在一幅地图显示在一屏的情况下,hero的行走方式。Hero走,地图不动,当超过或不到一定距离的时候,hero被固定在中央,其他的情况,hero移动,地图不动。 碰撞检测和上面介绍的类似,当hero不动,地图动的时候,根据按键检测map1010上、下、左、右也就是map910,map1110,map109,map1011的数据,如果不是障碍物,就可以通过。使用这种方法,理论上地图的大小是没有限制的。只要不越界,那地图文件里存储多少数据都是可以的。因为它只显示当前

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论