做个RPG游戏主人翁(29)

软件世界

  今天,阿King带着阿志去了一个洞穴,这洞穴要穿九曲过十八弯才能到。他们走了大约半个小时,突然一道强光射入。这道光实在太强了,阿志完全无法睁开眼。

  “可以睁开眼了。”阿志听到阿King的声音。

  这是什么地方?怎么周围都混沌一片?”阿志睁开眼后问道:“啊!

  “跟我来吧,等会你就会知道了。”

  阿志跟着阿King来到一座金壁辉煌的建筑物里,拜见了女王。女王这时说出了请阿志来的原因:“当年盘古开天辟地建造了第一世界,也就是你居住的世界。但你要冒险的地方在第二世界里,而那里还是混沌一片。”

  “那我有什么可以帮您的?”阿志问道。

  “我想要你先把混沌的世界打造成适合冒险的地方,因为你是全能的勇士。”

  阿志听到女王这样称赞他,马上就得意忘形了:“女王请把任务放心交给我吧!这样的事情就应该交给我这个勇士!”。但随即心里一转念,“要我去冒险,可连冒险的世界都要自己亲手打造,女王还真不厚道呢。哎,谁叫我是这冒险之旅地道的主角呢!”

  第二篇 创建冒险的世界

  欢迎大家回到阿志的冒险之旅!还记得上期的内容吗?阿志为大家介绍了游戏启动界面的制作,动手做做,是不是很有成就感呢?这期我们将为大家介绍地图编辑器工作的核心──创建场景和游戏中人物遮蔽的实现。随后,会为大家详细讲解它的使用方法,来帮助大家了解如何通过它制作出游戏中的场景。

  一、了解冒险世界的构成

  说起RPG游戏,相信大家都还记得经典的《仙剑奇侠传》和很受欢迎的《轩辕剑》系列吧。游戏中庞大美丽的场景一定给大家留下了深刻的印象。

  大家也多少听说过地图编辑器这东西吧?经典的即时战略游戏《星际争霸》就附带有一个地图编辑器。通过它你可以创建自己的地图,而且想要多少矿石就放多少,想要多少敌人就能有多少。这些游戏中的场景可以由地图编辑器创建后再在游戏中调入。所以地图编辑器的核心作用就是创建游戏中的场景。

  现在,就让我们来逐步解读这个冒险世界是如何构成的。

  阿志要创建冒险世界,自然先要去拜访一趟前辈盘古大哥,听他说说经验。

  三天后,阿志凭着一身的本领,终于来到了盘古的家──盘足山。

  阿志大喊:“盘古!快醒来!”

  哇!阿志的嗓子真是恐怖!盘古真的被他叫醒了:“吾……嗯……啊~~”

  “是谁叫醒我啊?”

  “是我,勇士阿志!想请您帮我打造一个冒险世界。”阿志看见魁梧的盘古,动了偷懒的心眼。

  “喔,可以,但我现在刚醒来,手脚起码要等一千年才能动。”

  “不是吧?那怎么办?”

  “别担心,就由你来创造吧。”

  “别开玩笑了,我又不是神,怎么能创造世界?”

  “放心吧,我说可以就可以。现在就让我来告诉你冒险世界是如何构造的吧!”

  1.世界各态──场景的组成

  在创建场景之前首先我们要弄清楚场景究竟是由哪些东西组成的。

  简单地讲,场景通常由地面(如草地、泥路),物体(如树木、房子)和生物(如人类、动物、怪兽)所组成。

  通常把场景分成若干单元格,方便于场景的管理。例如可以把整个场景分成若干个32×32像素的单元格。每个单元格就是场景中的一个坐标。

  场景的结构可简单定义为:

  struct MapStruct{

  char m_chMapName[32]; //场景名称

  int m_nMapWidth;  //场景宽度,

  //以单元格为单位

  int m_nMapHeight; //场景高度,以

  //单元格为单位

  int m_nRoleCount; //场景中的人物

  //个数

  RoleStruct m_rolestruct[64]; //角色

  //结构,一个场景最多可以有64个角色

  TitleStruct m_titlestruct[256][256];

  //单元格结构,一个场景最多可由256×256

  //的单元格组成

  };

  其中,RoleStruct是角色结构,指明了一个场景中可以容纳的角色数量。TitleStruct是单元格结构,结构内容包括此单元格可否有障碍物,有没有物体,物体的ID等信息。

  2.大地的诞生──构造地块

  阿志去过混沌的世界,那里连下脚的大地都没有,让人极为恼火。所以阿志决定先向盘古打听大地的做法。

  场景的地面是由若干的图块所组成的。如图1所示,这是草的图块。在游戏中的场景通常由许多不同类型的图块组成(如水、土地、木板等等)。我们可以把这些组成场景地面的图块称为地块。因为游戏中有多种不同类型的地块,所以要为地块定义一个结构,如让场景知道哪个坐标的单元格该铺哪种类型的地块。

  每在一个单元格铺一块地块,该单元格的结构变量就会记录该地块的ID号。场景就是以单元格结构信息里的地块ID号来铺设各种类型的地块。

  3.多彩的世界──添加物体

  只有地面的场景还是一个单调的世界,我们要在场景上添加一些树木、房子、小山等物体来让世界丰富起来。场景中可以有许多不同类型的物体,需要为物体定义一个结构,用以记录各种物体的属性,当然包括确定该物体的ID值。当在场景的某单元格添加一个物体时,该单元格就记录添加物体的ID值,同时该单元格也就成了一个障碍,人物不能走到这个单元格。

  “哇塞!盘古不只会开天,当个老师也很称职呢。”听了盘古清晰的讲解,阿志大为佩服,对自己创建冒险世界也不知不觉增添了几分信心。但他突然想到有了基本的场景后,人物往上添加的话,万一被树遮住怎么办呢?“不要急,我有法宝‘遮蔽’来解决你的烦恼。”盘古说。于是,阿志又接着听了下去。

  4.让世界真实起来──实现遮蔽

  当场景中的东西多起来的时候新的麻烦就来了。一个场景中有那么多的物体,那么多的角色,怎样合理地组织它们,让它们合理地显示在屏幕上,这是2D游戏中的一个难点。如当人物走在树的后面时,树就要遮挡住人物,当人物走在树的前面时则相反。这就要靠遮蔽来解决。下面我们来看看具体如何实现。

  (1)遮蔽的原理

  对于简单的场景我们可以把它分成三层:地面,物体,人物。而一般场景在调入时的顺序是先调出地面,再放入物体,最后把角色放入。放入角色的时候非常关键,要以人物相对于物体的位置做出合理的遮蔽。在讲调入人物前,先来看看如何在场景中调入物体。一个物体如图2所示。

  左上角为起始坐标(0,0),把图2所示的这样一棵树放入场景中,其实“着地”的只有(2,5)这个坐标。放入场景时就只考虑把(2,5)这块放在场景的哪个单元格,放入时就是在该单元格中填入这棵树的ID号。如果只考虑这种情况的话,物体的结构为:

  struct ObjectStruct{

  char m_chObjectPic[32]; //物体图像

  //的文件名

  int m_nID; //物体ID值

  int m_nX; //着地的X坐标(图2中此

  //值为2)

  int m_nY; //着地的Y坐标(图2中此

  //值为5)

  };

  现在再看另一幅物体图(如图3)。

  打框部分是这个房子的着地部分,这可不同于上一个物体只有一点着地。我们需要定义一个坐标数组把所有的着地坐标记录起来,还要把着地部分的左上角的坐标记录起来,这是物体的关键坐标。注意:将物体调入场景时就是把关键坐标Y值最小的物体先放入(大家可以想想为什么这样做)。所以我们需要修改前面的物体结构,我们把它改为:

  struct ObjectStruct{

  char m_chObjectPic[32];

  int m_nID;

    POINT m_nPos[64]; //记录了物

  //体的着地坐标,最多可以有64个

  //记录关键坐标

  int m_nKeyX;

  int m_nKeyY;

  };

  (2)放入人物,实现遮蔽

  我们先来看图4,在图4中打框部分是物体的遮蔽部分,也就是当有人物“踩”到这些坐标时就要被该物体遮蔽。为此,要在物体结构中加入遮蔽部分的坐标数组。

  实现遮蔽具体方法如下:场景调入时,先放入地块,再放入物体。最后放入人物的时候就要检查人物是否“踩”到了某个物体的遮蔽部分了。如果是,就要重新放入该物体。这样物体就可以遮挡住人物了。

  二、打造冒险之旅的舞台──使用地图编辑器

  “我对盘古大哥的讲解佩服得五体投地,但巧妇难为无米之炊,大哥,给点工具吧。”

  “这好说!接着这东西!”

  盘古说着就从怀中掏出一个宝物扔给阿志,阿志接住后问道:“这是什么?”

  “这就是地图编辑器,有了它你就可以创造冒险世界了。现在就让我来教你如何使用吧。”

  说了那么多,相信大家都手痒了,是不是想试一试亲手创造世界的滋味?好的,我们现在就开始动手!大家可以在网上下载准备好的地图编辑器(下载地址:http://www.cpcw.com/29/game21.rar)。这地图编辑器使用起来很简单,运行的主界面如图5所示。

  1.我的地盘由我定──设置地图大小

  我们首先要选择“文件”菜单下的“新建”命令,打开“新建地图”对话框(图6)。

  这对话框很简单,输入地图的名称、宽度和高度,然后按“确定”即可。要注意的是,这里的地图宽度和高度的单位不是“像素”,而是“单元格”。像图6那样,地图就有40×40个单元格。而每个单元格为32×32像素。

  按下“确定”后,地图编辑视图变成了黑色,而且用线条划分好每个单元格。现在我们就可以在上面添加地块、物体等等了!

  2.脚踏实地──添加地块

  在地图编辑器左边的“地图工具箱”里点击“添加地块”按钮,出现“添加地块”工具箱(图7)。

  单击组合框的下拉按钮,选择一个地块,然后在地图编辑视图的任一单元格点一下就会在该单元格铺上你选择的地块了。这里没有删除地块的按钮,大家不要奇怪。当你想在某个单元格上换个地块时,只要选择新的一个地块,然后再点击那个单元格就可以替换原来的地块了。

  小技巧:想拥有自己的个性地图吗?好说,如果你有兴趣可以在图像处理软件中设计地块图像(注意:地块图像的大小要为32×32像素,要保存为BMP文件),设计好后放在地图编辑器的“floor”目录下。然后按图7里的“导入地块”按钮,打开“导入地块”对话框,输入地块的图像名(注意:要加上后缀名“.bmp”)即可导入自己的地块。

  3.生机盎然──在地块上添加物品

  添加物体与添加地块的方法一样,点击左边“场景工具箱”的“添加物体”按钮,打开“添加物体”工具箱。点击组合框的下拉按钮,选择一个物体,然后就可以放入地图当中了。

  物体的着地坐标、遮蔽坐标和关键坐标都已设置好了。点击“添加物体”工具箱的“删除物体”按钮可以删除掉上一次添加的物体。

  小技巧:大家同样也可以通过“添加物体”工具箱的“导入物体”按钮,用前面讲述的技巧方法来创建自己的个性物体。

  4.孕育主角──角色编辑器

  在地图中添加角色之前,先要把角色创建出来。在地图编辑器中集成了角色编辑器,点击“工具”菜单下的“角色编辑器”命令,打开角色编辑器(图8)。

  角色名字:如“阿King”

  角色类型:游戏中的角色有很多种类型,如我们所扮演的主角,在游戏中给我们重要信息的NPC,还有处处为难主角的敌人。在“角色类型”中输入数字“0”代表创建的是游戏的主角,当然这里只能有一个主角;输入数字“1”代表创建的是NPC;输入数字“2”代表创建的是敌人。

  关键坐标X:角色的脚底X坐标,也就是角色实际站在地图上的X坐标。

  关键坐标Y:角色的脚底Y坐标。

  角色的关键坐标如图9所示。

  角色图像名:就是象图10里那样的角色图像名,图像必须放在“role”目录下。

  图像宽度:角色图像的宽度。

  图像高度:角色图像的高度。

  单元宽度:如图9所示,角色图像中单个角色图像的宽度。

  单元高度:角色图像中单个角色图像的高度。

  角色属性:这就不用我说了吧?

  5.增强主角的能力──添加物品

  通过“工具”菜单下的“物品编辑器”就可以为主角创建物品了。为了方便和使游戏简单,这里我们不为每个角色都设一个物品箱,在游戏中只有一个主角的物品箱。在物品编辑器中创建的物品都是给主角使用的。

  6.围城内外──添加地图的出口

  盘古一口气讲了这么多,阿志说需要休息一下了。看着自己的冒险世界,阿志心里有说不出来的喜悦。可他突然发现整张地图没有一个出口,难道要在一张地图里老死吗?于是,阿志缠着盘古赶快讲解地图的出口是如何制作的,盘古大哥就又开始了他动听的讲解。

  点击“场景工具箱”的“添加出口”按钮,打开“添加出口”工具箱。在添加出口工具箱中设置好从此出口将到达的目的地图名称(要输入全名,如“scene1.map”),到目的地图后主角应站在哪个坐标,还要设置主角的方向。设置好后在地图编辑器视图上点击一个单元格,然后点击“添加出口”工具箱的“添加”按钮,你选中的单元格就会成为一个出口。通常要设周围几个单元格为同一个出口,这样,才能方便玩家在一个合理的范围内找到出口。

  当添加了一个出口后,“添加出口”工具箱的组合框就会出现在你添加的出口上。如果对添加的出口不满意,按“删除出口”按钮就可以删除该出口。

  7.锁定我的成果──保存地图文件

  当编辑好一幅地图后,就可以把它保存为地图文件了。点击“文件”菜单下的“保存”命令,打开“保存”对话框。要注意的是,保存的文件名要和创建地图时的地图名一样,地图文件要保存在“map”目录下。

  阿志在盘古大哥的指导下,终于把冒险世界初步创建好了。阿志望着由他亲手创造的世界,兴奋得叫了起来,他对盘古大哥说:“看!这是我创造的世界!”但盘古却露出了一个诡异的表情。阿志感到奇怪,问道:“你怎么了?现在不是好好吗?”“这世界是创造好了,但同时也因为这样而面临着一个大问题……”究竟是什么问题呢?敬请关注下期的冒险之旅。