文档库 最新最全的文档下载
当前位置:文档库 › RPG制作

RPG制作

打造你自己的RPG

圣剑英雄传2制作过程深度解析

作者:黄良毅、汪疆

《圣剑英雄传II 双刃剑》是金点工作组刚刚推出不久的一款共享RPG。这个游戏和其他的游戏相比,有一个最为特别的地方,那就是游戏完全没有加密,开放一切资源:包括图片,音乐、音效,脚本等等等等。这就意味着,我们已经拥有了一个RPG的框架,只要加上我们自己的东西,一个属于我们自己的RPG就诞生了!金点工作组这样做是为了鼓励更多的人加入游戏制作的行列,他们也非常欢迎大家通过修改他们的《圣II》来制作自己的RPG,并希望大家将修改的成果寄给他们,好放在他们的网站上发扬光大。

但是游戏之作并不是一件简单的事情,虽然《圣II》是开放的,但是对于一个完全没有接触过的人,肯定还是显得非常陌生和复杂,让人望而却步。不要着急,这篇文章便是详细介绍如何修改《圣II》的,相信您看完了这篇文章,便一定能够制作出属于自己的RPG来!

第一章:概述:

首先让我们从游戏的基础开始,看看一个游戏是由哪几个基本部分组成的。

一部游戏是由游戏引擎和一些相关资源组成,这些资源包括声音,图片,文字及其它与游戏密切关联东东。这里的声音包括音乐和音效,图片包括人物,道具,地图,背景,战斗动画等素材,文字包括剧本,分镜,人物属性设定等,以及其它和游戏密切相关,专属该游戏的文件如地图文件,脚本文件,游戏配置文件等。

《圣剑英雄专2双刃剑》也是由上面几个基本部分组成,只不过他和一些其它商业游戏有所不同,它开放了所有资源。这些开放的资源构筑了这款游戏,当我们了解这些资源构成后,再经过自己的修改,完全可以制作一款属于自己的游戏,现在我们先看看《圣2》为我们提供了那些资源。

游戏引擎:就是那个可执行文件sword2.exe(它还包含地图编辑器),在不久的将来我们公布游戏源代码后,你也可以修改代码完成一个新游戏引擎供自己或别人使用。

游戏的音乐和音效:这些分别存放在music和sound目录里,音乐格式目前还不支持mp3格式和cd音轨(我们的共享游戏哪用得起这些!),因此只能使用mid格式,音效方面则是使用wav格式。

图片:游戏中用到的所有图片则放在pic目录里,根据图片在游戏中的不同用途,我们又分成多个目录,例如战斗时使用的画面放在fight,地图的素材在放titles,游戏界面使用的图片放在dialog等等。这些图片都是未经加密bmp格式,方便所有人对图片资源进行扩充和修改。

游戏其他配置文件:游戏的地图文件保存在maps目录下,我们也像放图片一样把相同场景的地图文件放置在同一个目录里。同时,因为脚本和地图是紧密相连的,所以游戏中的脚本文件是和地图文件存放在一起。当然还有人物角色设置以及游戏中关于界面,变量,npc,敌人,战斗等游戏配置文件都以ini文件格式保存在ini目录下。

了解这些后我们可以开始我们的游戏制作之旅。

现来看一部游戏是如何制作完成的:

1.寻找一些志同道合的伙伴组成一个小组

2.策划写剧本并对剧本进行分镜处理

3.美工寻找或制作素材

4.编辑地图

5.编写游戏配置文件和脚本文件

6.测试

7.发布

别问我为什么不用写程序?因为我们的《圣2》已经是一个很完整的游戏引擎,可以不需要改源代码就可以制作出一款全新的游戏,但是制作游戏也不是动动鼠标就能完成的,不然我也不用写这篇文章。好了不说题外话,先对每个步骤进行一下解释:

第一步,当然是找人,不然你只有单干(什么?你是全才?那我不拦着你,你一个人上吧)。

第二步,写剧本并对剧本进行分镜处理,剧本就不用说,原创和改编都行,而分镜是把剧本进行一个量化处理。把剧本中的场景分离成一张张地图,每张地图应该达到什么样的制作要求;游戏中会出现什么样的角色,哪些是主角,哪些是配角或是npc,这些角色将在哪个场景以及什么时候出现等等,这些都是分镜需要完成的。

第三步,在完成分镜后美工就按照分镜要求寻找或制作一些素材,这些包括地图,人物行走,战斗,对话等图片。

第四步,当有了地图的素材,就可以按照分镜的要求编辑地图了,不必等人物的素材制作完成,关于如何编辑地图我们将在后面着重介绍。

第五步,在地图编辑的同时就可以开始编写游戏配置文件和脚本文件了。关于这部分的编写我们也将在后面着重介绍。

完成前面五步,一部游戏就算完成了,可这时的游戏还不能正式发表,在发表前应该进行一些测试工作,力争把错误降低到最少。测试到你们认为把游戏放出来后不至于被“骂”时,就勇敢地公布你们的游戏吧!

第二章:地图显示原理

好了,我们进入正题,先学习如何制作地图,在做地图之前我们需要了解一些关于地图的基本概念。

在RPG游戏里,地图是由一块块小的图片拼接成的,这些图片被称为“瓷砖”,专业术语为“地图元素”,我们用“瓷砖”是方便大家理解。

当游戏进行到某个场景时,需要一张森林的地图,这时游戏会把组成森林的“瓷砖”通过一定的规则“铺”成一张森林的地图。那电脑又是如何知道这些规则呢?答案是地图编辑器。地图编辑器的作用是告诉电脑在屏幕上的某格应该放置什么样的“瓷砖”。当这些规则被保存在一个文件里时,就称这个文件为地图文件。因此,当游戏需要读取地图时,会先打开地图文件,然后由地图文件会告诉电脑在某某格应该是放哪块“瓷砖”,然后由游戏把这

些“铺”好“瓷砖”的地图显示在屏幕上。

有了这样的地图我们又会碰上一个问题:(如图)

我们的人物都是站在地面上的,人都是盖住地图,而我们有时需要地图把人物盖起来,像上面的图一样,地面是草地和一颗树,我们的兰特走到上面后人就“站”在树上了,而我们需要的是兰特站在树底下。所以在一部普通的RPG游戏里,地图分成三个层次:

第一层是地面层,(如图)

这层的所有物品都会被另外两个层的物体覆盖。

第二层个是精灵层。(如图)

兰特

主角、npc等可以活动的人物都是在这层,也可称为中间层。

第三层是天空层,也称顶层,(如图)

(这里的红色是游戏中的透明色)

游戏中的树木,桥梁,房屋等可以阻挡人物视线的图层都可以称之为天空层。

这三层组合成游戏中的最终画面。(如图)

说完基础的再来看《圣2》是如何设定上面所说的。

首先游戏中的地图是由“瓷砖”铺成的,这些“瓷砖”被放在pic\tiles目录下,是bmp格式,当你有新的地图元素可以使用时最好也放在这个目录里,接着修改ini\heroland.ini文件里的一些项目,就可以使用新的地图元素了。有了“瓷砖”再看看如何使用他们:我们电脑屏幕被游戏引擎分成20×15个格子,也就是说在一个屏幕横着可以放20块“瓷砖”,竖着可以放15块“瓷砖”,整个屏幕一共放300块“瓷砖”。当然一张地图不仅限于20*15个格子,它还可以更大,超过一个屏幕的话,游戏进行过程中会产生滚屏效果(人物相对屏幕不动,而地图相对人物滚动),实现这些效果是程序员的事,我们不做讨论,但是这样的地图也不是可以无限的大下去,我们推荐的界限是不要超过200*200,超过这个限制也行,只不过地图太大了编辑起来会比较费力。

《圣2》同上面说的一样,也分地面层,精灵层与天空层。但是游戏中设定的天空层不是严格意义上的天空层,它是由一个叫物体层的图层,它不但可以表现天空层,而且还可以通过设置由天空层变成地面层。具体的使用方法在说地图编辑器时会讲解到。

第三章:地图编辑

了解基本概念后,我们就可以动手开始编写地图。先让我们一起来熟悉地图编辑器。因为地图编辑器是同游戏引擎捆绑在一起的,所以我们得先进入游戏,然后在游戏开始画面时按Alt+F5 或者在游戏进行时按F5激活地图编辑器。(如图)

地图编辑器被激活后在电脑屏幕的左上角会出现一些属性,它显示的是当前鼠标所指向

的格子的坐标。(在编写游戏脚本时,人物的坐标都是以这个格子坐标为参照的。在测试时也是通过报告某某格子发现什么错误来进行的。)

屏幕的下方有一个“当前层”属性。它显示的是当前编辑器编辑的是哪个层(这里有三个层地面层物体层1 物体层2)。

还有一些其它属性就不一一介绍,常用的都会在后面介绍。

好了,我们来熟悉一下地图编辑器,按F5进入编辑界面,我们只使用鼠标就可以完全编辑好地图。在编辑器里按下鼠标右键就会弹出一个快捷菜单(见图)

里面被分成五大部分。按顺序为:选择“瓷砖”、地图属性、地图格子属性、脚本设置和杂项。

下面我们一项一项讲解。

(一)选择图素:

在这里有两个选项:静态图素,动态图素。点击它们都可以进入一个“瓷砖”选择界面,在这里使用鼠标指向想要使用的“瓷砖”并点击左键选定,右键取消。选择完成后会自动切换回编辑界面,这时再按下左键,鼠标所指向的格子里就铺上了刚选定的“瓷砖”。

“瓷砖”选择界面里的图素当然不止一页,里面有很多页,这时可以使用A和Z上下翻页,动态图素是可以动的“瓷砖”,具体的例子各位可以看到港口那些海浪冲击岸边的效果。

(二)地图属性编辑,里面有三项:显示设置、图层编辑、file。

1、显示设置项:鼠标指上后会在右边弹出一个二级菜单,

里面有:网格、物体、阻挡关系、当前选择、其他标志和只显示物体六个可选项,在这些项目前面如果有一个钩就表示该项被选中。

(a)网格的意思是说游戏屏幕被横竖十多条线分解成20×15个格子,加入这些线的目的是更好的给“瓷砖”定位。如果想更清楚地看到完整的地图或者说是

看地图的整体效果则可以去掉网格。

(b)物体:是否显示物体层的意思,这里的物体层包括物体层1和物体层2,主要是为了更好地编辑地面而设定。

(c)阻挡关系:阻挡就意味着这些格子能不能到达。不能到达的地方都被打上红叉。

(d)当前选项:如果打开的话,移动鼠标就会看到有一块“瓷砖”会随着鼠标移动。如果不打开,也就是不选择,那跟着鼠标的“瓷砖”就会消失。

(e)其他标志:游戏中一些关于其他设置的显示是否打开,例如当某点设置有陷阱后,该格会出现一个圆圈表示这里有一个陷阱,如果取消显示,这些圆圈

将看不到。

(f)只显示物体:这个和前面的物体选项相反,选择后编辑器只能显示物体层,地面层将被黑色取代,以方便大家更好的编辑物体层。

2、层编辑器,这个和显示设置一样也有一个二级菜单

只不过里面只有三项:地面,物体1,物体2。这三项的目的是切换编辑器的当前的编辑层。我们“铺设”瓷砖时只是铺设编辑器的当前层。如果你不明白当前编辑的是哪个层,可以看看屏幕下方的当前层属性。

3、File:

使用过一些其他英文软件的人对这些单词不会陌生吧!有关地图保存,新建和打开的操作都可以在这里完成。这些我就不用多说了,提示两点:

(1)戏中新建的地图使用save as…进行保存,修改用load打开的的地图用save 保存。

(2)里面的exit一项是退出编辑器。同时又因为地图编辑器和游戏捆绑在一起,所以退出地图编辑器就是退出游戏。如果是要返回游戏界面,可以直接在编辑器

直接里按F5。

(三)地图属性格子编辑:

这里也有三项:敌人设置、格子属性、地图属性。

1、现来先看敌人设置(快捷键为Q)。

游戏中的一些地图需要出现战斗,就在这里设置。选择菜单后会弹出一个设置对话框(见图)。对话框分三个部分,左上角是游戏里可以出现的敌人的名单,右上角是当前编辑的地图可能出现的敌人的名单,下方是设定敌人出现的频率。设置敌人出现名单时先在左上角选定需要出现的敌人,然后按“>>”,右上角选项框自然会出现刚才选中的敌人。如果想要删除,把刚才的操作反过来就是,在右边选择要删除的对象,按“<<”就行了。设置敌人频率的值在0-100之间,0表示没有敌人,一般游戏的敌人设定在10-20之间,设多了容易让人反感,少了又影响升级速度。

2、格子属性(快捷键为P):

(a)这里设定鼠标指向格子的物体层1和物体层2的属性。也就是我们在前面说的天空层与地面层的切换。设置很简单,在地面层或天空层两个项中任选其中一就行,地图编辑对

物体层1,物体层2的默认属性都是地面层。(b)同时在这里还可以设置游戏中的阻挡关系,我们在“不能通过”前打勾,那么地图编辑器上鼠标刚才指的格子就会出现红叉,返回游戏后就可以发现刚才打红叉的地方不能走过去了。(c)鼠标类型:我们可以在光标指向某个格子时,出现与平时不同的光标。例如我们在切换地图时会出现一双鞋子。

3、地图属性:

这项也没有什么好说的,大多都是前面见过的东东我就不多说。

(a)这里有一项是输入地图的名字,在这里可以输入小于32个字符的名字,也就说如果是英文必须在32个字母以内,如果是汉字则必须在16个字以内。这个名字是在游戏进行时,切换地图后显示在左上角的。例如:编辑完一张道具屋的地图后,在名字位置填上“道具屋”三个字,下次从游戏进入这张地图时,在屏幕左上角会出现“道具屋”三个字,提示玩家这里有道具买。

(b)地图背景图,各位还记得游戏在打boss时,有一块与平时见到的地面不一样的图片吧,那就是地图背景图。有兴趣的可以自己去试试,不过请注意一点,这时请把需要出现背景图的格子的地面层“铺”成透明色(是那个粉红色的“瓷砖”)。

(三)脚本设置:

只有两项:设置陷阱与删除陷阱。陷阱的意思就是脚本触发点,当玩家走到该点时会触发预先设定好的脚本。关于脚本我们将在后面有详细的交代。

(四)其它的杂项:缩略图、反悔、取消。

缩略图:就是把整张地图通过缩放到可以用一个屏幕显示的地图,这样可以更直观得看地图,特别是一些比较大的地图。

反悔:这个做得不太好,不用也罢。

取消:当你无意中按了右键,按这个返回到编辑界面。

熟悉地图编辑器后,我们就可以正式的开始地图制作,在这里我们提供一些制作地图时

的流程,当然这个不是标准过程,只是经验之谈,如果你自己有好的制作流程也千万不要吝啬,一定要告诉大家哦。

下面是制作流程:

1.在草稿纸上画出地图的轮廓和以及一些要素。

2.根据草稿确定地图使用的素材。

3.制作地面层。

4.制作物体层。

5.从物体层里分出天空层和地面层。

6.设定阻挡关系。

7.测试。

上面提到的草图,不是要那种画得很精美的图片,只是用笔简单地画出一个大概的轮廓,例如下面是张村庄的草图:

我们需要一个村庄的场景,这时先要画一个村庄的草图,然后把这张草图分解成一张张地图,并把每张地图里应该出现的树木、石头、房屋和脚本陷阱等一一标注清楚,这样草图就算可以了。这第一步一定不要省略,因为这样做会极大的提高效率。

好,知道了游戏地图的做作过程,我们再来看一些高级点的东东。那就是增加地图元素。首先是寻找适合自己的地图元素。可以使用其他游戏的截图。截图软件有很多,就不一一介绍了(个人推荐使用金山游侠)。有截图后还得做些后期处理,在游戏中每块“瓷砖”的大小是32×32个象素,因此在后期处理时要注意这点。

制作好地图元素后保存为.bmp格式。然后复制到pic\titles下,假设新的地图元素文件名称为newtile01.bmp。并打开ini\heroland.ini。找到下面部分在“GroundPic[8]=pic\tiles\sea.bmp”添加“GroundPic[9]=pic\tiles\newtitle01.bmp”然后把下面的改为Max_GroundPic=10。新的地图元素就这样加上去了,如果还有新地图也用同样的过程加上去。

实例:

[地图元素] //地面图素图片 Max<64

GroundPic[0]=pic\tiles\tile01.bmp

GroundPic[1]=pic\tiles\tile02.bmp

GroundPic[2]=pic\tiles\tile03.bmp

GroundPic[3]=pic\tiles\tile04.bmp

GroundPic[4]=pic\tiles\tile05.bmp

GroundPic[5]=pic\tiles\tile06.bmp

GroundPic[6]=pic\tiles\tile07.bmp

GroundPic[7]=pic\tiles\word01.bmp

GroundPic[8]=pic\tiles\sea.bmp

GroundPic[9]=pic\tiles\newtitle01.bmp

Max_GroundPic=10

第四章:编写脚本

地图制作好了,接下来是编写脚本。在正式讲解前仍然还是先了解一些脚本的知识。

游戏的剧情控制是由脚本完成的,这些脚本由脚本语言组成。脚本语言同我们学过的其他计算机语言(如basic c)类似。我们用脚本语言写的脚本就相当于用basic写一个程序。当然我们的这个脚本语言又同basic等语言有很大的区别。它只是一个指令集(相当于basic里面已经定义好的函数)。我们只用掌握那些指令(函数)就可以方便的控制游戏剧情。下面我们开始讲解脚本。在这里请大家打开ini目录下的script.ini文件(用记事本打开就行了)。里面存放着《圣2》使用到的所有脚本。有能力的玩家可以自行查看。(注:附录3是《圣2》的脚本说明)

按学习计算机语言的顺序,我们先来看看变量。在游戏进行的过程中,如何让电脑npc 知道主角完成了什么任务,得到了什么物品?答案是变量。当我们的主角完成一个任务,利用脚本改变某一变量的值,当一个npc想知道角色是否完成一个任务,就会查看变量是否等于一个事先设定好的值,如果等于该值则认为你完成了这个任务,电脑就提示你下一个任务是什么;如果不等于该值则认为任务没有完成,电脑就提示你任务没有完成,请先完成这个任务后才可以接受下一个任务。?(游戏中可以设定的变量最多有多少个)这些变量同c 语言一样需要先定义才能使用,什么叫先定义?举个例子,在basic里面变量的使用是不需要先定义的,你一旦想到需要什么样的变量,直接用就是了,但这样有个缺点,变量无须定义那我们很难知道游戏中使用了哪个变量,这是因为变量在使用时有很大的随意性,我们往往会忘了前面对某个变量具体表示什么。这时我们就需要有个规定,那就是在程序(我们的脚本)前先跟电脑说一声我们需要使用那些变量,这就叫变量的定义(申请)。具体的定义是在ini目录下的variable.ini文件里。现在我们就打开它。我们可以直接在后面添加我们需要的变量。按照前面的例子写就是了。在这里给大家提示一个技巧,这里申请的变量可以使用中文名称,也就是说变量名可以是中文。嘻嘻,如果你不嫌用中文变量麻烦,使用中文变量可以很清楚地表示变量表达的意思。

好了,知道如何定义变量后,我们再来看有关使用变量的语句。这里有4条语句set\add\if\random

变量赋值

set($变量名,数值);

功能:给一个变量赋值。这里一般是设为某值,或者给一些临时变量进行清零,也就是说,我们先把一个变量数值设为零,然后对这个变量进行改变以实现一些临时选择。例如,在《圣2》里哈非把恢复药水给兰特后就可以走了(进入下面的剧情),这时再同兰特对话,哈非会对兰特发出邀请,兰特拒绝,哈非再邀请,兰特再拒绝,一连三次,直到兰特下逐客令,对话才没有继续下去。这里的设计思路如下:在对话完(给恢复药水后),我们对一个临时变量清零处理,然后每对话一次,就给该变量加一,游戏在进行时判断这个变量的值如果是1则发出第一次邀请,如果是2则使用第二次邀请的对话,如果是3以上则兰特下逐客令。

改变变量的值

add($变量名,数值);

因为游戏中的变量不能像basic那样进行简单的赋值,所以是通过命令来完成的。这一句的意识是给变量进行加减运算,如果数值为正数则变量加数值,如果是负数则变量减数值。

条件判断

if (判断条件, "标号");

游戏中的判断语句,如果判断条件成立脚本就跳转到“标号”指定的位置继续运行,如果条件不成立就继续往下执行。这条语句的重要性不用多说了,在游戏中的例子也有很多。

跳转指令

goto(“标号”);

无条件跳转语句。它和上面的差别是上面的是先判断再跳转,而下面是不用说任何理由直接跳转到‘标号’所指定的地方。为了说明‘标号’的意思,我们来举个例子。假设一个邮递员(游戏引擎)去送信,他先读信上的地址(if判断语句),了解信需要放到那个信箱(标号),移动到该信箱前面(标号的位置),把信投递到信箱里,结束一个投递过程(返回游戏)。我们的标号就是这样一个‘信箱’。

返回指令

return;

它的作用是结束脚本回到游戏。每个脚本文件都不能少的语句。如果没有这语句,那游戏就会game over(不是出现game over的画面,而是程序出现异常情况不得不强行关闭程序)。

直接说一段话

Say(…对话?,?图片名?);

这里的对话当然是游戏出现的对话,它由一个对话框和人物图片组成。而?图片名?则是出现在对话框上的人物半身像的图片文件名。这些半身像被放在pic\photos目录下,这里需要注意的一点:只用写出文件名而不必写出后缀名.bmp(为什么要提醒各位注意?因为在游戏的其它语句里凡是读取存在硬盘上的文件时都需要写后缀名)。

显示一条游戏消息

GameMessage("消息内容",...);

显示一条游戏消息,同对话一样使用的是游戏设定的外框,它与对话不同的是他的对话框不是在界面的下方,而是在游戏中央,并不能显示图片。经常出现在游戏需要提示的地方以及得到物品时。

显示一条系统消息

ShowMessage("消息内容",...);

显示一条系统消息是使用windows的那种标准的小的对话框,一般当游戏发生错误时会出现这样的对话框。这个不经常使用。

说完这些再来看看游戏角色的控制。首先是主角的控制。

强制主角走动到x,y点:

MoveTo(x,y);

这个没什么好解释的,让主角从当前位置走动到(x,y)这个点。我们可以从地图编辑器里找到想要到达的目标位置。

设置主角的位置:

SetPlayerPos(mapX, mapY);

这个语句主要是在游戏开始时配置主角出现位置,在游戏进行过程中,以及交代剧情时最好不要使用,要是人物“瞬移”时被玩家看到就……

设置主角的方向:

SetPlayerDir(Direction);

Direction 表示范围0-3,每个数字对应一个方向。0=下 1=左 2=上 3=右。通常在设定主角位置或移动后角色的方向都不是我们需要的,这时就需要设定主角的方向。使用的命令当然是上面的语句。

以主角为地图中心

CenterPlayer();

这个没什么好说,通常在交代剧情时把焦点移动到主角上。

从ini文件读取一个角色

LoadPlayer(num, filename, index);

Num=编号,filename=角色配置文件,index=索引,从文件读入主角

实例LoadPlayer(1,“ini\player.ini”,”哈非”);

交换两个角色的编号

SwitchPlayer(num1, num2);

通常是实现当前控制主角的切换,例如游戏中,哈非与兰特之间控制的切换

实例SwitchPlayer(0,1);

设置主角个数

SetPlayerNum(x)

X表示角色的个数。在《圣2-DEMO》里游戏有两位角色,兰特与克莉斯,在游戏后

期,克莉斯脱离队伍,在那里就有一句SetPlayerNum(1)。这次的正式版没有出现两位角色同时出项的情况,所以没有这句的实例。

说完主角再来看npc的控制。这里的很多语句同控制主角的类似,只是名称改变以及接口上多了一些东西而已。因为主角是游戏进入时自动加入的,而我们的npc不一定加入,所以在控制npc之前先要和游戏说一声我要使用一个npc,这个就像前面申请变量类似但申请过程有所不同。看看具体用法:

添加npc:

AddNpc(Filename, num);

Filename=NPC文件名num=NPC在该文件中的编号,npc的例子可以参考script\npc.npc。这个就是我前面说的申请一个npc。

强制Npc走动到x,y点

MoveNpcTo(Name, x, y);

Name=Npc名字,这个名字同上面读取得名字相同。这个语句的效果和移动主角的效果一样,但是我们的主角只有一个,而npc不止一个,所以为了区别npc的不同自然有一个名字。这个名字在后面控制npc的语句里都会出现。下次出现就不会多说了。

Npc走动到x,y点

MoveNpc(Name, x, y);

Name=Npc名字,(x,y)格子坐标。

设置NPC的位置

SetNpcPos(Name, mapX, mapY);

Name=Npc名字,(mapX,mapY)格子坐标。

设置NPC的方向

SetNpcDir(Name, Direction);

0=下 1=左 2=由 3=上

删除一个NPC

DelNpc(Name);

某些npc只出现一次,然后就消失,可以使用该命令。

设置NPC活动与否

SetNpcActive(Name, bActive)

bActive=0 (不活动) bActive=1 (活动)。游戏中出现在港口的人是属于可以活动的人,而出现在仓库里的木箱,苹果等是静止的npc。需要注意的一点,游戏添加npc时,npc的默认属性是在读取ini文件时设置的。一般在城市里的人物npc都可以设默认值为活动。

设置NPC显示与否

SetNpcShow(Name, bShow)

bShow=0 (不显示) bShow=1 (显示)

设置NPC脚本

SetNpcScript(Name, Script)

Script=脚本文件,一般在定义游戏npc时已经定义过了,如果临时需要修改脚本在这里也可以设定。对着人物按空格就可以触发设置好的脚本。

人物控制的有了,接下来看一些高级的。

设置游戏状态

SetPlayState(状态);

状态=0 (挂起游戏,这时游戏脚本连续执行)

状态=1 (打开游戏,脚本单步执行)

在切换地图前最好先挂起游戏。

设置显示模式

SetDisplayState(模式);

模式=0 (白天) 模式=1 (夜晚)。各位一定对游戏中的黑暗村庄记忆犹新,在那里除了主角周围一定范围内可以看得见东西,其他的都是漆黑一团。

返回游戏开始画面

BackToTitle;

功能:从游戏退出,一般游戏大结局后使用,不然游戏就不够完整了喔。

战斗

Fight(enemy1, enemy2, enemy3, role1, role2, role3);

功能我就不用说了,前三个enemy开头是的将要战斗的敌人名字,后面三个role开头的是我们的主角编号,看一个例子

Fight(“火狐狸”,””,”矮人”,0,,1);

这次战斗的敌方是“火狐狸”和“矮人”。而中间的””表示没有敌人。我方有两个人参加,他们的编号分别是0和1,上面的例子每方都省略了一个人。如果把上面的改成Fight(“火狐狸”,””,”矮人”);那么我方的当前可活动的角色全部参与战斗。

是否打开踩地雷战斗

EnableFight(x);

功能:如果某张地图临时不需要战斗可以使用该命令暂时停止踩地雷的战斗,但请注意一点,一旦需要恢复踩地雷请立即用相同的语句进行恢复,不然这个脚本命令会使所有地图都不能战斗。X=1 打开踩地雷,会发生战斗,x= 0关闭踩地雷,不会发生战斗。

载入地图

LoadMap("FileName.Map");

功能:读入一张地图为当前游戏地图

存储地图

SaveMap("FileName.Map");

功能:将当前游戏地图存盘

添加地图陷阱

AddMapHook(x, y, "next.gps");

功能:设置地图(x,y)点为陷阱,当主角一走上去就触发"next.gps"脚本。游戏中有时需要设立临时的陷阱,就使用它,但是要小心使用,因为这个和在地图编辑器里设定的陷阱不一样,一旦切换地图,这些陷阱将不复存在。

设置地图陷阱

SetMapHook(x, y, num);

功能:设置地图(x,y)点为第num号陷阱,当主角一走上去就触发第num号事件

设置地图某格

SetMapCell(level, x, y, num, page);

功能:设置地图level层的(x,y)点为第page页的第num号元素。游戏在港口时开门的动画就是使用他完成的,也就是说他可以临时编辑地图,和上面添加陷阱一样,一旦地图切换后再回来,刚才设定的新地图将不复存在。

编辑器上方有这样几个属性:

地面:255[6(0)] 指第0页第6号元素。

物体:255[225(3)][138(4)] 指物体层1使用第3页第225号元素,物体层2使用第4页第183号元素。

设置地图某格的阻挡关系

SetMapBlock(x, y, block);

功能:设置地图(x,y)点的是否可以行走。没什么好说的,看看进门的脚本就明白有什么作用了。

设置地图某格的层次关系

SetMapLevel(x, y, Level1, Level2);

功能:设置地图(x,y)点的层关系为level1\level2。Level1是物体层1 ,level2是物体层2。如果level1的数值为0则该层为地面层,如果数值为1则该层为天空层。这个实例SetMapLevel(1,2,0,0);说明在点(1,2)初两个物体层都设为地面层。

以x,y为地图中心点

CenterMap(x,y);

看名称就知道作用,我就不多说。

卷动地图到x,y点

ScrollMapTo(x,y,step);

还记得游戏开始时地图自动从城门一直移动到港口吧。

除了这些语句还有一些其他的语句也很有用。

调用其它脚本

call(脚本文件);

相当于调用一段子程序,我们在处理主要剧情时所使用的脚本都放在script目录下,在游戏中需要是从这里调用,这样好集中管理主要剧情的脚本。

改变金钱

AddMoney(num);

num=数量。如果输入的是正数,那游戏中人物的钱增加,如果是负数那么游戏人物的钱会减少。虽然现在还没有商店,但是我们还是可以想想怎么不通过商店用钱吧,在金点的珍藏软件里的《圣2-新的故事》里使用过这个语句(在不通过商店的情况下)。

添加物体

AddObject(Name, num);

Name=物体名称 num=物体数量(缺省为1)

删除物体

DelObject(Name, num);

Name=物体名称 num=物体数量(缺省为1)对某些特殊道具可以通过这个方式消失。

检测是否有某样物体

CheckObject(Name, $ret);

Name=物体名称 $ret=返回物体的数量,在该语句后面请使用break;。看玩家是否有一样特殊道具,目前这条语句我们还没有使用过。第一次就留给你。

延时

Delay(1000);

功能:延时1000毫秒。看起来没什么作用,不过在交代剧情时,让游戏停一下,好像是人物在思考,或者给玩家看清楚画面,反正用到它的地方不少,大家自行体会。

屏幕淡入

FadeIn(n, color=0);

n=0 (无效果) n=1 (百叶窗) n=2 (淡入)color=一个32位的颜色值。地图切换时常使用的语句,通常在切换地图并读入了所有的npc(定位好的)后才使用。不然让玩家看到npc添加的过程,不怎么舒服。

屏幕淡出

FadeOut(n);

n=0 (无效果) n=1 (百叶窗) n=2 (淡入)没什么好说的,和前面的淡入相反。在切换地图前使用。

播放背景音乐(循环)

PlayMusic("music\back.mid");

目前游戏的背景音乐只支持mid格式。重复播放。

停止播放背景音乐

StopMusic();

暂停播放背景音乐

PauseMusic();

继续播放背景音乐

ResumeMusic();

播放一个音效(单次)

PlaySound("sound\fight.wav");

目前游戏中的音效只支持wav格式。只播放一次。

停止播放音效

StopSound();

上面讲的都是游戏中用到的脚本语句,但光看是不行的,各位必须自己去试才行,编一些小脚本练习吧。在这里告诉各位一个小技巧,如果想测试一条脚本可以在游戏中按F8,它会弹出一个对话框,你可以在对话框里输入一条脚本命令。如果要连续测试多个脚本,可以按f2,这时游戏会执行一个在script目录下的test.gps脚本文件。

好了,了解了大部分常用的脚本,接下来是如何把上面的东西组合成我们的脚本文件。在这之前我们来看整个游戏脚本的编写过程。

1.编写出地图切换脚本

2.编写剧情主线的脚本

3.编写分剧情的脚本

4.编写其它脚本

地图切换脚本主要是读取地图文件和设置主角出现位置,个别地图还要增加一些活动npc等。因为这些脚本是游戏进行时经常碰到的,所以应该先处理,而且这时使用到的语句很多是重复的,很方便copy。

按照游戏地图要求写完地图切换脚本,就可以编写主线的剧情脚本。这时可以按照分镜的要求按游戏进程编写脚本,要注意的是游戏中控制进程的变量。这里我们可以列出一个变量使用表。最好也用一些陷阱语句把主角限制在一定范围内活动,不然到后期会出现很多错误是因为人物的活动范围太大而引起的。举个例子,假设我们的哈非想出城,这时也没有人拦他,到城外后发生战斗时我们派谁出去打?哈非?我们可没有做他战斗时的动画。兰特?这根本就是牛头不对马嘴。那只有程序出错游戏结束。

有了主线的剧情如果没有分剧情,第三步可以免了。

第四步的范围就比较宽广了,游戏npc的对话脚本等凡是上面没有写到的脚本在这一步都得把它们搞清楚。

我们先来写地图切换脚本。进入游戏打开地图编辑器。把光标移到需要添加陷阱的格子,用鼠标右键切换到脚本编辑框,

或者按“c”这是打开脚本编辑器的快捷键。如果在陷阱标题列表中有你想使用的脚本,直接选中点“ok”就行了。如果在这个列表中没有需要的脚本那只能自行增加,点右下角的“添加”按钮会出现一个对话框,在这里我们需要输入一个脚本文件名,当然这时建立的只是一个链接关系,而真正的脚本文件还是需要我们自己建立。

需要注意一点,我们的脚本文件的后缀名是.gps,输入脚本文件名时必须要连后缀名一起输进去,不然就找不到脚本。如果需要删除这个链接,在陷阱标题列表中选择要删除的对象,点删除就可以删除链接了。

这里我们想告诉大家地图和脚本的命名原则供大家参考。地图命名要真实反映地图的内容,例如房子的名称用house,城堡用castle,在同一场景的地图文件放在一个目录里,例如港口的地图放在YAKAPORT目录下,地图的文件名由h01-h12和yaka01-yaka02组成。这时的脚本可以使用两个地图的命组成,前面一个是当前地图名再加一个“-”后接需要到那张地图的名,例如从yaka01进入到h01,那么脚本文件名可以是yaka01-h01.gps。

第五章:游戏测试

编完地图,写好脚本,一部游戏就基本上完成了,这时需要进行测试。因为刚完成的游戏会有很多错误,为了不让玩家数落我们的游戏,希望大家一定要认真彻底的进行测试。在这里谈的测试主要集中在游戏的地图和脚本方面,下面是经验之谈。

地图测试主要归结为两个问题。

1、游戏中一些可以通过的地方实际却不能通过,一些不可以通过的地方却又可以通

过,这些可以归结为阻挡关系问题。

2、某些格应该是天空层,而我们却设成地面层。这些可以归结为地图的层次问题。

在这一步测试里我们主要是发现上面两类问题,而这种测试是很需要耐性和细心的,因此我们必须一遍又一遍地走地图。按我们的说法就是“踏遍游戏中每一个角落”。这里再说一个技巧,如果制作游戏的不是个人而是一个小组,那么最好让不是编写地图的人来测试地图,脚本测试时也一样(这个理论是从计算机的软件工程里抄来的,因为人们的普遍心理是

“自己做的东西是不会有错的”)。当其测试人员发现错误后,应该把错误列成一张表,并在里边写明那张地图的那个格有什么样的错误(阻挡还是层)或者一些地图上物品摆放问题。一次测试结束后错误列表交给地图的修改(制作)人员。当修改完成后,测试人员还应当对列表中的错误进行一次复查,以确认错误是否被改正(这步也是很重要),并着手进行下一次的测试工作。整个过程要持续多次,直到每一次测试结束后只发现有限的几个错误,测试才算结束(按软件工程的理论,错误是不可能完全清除的)。这个测试过程也适用于脚本测试。

地图测试的同时可以开展脚本测试,但脚本测试比地图测试麻烦许多。游戏的剧情越长测试的难度就越大,因为剧情越长出现的分支也越多,所以我们必须保证游戏的主剧情进行时不会出错才行,至于其它分支,在人员及精力充足时也应当做到没有错误。脚本测试也同地图测试一样要一遍遍地玩游戏,并细心观察错误。通过我们的测试把错误归结为以下几个方面:

1.脚本的语法错误。这类错误容易表现出来但并不容易改,一般出现错误时会弹出一个错误的提示框。或者程序无法执行,这时需要仔细看最后运行的脚本文件。我们常遇到的错误是忘了一些脚本的参数。例如say一不小心人物图片的那个空操作就忘了。读取npc 时名字输入错了等等。

2.阻拦关系错误。游戏中如果有两个角色,像我们的《圣2》这样,有哈非和兰特。在同一个地点这两个角色一个可以进入,而另外一个不可以。如果脚本编写不当两个角色就都可以进入该地点,这就是典型的阻拦关系错误。《圣2》也发现过类似错误。当兰特在魔法屋知道要去捡苹果游戏的小屋时却不进去,在游戏控制权切换到哈非后,哈非就可以进入那个小屋,按照要求哈菲在任何时候都不能进入那个小屋,当然这个错误现在已经修正。

第六章:其他设定

好了目前我们已经知道游戏的制作过程,但要制作出一款属于自己的游戏还有一些关于人物及其它的设定要做。我们先来看看主角的定义。打开文件ini\player.ini

下面的是一个典型的人物设置,让我们看看一个人物具体都有那些东西。这些属性的设置不单单是设置主角的,游戏中的npc的设置也是使用这些属性,npc包括敌人。

[兰特]

Id=0 // 编号,一般没什么用

Name=兰特//人物角色的名字,在游戏中显示的。

Width=32

Height=48 //主角行走时所用的图片的高度和宽度,我们的史莱姆只有32*32 Max_Step=4 // 一个方向有几祯

Max_Dir=4 // 一共有几个方向

StepList=主角_StepList // 步数索引(不用管)

DirList=_DirList // 方向索引(不用管)

StepSize=8 // 每步走的距离(单位:象素)

StepSize2=4

Script= // 对话的脚本

Level=1

Exp=0

MaxExp=180 //主角刚开始的等级,经验值以及升级到下一级需要的经验值

Hp=30

MaxHp=30 //主角的血(hp),以及血的上限(MaxHp),每升一次级上限会增加Mp=10

MaxMp=10 //主角可使用的魔法值(Mp)和魔法上限(maxmp)

Attack=25 //攻击力

Defend=12 //防御力

MagicAct=10 //魔法攻击力

MagicDef=10 //魔法防御力

Stamina=10

Luck=10 //运气

Speed=10 //速度

Bp=100

Ip=100

Money=100

Goods=主角_Goods //游戏一开始主角就有的物品

Arm=主角_Arm //游戏一开始主角就有的装备

Magics=主角_Magics //游戏一开始主角就有的魔法

Arms=0

Corselet=5

FightIni=ini\fight\FightRoleInit.ini //游戏中战斗时使用的设置,后面我们还会再讲到

x=304

y=240

oldx=304

oldy=240

CurrentStep=0; // 初始化的步数

CurrentDir=3; // 初始化的方向

LastDir=3; // 同上即可

bActive=1; // 是否自由走动

bShow=1; // 是否显示

SurfaceFileName=pic\lanted.bmp //主角移动时使用的图片

// 以下两个数据不用改,每个文件有一套就行了

[_StepList]

StepList[0]=0 // 第一步调用0号图片(站立)

StepList[1]=1 // 第二步调用1号图片(左脚)

StepList[2]=2 // 第三步调用0号图片(站立)

StepList[3]=3 // 第一步调用2号图片(右脚)

[_DirList]

DirList[0]=0

DirList[1]=1

相关文档