从0开始:开发自己的游戏
文/Lem0在「从0开始:开发自己的游戏」中,我会介绍流行且简单的RPG游戏制作工具:RPG maker VX ace,手把手教你开发一款属于自己的游戏。你可能是开发者,是深度玩家,是对游戏感兴趣的人,无论你有没有编程基础,你都可以在这一系列文章结束时,打造出一款属于你的游戏。
https://di.gameres.com/attachment/forum/201705/19/1614500c6tec6jetc5jt0c.png
RPG Maker VA
可能有很多人事前接触过RPG maker系列游戏引擎,这个游戏引擎专为实现类似于《最终幻想6》、《口袋妖怪》等2D平面RPG游戏诞生。但你最不应该做的就是小看这款游戏引擎。我将从用户界面开始,讲到深层次的代码剖析,带你开发一个自己的游戏。
为了方便不同层次的读者选择自己着重阅读的章节,我将在此列出这一系列文章连载的目录。同时,希望喜欢这一些列文章、对游戏制作感兴趣的朋友关注我,避免错过更新动态。
准备工作 - 开发环境和用户界面
下载和安装好RPG maker VX ace(以下简称RMVA)后,打开软件。首先系统会提示你新建一个项目。
https://di.gameres.com/attachment/forum/201705/19/161450j75c1cl7u2lv2557.png
新建项目界面
在「文件夹」输入框里输入游戏项目文件夹的名称,在「游戏标题」中输入你想为游戏起的名字(日后可以更改),在「项目位置」中确定你要将项目储存在计算机的什么位置。
这些设置完毕后,单击确定,完成一个新项目的建立。在项目建立完成后,你会看到如下界面。
https://di.gameres.com/attachment/forum/201705/19/161451ozll6jfblk91qinn.png
新项目界面
这个界面就是游戏制作工具的主界面,在窗体上方的菜单栏中包含了RMVA的所有功能,我们将在以后详细讲解。
窗体左侧由上下两个部分组成。上部称为「图块区」,下部称为「地图树」。「图块区」中是绘制地图所用到的地图图块组(Tileset),「地图树」中列出来了目前游戏中所有的游戏地图。现在,新创建的游戏项目默认生成了一张蓝色大海的地图,地图名称为MAP001.
窗体右侧是「地图绘制区」。在这个区域中你需要完成地图的绘制和游戏主要的流程制作。
接下来,我们介绍几个会在以后制作游戏时常用的功能。
https://di.gameres.com/attachment/forum/201705/19/1614516j38g8jjj7w4s4h8.png
RMVA的菜单栏
游戏测试。在「菜单栏」最后的绿色三角符号就是测试符号。测试模式允许开发者游玩自己的游戏。同样,你可以点击「测试(G)」菜单下的「运行」进行游戏测试,或者之间按下键盘上的F12。
缩放游戏地图。在绘制大地图(比如繁华的城市中心和荒原森林)的时候,你尝尝需要缩小地图绘制整体,再放大地图绘制某些区域的细节。这个时候你需要对游戏地图进行缩放。在「比例(S)」菜单下可以进行地图按比例缩放的操作。同样,你也可以在「菜单栏」后部的1/1、1/2、1/4、1/8的按钮进行比例缩放。
https://di.gameres.com/attachment/forum/201705/19/161451qk70839uk6n60gmn.png
缩放至1/8的初始游戏地图
切换编辑模式。在RMVA中,进行游戏流程的制作和绘制游戏地图都在「地图绘制区」完成,所以我们需要切换用于制作游戏流程的事件模式和用于绘制地图的地图模式。在菜单栏的中前部,你可以找到切换两者的按钮。
https://di.gameres.com/attachment/forum/201705/19/161452fvrbzbggb4faprtf.png
地图编辑模式和事件编辑模式
切换地图绘制工具。在使用电脑上的画图软件时,很多时候我们需要将一定区域填充为某个颜色,或者使用矩形和椭圆工具绘制一个几何图形。在地图绘制的时候,你也可以使用类似于这些绘图工具的功能。
https://di.gameres.com/attachment/forum/201705/19/161452r0vjf8w8jgyl1dru.png
RMVA地图绘制中的绘画工具
要注意的是,你必须在“地图模式”下才能使用绘图工具绘制地图。如果你处在事件模式下,绘图工具为无法点击的状态。关于如何切换为地图模式,请参阅前文中的「切换编辑模式」。
角色初始位置。地图中的这个人物方块就是角色初始位置。
https://di.gameres.com/attachment/forum/201705/19/1614523pd66e047gg6y066.png
角色初始位置
角色初始位置即为游戏开始时玩家所控制的主角所处的位置。这个位置可以在“事件模式”下通过拖动这个任务方块改变角色的初始位置,也可以鼠标右键单击某个方块,选择「设置初始位置」->「玩家」即可。
https://di.gameres.com/attachment/forum/201705/19/16145220gttogwfwwqaf6f.png
改变角色初始位置
要注意的是,你必须在“事件模式”下才能改变玩家初始位置。如果你处在地图模式下,「地图绘制区」无法被点选。关于如何切换为事件模式,请参阅前文中的「切换编辑模式」。
掌握了这些基本知识后,我们尝试在初始地图添加一块岛屿。默认的初始地图是100x100的一片汪洋大海,我们切换编辑模式到「地图模式」,用鼠标选中左侧窗体「图块区」中的陆地样式,在汪洋大海中画一片小岛。
https://di.gameres.com/attachment/forum/201705/19/161453g1haafaf3qhsz36h.png
在大海中间画一片小岛
然后按下F12键进入测试模式。系统会在你保存后弹出游戏窗口,默认的游戏界面和BGM:
https://di.gameres.com/attachment/forum/201705/19/161453e1exzlk8vtebjxxl.png
默认的游戏开始界面
你可能会觉得字体、BGM、画面……整个游戏初始界面都非常难看。不用担心,我们日后会对这些进行优化。
使用RMVA制作的游戏操作方法是:使用光标键(方向键)控制角色移动和调整选项,使用Z键或者Space键确定,使用X键或者ESC键取消或者呼出菜单。如果你的操作正常,你会在进入游戏后看到在荒岛上的主角。
到现在你可能觉得你的心情和你刚刚点开这篇文章时截然不同。好丑好简陋的呼声充满你的内心。还是那句话,不要小看RMVA,我们会对这些进行美化处理。当我们一起学到后面的时候,你会惊讶于这个简单的游戏引擎具备的强大功能和表现效果。现在,不妨进行一下测试,体验一下游戏中的各种功能吧。
https://di.gameres.com/attachment/forum/201705/19/161453watld5u25daw6dbd.png
简陋的游戏画面
https://di.gameres.com/attachment/forum/201705/19/161454qgzn28kcs9vcyq88.png
可以按下取消键X或ESC呼出菜单,菜单也很简陋
下一篇文章教程,我会带领大家进行简单的地图绘制,带各位进入造物主神奇的世界中。如果您喜欢这一系列教程,或者对游戏制作产生了兴趣,请您关注我避免错过更新的教程。有任何疑问或者批评,烦请私信联系。
创造世界 - 简单的地图绘制
在上一章的教程中,我带领大家第一次认识了RPG Maker VX Ace(简称RMVA)这一款“麻雀虽小五脏俱全”的轻量级平面游戏开发工具,并且认识了用户界面和常用功能。在本期教程中,我会带大家学习地图的绘制和相关操作,包括新建地图、删除地图、调整地图参数、绘制室内、室外地图,自动生成地下城迷宫等等。
RPG Maker系列工具介绍
可能有很多人事前接触过RPG maker系列游戏引擎,这个游戏引擎专为实现类似于《最终幻想6》、《口袋妖怪》等2D平面RPG游戏诞生。但你最不应该做的就是小看这款游戏引擎。我将从用户界面开始,讲到深层次的代码剖析,带你开发一个自己的游戏。
在RMVA之前,Enterbrain公司还推出了RM 2000,RM 2003,RMXP, RMVX和最新的RMMV。从RMXP开始,RM系列开发工具基于Ruby编程语言开发了名为RGSS(Ruby Game Script System)的内置脚本语言,玩家可以对默认的游戏系统进行加强和二次开发。
最新的RMMV系列,开始放弃RGSS,转而使用每个程序猿都会的Javascript作为脚本语言,更方便实现了跨平台。
本系列教程我将使用RMVA进行讲解,希望大家自行获取购买本工具,我不会给出破解版工具的下载地址。
1、创造世界 - 简单的地图绘制
我们现在先简要回顾一下上一期的部分内容。如果大家确定还记得什么是「图块区」「地图绘制区」和如何切换「地图模式」和「事件模式」的话,请继续阅读,否则,我建议先查看「从0开始:开发自己的游戏」。
新建地图
首先,我们需要学习室外地图的绘制。为此,我们要新建一张地图。在「地图树」中,单击右键,选择新建地图。
https://di.gameres.com/attachment/forum/201705/19/161454j0nzuayu33d9yjxj.png
在地图树中进行新建地图的操作
之后弹出一个窗口,你需要在这个窗口中设置你要新建的地图的参数。
https://di.gameres.com/attachment/forum/201705/19/161454jzkzlslfa1kkkkzi.png
新建地图窗口
基本设置中,「备注名称」和「显示名称」都是当前地图的名称设置。不同的是,「备注名称」只会显示在地图树界面中,作为给开发者的提示和备忘,而「显示名称」会在进行游戏时显示在游戏中一段时间后消失(回想一下口袋妖怪,在你进入新的地区时,你的游戏界面右上角会弹出一个名称框,显示着诸如“101号道路”之类的信息,显示名称就是如此功能)。在这里我们随意填写即可。
在「图块组」中,点击下拉列表,你可以查看到游戏中默认的所有图块组。什么是图块组呢?为了方便绘制不同地区的地图,开发者们需要根据地区特点将不同的图片素材储存到不同的组中,比如所有用来绘制室内地图的图片素材就储存在名为“室内地图”的组中,而绘制室外地图的素材就储存在名为“室外地图”的组中。在这里我们需要绘制的是“室外地图”,因此,我们更改图块组为“室外地图”。
宽度和高度定义了游戏地图的尺寸。在这里我们为了方便绘制,选择20x20这个并不大的尺寸即可。这里的数字20表示的是地图的长和宽都是20个计数单位。这个所谓的计数单位就是大家切换编辑模式到「事件模式」后显示在地图绘制区的方格,每一个小方格为16px(像素)长和16px宽。需要注意的是,以后的地图可能需要绘制超大的尺寸,比如一个繁华的都市可能需要80x80个单位,你需要合理使用缩放工具进行绘制。
循环类型中有4个选项:不循环、纵向循环、横向循环、纵横循环。循环的意思是角色从地图一边走出边界,会从对边的边界走入。在早期的《最终幻想》系列中,世界地图经常用到这个设定。我们此时选择不循环即可。
我们暂时跳过其他参数的讲解。此时你需要确定你的设置和下图一样,然后就可以点击确定创建一张地图。
https://di.gameres.com/attachment/forum/201705/19/161455u8u6c515r2xu1y5y.png
基本参数的设置
认识图块
新建地图之后,你会看到默认的界面。这种一深一浅的蓝色格子在游戏中显示为一片漆黑。
https://di.gameres.com/attachment/forum/201705/19/161455h46466ic4ydc6sc9.png
新建地图之后的用户界面
左侧的图块区变成了室外地图的样子。接下来我要介绍图块区的相关内容。图块区分成了三个选项卡,A、B和C。其中,A选项卡中的图块用来绘制地表和墙壁等基层元素,而B及B以上的素材都是表层元素。使用更常见的解释就是,A层的图块属于底层图层,而B及B以上的图层属于上层图层,上层图层会遮盖底层图层。同时B及B以上的素材同属一个图层,不可以相互遮盖。
接下来我们选中草地的样式进行地表绘制。选中草地之后,使用绘制工具中的「油漆桶」,将地图全部涂成草坪。
https://di.gameres.com/attachment/forum/201705/19/161455cc7qcbxf99cfsx7x.png
绘制草地
注意,如果你选中草地图块之后,无法选中油漆桶进行绘制,请检查自己的编辑模式是否处于「地图模式」下。不知道编辑模式是什么或者不知道如何切换,请您查看上期的教程。
接下来,我们需要在光秃秃的草坪上绘制房屋。在左侧的图块区,你会看到有屋顶和墙壁系列图块:
https://di.gameres.com/attachment/forum/201705/19/161456gnhcj221rey00is3.png
用来绘制屋顶和墙壁的图块
下面选中屋顶,使用铅笔绘制工具,在地图绘制区绘制两排屋顶:
https://di.gameres.com/attachment/forum/201705/19/161456928m6s7r2h4srm29.png
绘制房顶的屋瓦
你可以自己确定房屋的长度。绘制完成后选中下面的墙壁绘制房屋的墙体:
https://di.gameres.com/attachment/forum/201705/19/161456fvfftft4n498nsz6.png
绘制房屋的墙体
一般来说为了美观性,你可以对屋顶和墙体的高度比例做出调整。但我不是设计师或者美工,我是程序员,美观性这个词这实在不是我的强项……
在你完成之后你就绘制了一个简单的房屋。接下来作为练习,你可以在地图绘制区绘制更多房屋。
https://di.gameres.com/attachment/forum/201705/19/1614567upzh40av35ttl07.png
继续绘制房屋
你可能觉得默认的图块样式很丑。你可以从你的美工那里获得更好看的图块资源。比如,我曾经购买一套价值300日元的素材,使用这些素材绘制房屋要显得好看一些。
https://di.gameres.com/attachment/forum/201705/19/161457wgeg00zmwv2vzee9.png
更好看的图块素材
https://di.gameres.com/attachment/forum/201705/19/161457u72zud0hb29yxc2z.png
来自于其他开发者使用RMVA制作的游戏
要绘制出这样的地图需要好看的素材和耐心,以及好的美感和长时间练习。但接下来,让我们继续我们简单的地图绘制学习。
添加装饰
绘制完房屋之后,我们可以暂时告别图块区的A选项卡了。我们点击图块区的B、C选项卡,开始按照自己的意愿添加一些装饰。需要注意的是,你可以每次在图块区按住鼠标左键拉取一整块区域进行绘制,比如:
https://di.gameres.com/attachment/forum/201705/19/161457gg62gdfplk0d6u82.png
绘制一些树木
你可以自己进行测试。就如我前面说到的,B、C选项卡属于高层图层,可以遮盖A图层的图块(比如图中的书目就遮住了房子的墙体)。默认的地图图块很少,只有A、B、C三个选项卡。在你导入自己的素材之后,图块最多可以扩展到E。如果还是不够,我们往往使用Photoshop辅助绘制地图。当然了,这些我会在之后讲解。
当你绘制错误之后可以使用橡皮修改。B选项卡的第一个空白图块就是橡皮:
https://di.gameres.com/attachment/forum/201705/19/1614588hw7t6sx744py779.png
橡皮图块
如果你在A选项卡的图块绘制中发生错误,你可以直接使用正确的图块覆盖。A选项卡图块不存在橡皮的概念。
你可以使用图块区的一些图块搭配橡皮创造巧用,比如树林的样式。当然了,你也可以给你的房屋加一个门。
https://di.gameres.com/attachment/forum/201705/19/16145832339o29pvo29t2u.png
绘制完成的室外地图
室内地图绘制
接下来我们需要新建一张17x17地图进行室内地图的绘制。新建地图时,请选择图块组为“内部地图”,尺寸为17x17,其它参数不变。如果你忘记了如何新建地图,请你查看前文的教程。
室内地图的绘制有所区别。我们需要先使用墙体的上半部分画出房屋的大体轮廓。
https://di.gameres.com/attachment/forum/201705/19/161459hr93bv8ig0g0x0hg.png
绘制房屋的轮廓
接下来填充墙体。墙体一般来说为两个单位高。你需要发挥你的空间想象力,完善你的地图:
https://di.gameres.com/attachment/forum/201705/19/161459ahkewbh3azkavrvu.png
完善墙体。房子的雏形已经显现出来了
我们只需要铺设地板就可以完成房子的构建。选择一块合适的地板样式,为房间内部铺满地板。
https://di.gameres.com/attachment/forum/201705/19/1615007fuktwd64kt1yfk7.png
为你的房间铺满地板
接下来你只需要进行简单的装饰就可以了。在你完成之后,你就可以在你的室外地图和室内地图中进行测试。测试的方法很简单,你需要切换编辑模式到事件模式下,将玩家的初始位置设置到你自己绘制的地图上,进入游戏测试即可。关于如何切换编辑模式和如何设置玩家初始位置,我在上一期教程中讲过,忘记的同学可以查看。
https://di.gameres.com/attachment/forum/201705/19/161500i5e4nijz116q2i4s.png
绘制地图完成后你可以进行测试
同样,你也可以使用自己的素材替换默认的丑陋的图块。
创世原料 - 认识不同规格的游戏素材
我带领大家学习了地图参数的设置、室外室内地图的简单绘制。在本期教程中,我会将地图绘制部分的教学收尾,并且带领大家从游戏文件夹开始认识游戏中的素材。
如果您没有看过之前的教程,或者在阅读本文时发现自己已经记不起以前的一些内容,建议您先查看往期的回顾,再继续本教程以确保效率。
地图的层级关系和如何删除地图
在地图树界面中,我们可以看到游戏中的所有地图。在这里我为每张地图设置了“备注名称”。要更改地图的参数,你可以在地图树上单击鼠标右键,选择地图设置,或者选中一张地图,按下空格键,在弹出的窗口中进行地图参数的重新设置。
地图树中,我们可以看到游戏地图的层级结构。目前我的三张地图“荒岛”、“室外小镇”、“民居”三张地图属于同一层级结构,在逻辑上属于并列关系。
https://di.gameres.com/attachment/forum/201705/19/1615011487gztx4i7yxpz8.png
地图树界面的地图层级结构关系
要改变层级结构,选中你要更改的地图进行拖动即可。比如接下来,我把“民居”地图拖动到“室外小镇”地图上。如此操作会将“民居”地图作为“室外小镇”的子地图。
https://di.gameres.com/attachment/forum/201705/19/161501a328n9d5t0o9ntyc.png
更改了地图层级关系
在游戏制作中,我们往往需要按照地图的逻辑关系,在地图树中进行层级结构的调整。一般而言一个城镇下的所有民居都将作为这个城镇下的子地图。比如在我的项目中,各地图之间就具备鲜明的逻辑关系。
https://di.gameres.com/attachment/forum/201705/19/161502a0dbddufsxu9s0ax.png
狄普恩镇的地图树
进行地图树的层级结构排列就像是进行代码缩进一样,不是必须的,但几乎是人人都知道的行业准则。
要想删除地图,只需要选中想要删除的地图并且按下delete键即可。你也可以在右键单击地图,在菜单中选择删除地图。要注意的是,一旦删除了一张地图,这张地图下的所有子地图也将被删除。
自动生成地下城
在游戏制作的过程中,如果你没有一个美工团队,而是自己作为独立开发者进行开发,你会遇到一个棘手的问题:地下城迷宫的绘制。每一个RPG游戏都有着数不胜数的地下城迷宫等待玩家探索。著名的“上古卷轴”系列游戏更是以此作为卖点。试想一下,每天重复大量的地下城迷宫绘制必然让你的大脑如同迷宫一样难以厘清。因此,RMVA提供了自动生成地下城的功能。
在地图树界面上,我们新建一张地图。这张地图可以略大,用作地下城的自动生成。在这里我将地图尺寸设置为40x40,且地图图块组使用迷宫图块。新建地图完成后,我们在这张新地图上单击鼠标右键,选择随机生成迷宫。
https://di.gameres.com/attachment/forum/201705/19/1615027pe9f28syxb3z9q8.png
随机生成迷宫
在弹出的窗口中,你需要为你要生成的地下城设置墙壁和地面图块。这里我随意选择了类似于山窟的图块。选择完成后点击确定。你会发现系统自动为你随机生成了迷宫地图。你只需要稍加修改就可以使用了。
https://di.gameres.com/attachment/forum/201705/19/1615034zchb1nrayyu4799.png
随机生成的地下城迷宫
如果对生成的迷宫不满意,你可以重复以上步骤。系统会每次为你随机生成新的迷宫。
认识游戏项目结构和素材规格
在这一部分我们需要学习相对于创造一个游戏世界来说显得“索然无味”的内容:认识游戏项目结构和素材规格。这一部分将十分重要,尤其是我们以后需要大量处理相关素材使用在游戏里,因此我将把这一部分放在制作游戏线性剧情的前面进行讲解。
我们在第一章教程中新建项目时,系统要求我们选择了项目储存目录。如果你现在还记得存储目录的话,请跟我一起打开它:
https://di.gameres.com/attachment/forum/201705/19/161503ga8yqwy9owww0ajt.png
游戏项目文件夹
在游戏项目文件夹下,我们会看到如上图所示的若干目录和文件。接下来我将按照次序讲解。
Audio文件夹内存储着游戏中使用的一切声音文件。Audio文件夹下包括了用以储存背景音乐的BGM文件夹,用于储存背景声音的BGS文件夹,用以储存音效的ME文件夹和用于储存声效的SE文件夹。
其中ME属于场景音效,而SE属于声效,包括了开关门、开关宝箱、得到金钱等等短暂的声音信号。
你可能会发现在你的游戏项目文件夹下,Audio文件夹是空的,没有任何声音,但你在游戏中进行测试时依然会听到音乐和音效。这是因为在你没有向项目文件夹中导入任何素材时,RMVA将自动使用系统自带的素材。RMVA系统自带素材的储存目录在你的RMVA目录下的RTP文件夹中。
使用在游戏中的声音文件通常是.ogg格式。
Data文件夹内存储着游戏项目中的一切数据,包含地图数据、数据库数据等等。这些数据以rvdata2为扩展名,无法被直接编辑,只能从RMVA中进行修改。
Graphics文件夹内储存着游戏项目中的一切图片素材。打开Graphics文件夹后,你可以看到很多子文件夹。
Animation文件夹:存储技能动画。技能动画是图片形式,分割成帧,并且在数据库中进行编辑。下图就展示了技能怒雷的图片:
https://di.gameres.com/attachment/forum/201705/19/1615046t6htbqzpilinp51.png
技能“怒雷”的图片,进行分割和排列后就会形成动画
battlebasks文件夹:存储着游戏中的战斗场景背景图。游戏中的战斗场景由battlebacks1和battlebacks2两个文件夹中的图片拼成。在讲到数据库的时候我们还会说到战斗系统。
battlers文件夹:存储着游戏中的敌人战斗形象。下图是我从RMVA的系统自带素材中截取的敌人形象。你可以从网络上和美术那里获得敌人的形象图片。
https://di.gameres.com/attachment/forum/201705/19/161505ahez3qggegq48482.png
其中一张敌人形象图
characters文件夹:存储着游戏中的角色行走图。什么是行走图呢?我们随便打开一张RMVA系统自带的素材(RMVA系统自带素材的储存目录在你的RMVA安装目录下的RTP文件夹中):
https://di.gameres.com/attachment/forum/201705/19/161505api46nhu9ppei8aa.gif
系统自带素材中的一张角色行走图
每张行走图包含八个角色行走时候的样子,每个角色又分为四个面向(上下左右),每个面向又分为三帧(迈左脚、站立不动、迈右脚)。你在游戏中控制角色行走时,系统就会自动循环播放行走图形成动画。
当然,行走图中还可以包含非角色的图片,比如下图:
https://di.gameres.com/attachment/forum/201705/19/161506h7r99ggrgr59oiih.png
也属于行走图的门
这张图中的门也和角色行走图类似,在游戏中可以像角色行走那样循环播放开门、关门的图画,形成动画效果。因此,当你自行设计和绘制行走图的时候应当注意其规格。
在浏览RMVA系统自带的行走图素材时,你会发现名称以!$开头的图片素材。这种图片每张只包含一个角色的四面向行走图。因此当你要导入游戏中的行走图素材只包含一个角色的时候,你应当将图片命名为以!$开头的格式。
https://di.gameres.com/attachment/forum/201705/19/161506d60snf6s5q6vuxuu.gif
只包含一个角色的行走图以!$作为文件名称的前缀
faces文件夹:储存角色说话时显示在对话框中的脸部肖像图。
https://di.gameres.com/attachment/forum/201705/19/1615078qhqwox7eidklwq7.png
脸部肖像图
Parallaxes文件夹:储存着游戏中的远景图案。什么是远景图呢?在著名游戏《地下城与勇士》中,地图可以简略分成地面、背景。其中,背景部分被我们称为远景,远景图可以营造出远距离的风景样式。由于远景图可有设置卷动,所以远景图和地图的配合可以加强视觉效果。
https://di.gameres.com/attachment/forum/201705/19/161507cs5sbnm5s4rlmesc.png
远景图的样例
在上面的图中,山地草坪使用图块组进行的绘制,而月亮和黑夜的天空图片就是远景图。这样会使地图的立体感和表现力增强。我们会在后面讲解远景图的设置和使用。
System文件夹:储存着游戏系统需要读取的图片。我们打开RMVA自带素材中的System文件夹,查看一下其中的图片:
https://di.gameres.com/attachment/forum/201705/19/161508kqzofrtxzr0y9207.png
System文件夹中的图片
其中Balloon图片储存着角色的气泡表情,比如惊叹,疑惑,爱慕等等。BattleStart是战斗开始时画面的渐变样式。GameOver是游戏结束之后的界面。Iconset是游戏中所有道具的小图标,在数据库中我们会见到。Shadow是角色脚下的阴影。Window是游戏中对话框和菜单等窗口的皮肤。这些图片都可以被替换。
Tilesets文件夹:储存着游戏的地图图块组。你可以将准备好的地图图块导入进去,替换系统默认的图块区的丑陋图块。在之后的数据库讲解中,我们还会详细地讲解如何设置和扩展图块区的图块。
Titles文件夹:储存着游戏的标题图片。游戏的标题图片出现在游戏开始界面,和战斗背景Battlebacks相同,游戏标题图片也是由两个Titles1和Title2文件夹中的图片拼合而成。
Graphics文件夹中的全部子文件夹到这里讲解完毕。大多数图片均是以png格式为佳,当然你也可以使用jpg格式,但涉及到有透明度通道的图片,请一定使用png格式(因为jpg格式会剔除alpha通道)。接下来我们离开Graphic文件夹,继续查看游戏项目根目录下面的其他文件夹。
Movies文件夹中储存着游戏中的影片文件,比如片头CG和过场动画。
System文件夹储存着游戏的扩展文件,在初级开发阶段请不要移动或者更改System文件夹中的内容。
Game.exe是游戏项目的可执行文件。你可以双击直接运行游戏,但以这样的方式运行并不是在调试模式下,而是普通玩家的游戏入口。
Game.ini是游戏的配置文件。我们在以后会对其中的项目进行更改,但现在请保持这个文件原样不动。
Game.rvproj2是游戏项目的可编辑文件,你每次都需要双击这个文件打开RMVA,进而编辑项目。当然了,在你的游戏制作完成之后,你可以删除这个文件。因为玩家并不需要对游戏项目进行编辑了。
以上就是游戏项目中的全部文件夹和他们的用途。你可以简单地将你想要增加的素材复制粘贴到游戏项目对应的目录中,然后你就可以在该项目里使用自己添加的素材。
https://di.gameres.com/attachment/forum/201705/19/1615087179m2e1nnnp19e7.gif
你可以从网络上获取更多的素材
如果本系列教程反响较好,我会逐步公开我制作游戏时用到的免费非商业授权素材,也可以推荐一些支持商业授权的素材网站(日本网站居多,需要VPN)。在以后的教程中我的讲解还是以RMVA自带素材为主。对于没有VPN或者Visa用于购买正版素材的朋友可以转账给我,我也可以代为付款。
还是我在第一期教程里说过的那句话,请大家千万不要小看这款游戏开发工具。使用RM系列引擎制作的著名游戏《血雨》和《血雨2》就被出版商看中。并且,在之后教程中,一旦你掌握了Ruby编程语言,你甚至可以开发自己的《口袋妖怪》或《最终幻想》。
学习造人 - 添加NPC和简单的游戏事件
在一个游戏中,游戏世界里的生物往往由玩家和NPC(不可操控角色)构成。玩家和NPC之间的交互已经是RPG游戏的固定模式之一,几乎每个RPG游戏都会设计或多或少的可交互NPC。甚至,类似于《辐射3》、《上古卷轴5》这样拥有庞大世界观的游戏中,NPC甚至对玩家有“情感”的概念,而且NPC的性格也决定了不同的NPC会对玩家的某一行为做出不同的反应。
在本章教程,我们就来试着添加NPC和简单的游戏事件。
那么什么是游戏事件呢?我给游戏事件的定义是:在游戏中,由玩家或者游戏逻辑本身触发的、为达到推动游戏进程或完成某个游戏动作的行为。比如,在商店完成一次交易、走进传送门传送到另一个地点、向NPC交还已经完成的任务等等都属于游戏事件。
比如,在我们第2期教程中已经完成的室内和室外地图建立一个移动事件——在室外地图的时候可以走进绿色屋顶的房间门,从而让玩家跳转到另一个场景——室内。
首先我们要切换编辑模式为“事件模式”。切换到事件模式之后,你无法绘制地图,并且地图被划分成不同的小方格。你可以在每个小方格中都建立一个游戏事件。
https://di.gameres.com/attachment/forum/201705/19/161509f1gsvesfocvk6ke6.png
事件编辑模式下的地图
我们选中绿色屋顶的房子,在黑洞洞的拱形门洞上单击右键,选择快速新建特定事件,并在子菜单中选择门扉。
https://di.gameres.com/attachment/forum/201705/19/1615097kzsawcxsebew1cf.png
快速新建事件
在弹出的窗口中,你可以选择门的样式——双击“门扉图像”。因为我们为墙壁上画上了拱形的门洞,因此我们在这里需要选择拱形门。
https://di.gameres.com/attachment/forum/201705/19/161510w7jwt8rg83jrrjsl.png
选择拱形门的图像
目标位置为玩家打开门后通向的地点。我们需要选择为室内地图的门口位置。如图:
https://di.gameres.com/attachment/forum/201705/19/161510e6tkews0siegxipp.png
选择目标位置
完成后点击确定,一个门扉事件就已经被建立了。我们可以看到地图上,绿色房子的墙壁上已经出现了一个拱形门的方块。我们可以双击这个方块进而打开事件页。
https://di.gameres.com/attachment/forum/201705/19/161511lgupnfggzxm6hpm4.png
游戏事件的事件页
我们来详细讲解这个被我们快速构建的门扉事件。这个窗口中,左上角的【名称】框中的名称可以随意编辑,这是为了防止开发者忘记这个事件的作用而进行的备注。
【出现条件】中为当前的游戏事件出现需要满足的条件。在这里我们不需要设置任何条件,因为这个门将一直存在,不需要达成特定条件才出现。而相反,其他一些事件可能需要设置出现条件——比如送信任务中,你必须接受了任务或者持有信件时,收信人才会出现在地图上。
【图像】为事件的图像,双击可以选择其他图像,如果设置成人形,就相当于建立了一个NPC。在某些情况下,你也可以设置图像为空,这样事件会存在在游戏中但不会显示出来,我们经常这样实现一些游戏逻辑,比如进入在两次进入城镇的时候根据剧情差异播放两首不同的BGM等等。
【自主移动】中可以为事件设置移动的方式。比如《口袋妖怪》中的NPC经常以不同的方式在地图上随机移动或按照指定的路线移动,就是使用这个功能模块达成的。在这个例子中,我们可不希望房门也随机移动,所以我们需要将移动方式设置为“固定”。在其他的几种移动方式中,“接近”的意思是不断接近玩家,在某些躲避游戏中也经常使用。
【选项】中有四个选项。其中步行动画的意思是该事件在移动的时候将行走图循环播放形成行走动画;踏步动画是即使该事件不移动也播放行走动画;固定朝向是该事件的朝向不会更改(比如如果该事件是一个NPC,那么勾选此项将导致NPC的脸只朝向固定方位);允许穿透是允许该事件和其他事件碰撞后穿过彼此,类似于其他游戏引擎中的“非碰撞体”概念。
【优先级】略过,你可以将鼠标悬停在选项上查看说明,很简单。
【触发条件】中有多种触发条件。你可以悬停鼠标在这一部分,来查看不同触发条件之间的区别。需要注意的是,触发条件和刚才说过的出现条件不同,即使没有达到触发条件,该事件还是会出现在地图上。但如果没有达到出现条件,则该事件是不会在游戏中显示和执行的。
在右侧的【执行内容】中,是该事件的“代码”。我之所以说RMVA这款游戏引擎适合初学者,就是因为它对不会编程的代码苦手很友好。这些代码本来应该由程序员编制,RMVA不仅简单地将代码命令化,而且还使用了大家熟悉的可读文本,而不是编程语言。
【执行内容】中的代码文本我们称为事件命令或事件逻辑。我们看看这个门的事件命令:
https://di.gameres.com/attachment/forum/201705/19/16151175jkyzyjymwzkoy1.png
门扉事件的事件命令
一旦事件被触发,事件命令就会按次序执行。在这个门扉事件中,首先会播放开门的声效,然后是一串“移动路线”指令用来播放开门的动画。紧接着玩家会向前移动一步。之后会播放脚步声的声效,并且进行场所移动,移动到室内地图的指定坐标。
我们可以将玩家的初始位置设置在室外地图上,然后测试游戏,走到绿色房子前,果然,主角打开了门并且进入到室内。
测试结束之后,我们来新建一个事件。在事件编辑模式下,双击一个空白的小方格建立一个新事件。在弹出的事件页中,我们选择一个看着顺眼的NPC图像。在右侧的【执行内容】列表中,我们双击空行,添加一条新的【事件指令】:显示文字。
https://di.gameres.com/attachment/forum/201705/19/161512asbvb23y512y85b2.png
新建游戏事件的事件页
https://di.gameres.com/attachment/forum/201705/19/161512j0t2ajjz0b0bb0oo.png
显示文字命令的编辑窗口
我们双击角色肖像图来选择角色的面部肖像。如果大家还有印象,我在上一期教程中说过,角色肖像图储存在Graphics => Faces文件夹下。
我们在文字框中输入“欢迎你,冒险者。”
https://di.gameres.com/attachment/forum/201705/19/161513wgrwwsga4w4r47z6.png
完成NPC的对话设置
之后点击确定,完成文字显示命令的添加。这时,你的事件页应该是下面的样子:
https://di.gameres.com/attachment/forum/201705/19/161514zxgxvkl7l2x3qk2q.png
完成后的事件页
之后我们可以设置该事件的【自主移动】类型为随机,移动的速度和频率都可以随机调整。完成设定之后点击确定关闭,一个新的NPC(其本质依然是游戏事件)就被创建好了。
测试游戏后,我们的玩家已经可以和NPC进行对话了:
https://di.gameres.com/attachment/forum/201705/19/161514cc15f74jc15j5475.png
游戏中的测试效果
至此为止我们就已经学习了游戏事件的创建。我们将在下几期教程讲解复杂游戏逻辑的实现。也就是事件指令中的【流程控制】部分和【条件控制】部分。
https://di.gameres.com/attachment/forum/201705/19/161515h26o2262v077zs76.png
事件指令
大家也可以随意测试其他的事件指令。比如我留一个小作业:创建一个NPC富豪,每次和富豪对话一次会获得100金币。创建另一个NPC乞丐,每和乞丐对话一次可以选择是否施舍乞丐,是的话则乞丐会提升主角1级。(关于如何选择施舍乞丐与否,你可以在事件指令中【信息】=>【显示选项】中完成设置)。
线性流程 - 学习游戏开关和变量与事件的配合
在上一章教程中,我简单介绍了快速新建特定事件和游戏事件的概念、定义和创建方法。本期教程我将主要讲解事件指令中的“条件控制”部分和“流程控制”部分,制作一个简单的任务剧情。请喜欢本系列教程的朋友们关注我,避免错过更新动态。
如果您没有看过之前的教程,或者在阅读本文时发现自己已经记不起以前的一些内容,建议您先查看往期的回顾,再继续本教程以确保效率。
条件控制 指令
如果大家还记得怎样新建一个游戏事件,请新建一个并且选择一个合适的图像使这个游戏事件成为一个NPC。我在这里依旧使用上期教程中的士兵形象。我将带领大家进行一个游戏任务的制作,玩家控制的角色可以接受任务并且完成它。这是标准RPG游戏中的流程。
https://di.gameres.com/attachment/forum/201705/19/161515iskb3sbddbmmzmmi.png
上一章的游戏事件,是一个士兵形象的NPC
在右侧的执行内容中,已经有了一条上期教程中添加的事件指令。若要删除该条指令,选中按下delete键即可。这里我们选中该条指令,按下space键,达到修改该条指令的效果。
注意,几乎任何时候按下space键都能够起到修改作用,例如在事件页中按空格键可以修改当前事件指令的参数;在地图树中按空格键可以修改当前地图的参数。
按下空格建修改这条“显示文字”指令,在弹出的窗口内输入下图所示的文字,然后确定,完成修改。
https://di.gameres.com/attachment/forum/201705/19/1615163bag7b376oa33y23.png
修改之后的文字显示指令
在这条显示文字的指令中,我使用了转义控制符。和大多数编程语言一样,转义控制符以反斜杠开始,通过不同的规则使文字显示内容变化。比如这条文字显示指令中,我使用了\c \c两个颜色控制符,转换了“皇家塔洛斯守卫军”文字的颜色为黄色。我还使用了\i这个图标绘制控制符,在对话窗口的“生命药剂”文字前绘制了第192号图标(外形是个药瓶的样子)。
在游戏中的预览结果就是下图这样。转义控制符被更换为不同的显示效果。
https://di.gameres.com/attachment/forum/201705/19/161516aaua27aozhc7hycu.png
转义控制符的使用
之后我们为了让玩家能够自由选择是否接受NPC士兵给出的任务,我们需要添加一个“显示选项”指令,让玩家能够根据自己的想法选择回复:
https://di.gameres.com/attachment/forum/201705/19/161517qh69ty6yklyjzg94.png
显示选项指令
按照上图设置完成,确定之后会发现事件页的执行内容中出现了显示选项的指令和两个分支。其中,选择第二项(也就是“我没时间”)的情形被默认为取消,选择第一项“我愿意”即为接受任务的回答。
https://di.gameres.com/attachment/forum/201705/19/161517y272av8yw2g75hj2.png
事件指令的执行内容中出现了选择分歧
在玩家选择接受了任务之后,我们需要设置一个开关。什么是开关呢?开关有ON(开)和OFF(关)两个状态,相当于程序设计中布尔值(逻辑值)的TRUE和FALSE。我们常常使用开关的状态来设计游戏进程。
https://di.gameres.com/attachment/forum/201705/19/16151817hlf7n6b47l61on.png
玩家选择接受任务的时候
在“我愿意”的选择分支下,新建一条事件指令,点击事件指令中的开关操作,打开开关操作窗口。我们在这里可以调整游戏中开关的数量。注意的是如果大量使用开关可能造成卡顿。在这里我不更改默认数量,直接在0001号开关的名称框内输入“玩家接受了任务。”
开关的名称相当于注释,不会起任何作用,因此即使是空白也是可以的。但是为了保证我们不会混淆这些开关,我们需要设置名称,且名称需要容易辨认。
https://di.gameres.com/attachment/forum/201705/19/161518o4ilbsgipzgqspbo.png
为游戏开关合理命名,避免混淆
这里0001号开关的用途是:当开关打开时表示玩家接受了任务,当开关关闭时表示玩家拒绝接受任务。因此我将名称设置为“玩家接受了任务”。点击确定,完成开关的操作。
https://di.gameres.com/attachment/forum/201705/19/161519fkzmt305000te6ip.png
完成NPC分配任务的环节
注意:为了简便,我将这个任务更改为皇家塔洛斯卫队只需要一个恢复药剂,特此说明
接下来我们需要新建一个事件页。点击游戏事件窗口的新建事件页创建一个新的事件页:
https://di.gameres.com/attachment/forum/201705/19/1615192qg21szqg8jx8gsn.png
新建一个事件页
新的事件页(事件页2)和旧的事件页(事件页1)仍属于同一个游戏事件。当一个游戏事件内有多个事件页存在的时候,游戏会检测事件页出现的条件,只执行满足出现条件的事件页。如果有多个事件页都符合出现条件, 则按照事件页编号从大到小的顺序开始。因而,这两个事件页都同属于在游戏开发中,我们往往需要使用多个事件页模拟不同时期NPC的表现。
在这个例子中,事件页1的事件指令用于模拟玩家接受任务前NPC的表现,事件页2的事件指令用于模拟玩家接受任务后到完成任务前NPC的表现。也就是说只要玩家不接受任务,则在和NPC对话时事件1会一直执行。当玩家接受了任务之后,则事件1不再执行,玩家和NPC对话的时候执行事件2。
在事件2中我们需要设置事件页2的出现条件。事件页2必须是在玩家接受任务之后才能出现的,所以我们需要将事件页2的出现条件设置为:开关0001:玩家接受了任务 开启时。
同时,事件页2的图像也要设置成和事件页1一样,即都设置成士兵的样子。否则玩家接受了任务之后,事件页1不再执行,转而执行事件页2的时候,NPC的样子突然改变,可能会让玩家吓一大跳。
在事件页2中,我们为了检测玩家是否完成了任务,需要引入一个条件判断。我们双击执行内容处的空白,新建一条事件指令,在弹出的事件指令中,我们选择分支条件:
https://di.gameres.com/attachment/forum/201705/19/161520gfhd8o5opfxz8d8r.png
分支条件
分支条件窗口中,你需要设置作为分歧条件的项目。比如这里我选择的分支条件是玩家是否持有生命药剂。如果玩家持有生命药剂,则视为任务完成,否则,视为任务没有完成。
https://di.gameres.com/attachment/forum/201705/19/161521ggjimjeoq2med32r.png
条件判断,用来判断是否满足指定条件
在判定任务完成之后,我们需要在玩家持有恢复药剂的时候减去玩家手中的药剂,作为角色交付给NPC的任务道具。我们在持有恢复剂的条件下新建一条事件指令,找到增减物品操作,进行如图设置:
https://di.gameres.com/attachment/forum/201705/19/161522p5mn0abp9cmmpq0c.png
增减物品的操作
在没有完成任务的场合,我们可以让NPC说一句话提示玩家。设置完成后,事件页2应该如下图所示:
https://di.gameres.com/attachment/forum/201705/19/161522b1jziag9dbjzbf3g.png
设置完成的事件页2
之后我们需要在前几期教程创建的室内地图中摆放一个游戏事件,用来给玩家增加一个治疗药剂。
https://di.gameres.com/attachment/forum/201705/19/161523zvodzqovkkwc0upd.png
在桌子上创建一个游戏事件
创建的游戏事件用来为玩家增加治疗药剂。但是增加或减少物品并不会在游戏中提示,也就是说你对着桌子按下确定键,不会有一个窗口弹出老提示你获得了某某道具。你需要打开背包查看物品列表。
在创建药剂事件时,一定要注意将本事件的优先级设置为与人物同层。
https://di.gameres.com/attachment/forum/201705/19/161523gfmnb89gz163zgg4.png
设置游戏事件的事件指令
之后我们创建一个快速事件,选择场所移动,将移动目标设置为室外地图的房屋门口,让玩家在获得了药剂的时候可以回到室外交付任务。
https://di.gameres.com/attachment/forum/201705/19/161524ab2uz2o7zua0axuu.png
创建一个快速的场所移动事件,让玩家在室内的时候能够走到室外
确认无误后,我们运行游戏进行测试。以下是游戏测试效果图:
https://di.gameres.com/attachment/forum/201705/19/161524v6c4m8x89r7u8a34.png
游戏测试场景
https://di.gameres.com/attachment/forum/201705/19/161525nae49e91pq6vp1za.png
接受任务但尚未完成时
https://di.gameres.com/attachment/forum/201705/19/161525tdx7heeliy9hdi9i.png
在小屋里获取“恢复药剂”
https://di.gameres.com/attachment/forum/201705/19/16152675fi885zaryrwzoh.png
获取了恢复药剂
https://di.gameres.com/attachment/forum/201705/19/1615272bo18jnqnunbq3ea.png
交还了任务
但到这里还有一些BUG。可能在调试过程中大家都发现了一些问题,我们需要在下一节教程的时候修复。
这里我先列出一些存在的错误:
当玩家完成任务后,如果背包内没有药剂,则下次和NPC对话,依然会提示“没有完成任务”。
当玩家完成任务后,如果背包内还有药剂,则下次和NPC对话时,任务会重复交付,玩家依然会被扣除恢复药剂。
在室内地图中,玩家可以重复领取恢复药剂。桌子上药剂这个游戏事件不会消失。
..
请大家尝试利用已经学习的开关和事件页尝试解决这些遗留问题。我将在下节教程进行讲解。
在上面教程中,我简单介绍了游戏中“开关”的概念和使用,并且结合事件指令中的分支条件和其他指令创建了一个简单的单线性任务。本期教程我将修复上节课后我们发现的几个问题,带领大家认识游戏变量并且运用流程控制指令丰富任务。请喜欢本系列教程的朋友们关注我,避免错过更新动态。
如果您没有看过之前的教程,或者在阅读本文时发现自己已经记不起以前的一些内容,建议您先查看往期的回顾,再继续本教程以确保效率。
问题处理
在上一节留下的诸多遗留问题,不知道诸位是否已经有了解决方案。接下来我将带领大家完善上期教程最后,我们经过测试留下的一系列问题。
当玩家完成任务后,如果背包内没有药剂,则下次和NPC对话,依然会提示“没有完成任务”,以及当玩家完成任务后,如果背包内还有药剂,则下次和NPC对话时,任务会重复交付,玩家依然会被扣除恢复药剂。这两个现象出现的原因是在玩家完成任务之后,任务NPC士兵的游戏事件中,执行的依然是事件页2的内容。由于事件页2的事件指令是为了“判断玩家是否完成任务”的,所以倘若玩家已经完成了任务,就不需要再进行事件页2的判断。
要解决这个问题,需要设置一个标记,在第一次交付任务之后,我们可以在事件指令中进行一个开关操作,将开关0002的名称设置为“玩家已经完成任务”。然后更改一下我们事件指令中的逻辑:
https://di.gameres.com/attachment/forum/201705/19/161527jez35zlwjx3356x5.png
使用程序框图辅助事件指令的设计
事件指令执行内容如下:
https://di.gameres.com/attachment/forum/201705/19/161528ipqp2iezei1ze2aa.png
更改后的事件指令
当然,要解决上面的问题,你也可以新建一个出现条件为“开关0002:玩家完成了任务 开启时”的事件页3,在事件页3中对玩家已经完成任务后的行为进行处理。这里不再演示。
大家可能会觉得,这样一个简单的任务就要用到2个开关,那如口袋妖怪和最终幻想之类的RPG行业顶尖大作不得用成千上万个开关吗?事实上,我们可以使用一种叫做独立开关的特殊开关。
https://di.gameres.com/attachment/forum/201705/19/161529nn3vnz9zni55vzss.png
独立开关
独立开关和开关一样,具有ON和OFF两个状态,且作用也与一般开关无异。但相比于开关,独立开关使用A、B、C、D而不是数字编号,而且独立开关是“独立在每个事件中的”,也就是说,每一个事件都有A、B、C、D四个开关,且不同事件中的独立开关不受其他事件中独立开关的影响。即使每个游戏事件都有A、B、C、D四个独立开关,但你一定要记住,他们互相独立,互不干扰。用编程方面的语言解释,独立开关的作用域仅限于它所在的游戏事件。
所以我们可以对NPC士兵的游戏事件中的事件页1进行如下更改:
https://di.gameres.com/attachment/forum/201705/19/161529p88aptytmrmq8f11.png
更改后的事件页1
对事件页2进行如下更改:
https://di.gameres.com/attachment/forum/201705/19/161530vk6qvdk7y1vk1km7.png
更改后的事件页2,注意左侧出现条件处也要更改
至此,我们已经完成了对于这个单线型任务的更改。你可以再次测试游戏。
下一个需要修复的问题是:在室内地图中,玩家可以重复领取恢复药剂。桌子上药剂这个游戏事件不会消失。这个很简单,我们只需要在室内地图中的药剂游戏事件中,添加一个空的事件页,并且使用独立开关进行“跳转”就可以了:
https://di.gameres.com/attachment/forum/201705/19/161530zgdmj7cudk5gcaqc.png
更改后的药剂事件事件页1
https://di.gameres.com/attachment/forum/201705/19/161531yee5ayaxoyl8ri8u.png
对药剂事件,新增空白的事件页并设置出现条件
至此,上期教程遗留的主要问题已经被解决了。
认识游戏变量
每个游戏都有大量的游戏变量。这些变量用于储存游戏中的数据,比如玩家生命值、某个道具的数量、玩家当前获得的成就数量、玩家的等级……
在RMVA中,操作变量的过程就需要为变量赋值或运算。我们新建一个游戏事件,新建一个事件指令,在事件指令窗口中找到变量操作命令,单击它,弹出如下图所示的窗口:
https://di.gameres.com/attachment/forum/201705/19/161531nvqgvd9lxe8eghd9.png
变量操作窗口
在变量操作中,变量数量可以更改,且以数值标号(从0001开始)。你可以操作单个变量,也可以对多个变量批量赋值。变量在被创建时,如果不赋值而直接进行算术运算,则默认初值为0.
比如我们制作一个形象为老爷爷的游戏事件,并且创建一个名称为0001:和老爷爷对话次数的变量,每和老爷爷对话一次,这个变量就增加1。然后我们使用显示文字指令中的转义控制符,每次输出我们和老爷爷对话的次数:
https://di.gameres.com/attachment/forum/201705/19/161532cac33g6g6rieibco.png
形象为老爷爷的游戏事件
在游戏中进行测试,则会发现这个变量每次增长1.这就是我们想要的结果。在更多情况下,我们还可能利用变量进行条件分支等操作。比如,当我们和老爷爷对话十次之后,第11次对话就会获得1金币的奖励,第12次对话会获得2金币奖励,奖励数量依次累加……
为了达到如此效果,我们需要一个条件分支指令。忘记的朋友可以返回之前的教程查看。这里我直接上图:
https://di.gameres.com/attachment/forum/201705/19/161532vwm6vsg5v4x3356n.png
在条件分支中设置条件
https://di.gameres.com/attachment/forum/201705/19/161533cpfimappfti02dfw.png
设置完成的事件页
可能有些复杂,但毕竟已经不需要手写代码了,所以也没有多么复杂。没有看懂的朋友可以看我来慢慢解释。
首先,每次对话我都需要为对话次数变量0001累加常数1。如果你不是程序员,那么你需要知道[变量0001:和老爷爷对话次数] += 1中,这个+=操作符号其实相当于[变量0001:和老爷爷对话次数] = [变量0001:和老爷爷对话次数] + 1。
之后,我需要判断对话次数是否达到了10次。这时就需要用到条件分支指令,判断一下对话次数变量0001的大小。
对话次数达到10次之后,我需要计算玩家获得的奖励,这里使用了另外一个0002号变量,储存玩家应该获得的金币数量。[变量0002:玩家应该获得的金币数量] = [变量0001:玩家和老爷爷对话数量] - 10。实际上这个计算等价于下面的两步计算,因为我们的RMVA必须将操作的变量自身作为一个操作数,因此这个计算步骤没法一次完成。
[变量0002:玩家应该获得的金币数量] = [变量0001:玩家和老爷爷对话数量]
[变量0002:玩家应该获得的金币数量] -= 10
完成之后,我们使用增减金钱的事件指令为玩家增加金钱,增加的数量为变量0002的数值。
https://di.gameres.com/attachment/forum/201705/19/161533cyw3nyg2xyviixh2.png
对话次数未满10次的情形
https://di.gameres.com/attachment/forum/201705/19/1615343410bsz0b79b1y01.png
对话次数为12次的情形
https://di.gameres.com/attachment/forum/201705/19/161534fpakp4nk7aafqez7.png
对话12次一共获得3金币
测试无误后,我们再进行新的一次变量操作。想象一下很多游戏里的情形:在柜子里找到了道具或者金钱,但道具种类、金钱数量等都是随机的。这也需要变量的操作。
https://di.gameres.com/attachment/forum/201705/19/161535ee44kne3sapyw9az.png
随机数处理
一般来说,玩家和NPC对话时,NPC的对话内容可能是随机的。我们只需要用一个随机数变量随机生成0~2三个数中的一种,再通过条件分支判断生成的随机数是几,从而设置不同的对话内容。
制作游戏的时候我们通常使用一个变量“游戏进程”来表示游戏进度,根据游戏进程的数值判断玩家处于游戏中的进度,从而控制游戏中事件的动作和表现。比如游戏进程为1的时候表示玩家刚刚创建角色进入游戏,新手村的NPC都会给予玩家帮助;但游戏进程为3的时候表示玩家已经该离开新手村了,这时新手村的NPC都会对玩家的离开表示不舍。
总之,利用游戏开关和游戏变量,配合多个事件页的运用,你就可以制作出更复杂的任务流程。
复杂事件 - 更加复杂的任务流程制作
为了完成本期教程的案例,您需要根据您的喜好绘制一张如下所示的森林地图。如果您没有要求,也可以直接导入RMVA内置的范例地图。
https://di.gameres.com/attachment/forum/201705/19/1615364dgrrvr3mt974zm1.png
导入范例地图中的森林场景
首先我们来明确一下本期教程我们需要达成的目标。我们要制作一个类似于口袋妖怪游戏开始不久时的场景 - 玩家想要离开民居,走入森林中,但这时一位NPC(比如玩家的母亲)就会从屋子里冲出来挡在玩家面前,说你还没有武器不能进森林blabla,然后玩家从母亲那里获得武器并装备好,进入森林砍死几只史莱姆。
看起来是个很简单的情境,接下来我们就动手实现这个剧情。
Step1 分析流程
对于一切没有头绪的问题,我都建议仔细分析这个问题中可能出现的种种情况。我将这个情境的实现逻辑整理如下图:
https://di.gameres.com/attachment/forum/201705/19/1615365x2mpq8ttd00atdu.png
剧情逻辑图
Step2 进行接触检测
在游戏开发中有一个概念称为“碰撞检测”,即检测两个游戏世界中具有物理刚体性质的物体是否发生了碰撞。
RMVA本身不具备物理引擎,但依然需要处理游戏中各个游戏事件的碰撞。我在这里引入了一个概念“接触检测”,顾名思义,碰撞检测用以检测两个事件是否发生了碰撞,那接触检测就用来检测两个事件是否完全接触(即是否重合)。
RMVA提供了上述两种检测机制,在游戏事件页的“触发条件”中可以选择。其中“与玩家接触”即该事件检测到自己和玩家完全接触后触发,“按下确定键”即玩家在此事件前按下确定键后触发。一般而言与NPC的对话应当选择后者,而进行接触检测应当选择前者。
在玩家走入森林的必经之路上,放置一个游戏事件,选择触发方式为“与玩家接触”。
https://di.gameres.com/attachment/forum/201705/19/1615375ac5w1wa5czllquz.png
在玩家的必经之路上放置触发事件
在事件指令中,我们再次回想我们的目的:当玩家走进森林时一定会与此事件接触,接触过后触发剧情。玩家的母亲从木屋中出来,挡在玩家面前。
Step3 编写事件指令
为了让玩家的母亲能够从木屋中“走出来”,我们要先使用事件指令“打开房门”。
如何打开房门呢?请大家回忆本系列教程中,我们在室外地图的房屋上快速新建特定事件“门扉”的时候,曾经点开门扉事件查看了其事件指令。在快速新建该事件的时候,系统自动生成了一系列事件指令,完成“开门--角色进门--转换场景”的一系列操作。我们再次打开该事件,会发现负责处理“开门”这个动态效果的是一个“移动路线”指令。
我们在之前的教程中说到过,门也是包含在角色行走图中的,不同的是角色行走图里四个方向被替换为门从完全关闭到完全打开的四个样式。所以利用事件指令“移动路线”的命令,可以让门事件“转向”从而达到门打开的效果。
所以负责开门的指令如下:
https://di.gameres.com/attachment/forum/201705/19/161538qpziampgzfimri7q.png
在触发事件中让门打开
之后我们需要做的是让另一个NPC,在本例中是玩家的母亲,从房门里走出来,来到玩家面前挡住玩家的去路。
让母亲从房门里出来,需要事先隐藏母亲的形象,也就是让母亲“隐身”,等房门打开时,再让母亲“出现”即可。为了让母亲隐身,我们可以在母亲事件页中新建一个空白的、没有设置图像的事件页,利用游戏开关进行事件页切换。
注意:如若多个事件页出现条件都达成,则先执行事件页编号高的页中的指令。因此,你需要将空白事件页设置为1,将含有母亲图像的事件页设置为2。
https://di.gameres.com/attachment/forum/201705/19/161539sgcpz3r0wwcz33d0.png
母亲事件的事件页1
https://di.gameres.com/attachment/forum/201705/19/16153982ja4249y81zy7vf.png
母亲事件的事件页2
但是在RMVA中不允许将两个事件放置在同一个位置,也就是说,我们没法将母亲事件和门事件放置在同一个方格里。所以我们只能事先将母亲事件的位置放置在门上方一格:
https://di.gameres.com/attachment/forum/201705/19/161540vkmldak232ttmt3i.png
母亲事件放置在门的上方
在玩家触发剧情之后,先将母亲事件设置为“可以穿透”,然后设置母亲事件移动路线为“向下移动1次”。如此设置可以保证母亲事件和门事件出现在了同一格中。此时就可以使用开关切换母亲事件的事件页,让母亲从隐身变得可见。
https://di.gameres.com/attachment/forum/201705/19/161540k6s84qgp4cq24jsz.png
使用开关切换事件页,让母亲现身
接下来,让母亲走出房门,走到角色面前。我们需要数一数母亲所在的位置走到角色面前需要怎么行动,然后将路线写入到“移动路线”指令中,将移动对象设置为“母亲”。
https://di.gameres.com/attachment/forum/201705/19/1615419r97ll9z13krphho.png
设置母亲的移动路线
然后我们添加“显示文字”指令,告知玩家还没有武器;之后通过“增减武器”指令给玩家一把长剑。我们需要让玩家装备好武器后再进入森林。
我们可以通过事件指令为玩家打开游戏菜单,让玩家装备武器。但是倘若玩家没有装备武器就退出菜单,我们还需要重复上述过程。因而我们需要用到循环指令。
在循环指令中,一定要设置一个跳出循环的条件,否则循环会一直执行。在本例中,循环内部可以使用条件分支指令判断玩家是否装备好了武器,若没有,继续循环,否则跳出循环。事件指令完成后如下图:
https://di.gameres.com/attachment/forum/201705/19/1615417ho69fc7ulyyho37.png
循环判断玩家的装备情况
当玩家装备好武器之后,我们就应该让玩家的母亲返回到屋子里,依然使用“移动路线”指令即可。当玩家的母亲走入房门事件的时候,我们可以使用开关切换事件页,将母亲“隐身”,然后使用指令让房门关闭。这里和前面的指令基本类似,注意调整其中移动路线指令的顺序和方向即可。
https://di.gameres.com/attachment/forum/201705/19/161542wbu9y75b25e5y5r7.png
完成后的事件页
这时你可以打开游戏测试一下。如果你的主角无法装备剑类别武器,请你按下F9打开数据库,对角色进行如下设置:
https://di.gameres.com/attachment/forum/201705/19/161542p49t4f1tmbbzcuca.png
对数据库的主角进行更改,让主角能够装备剑类别武器
到此为止我们已经完成了玩家触发剧情的一系列事件指令。经历这个短暂的剧情之后玩家就可以进入森林冒险了。但这时地图上还没有任何怪物,我们需要给地图上添加敌人。
Step4 添加敌人
要添加敌人很简单,我们只需要在地图树上选定这张森林小镇地图,按下空格或者右键->地图设置,打开地图参数设置窗口:
https://di.gameres.com/attachment/forum/201705/19/161543u6mayivus7ard6vq.png
地图参数设置窗口
在右侧的遇敌界面,我们可以双击空白部分添加敌人的队伍。这里添加的队伍都是事先在数据库里默认设置好的。以后大家可以访问数据库进行修改,添加自己想要制作的敌人和怪物队伍。
https://di.gameres.com/attachment/forum/201705/19/161543rzzfrmsyxxkq3wqr.png
添加敌人的队伍
默认的出现范围是整张地图,但我们的城镇明显是安全的,因此我们可以选择“指定地图ID”来指定地图ID。比如这里我们先在第一个框内设置地图ID为2,剩下两个框保持原定的0即可。
点击确定即可完成设置。权重表示了该种类型的敌人队伍在指定区域出现的几率,而平均遇敌步数表示玩家在地图上平均移动多少步会遭遇敌人,这也是我们常说的“地雷遇敌”或者“暗雷遇敌”方式。关于如何制作明雷敌人,我们会在后面介绍。
那么回到地图ID上。什么是地图ID呢?我们点击上方工具栏的区域编辑模式,就在事件编辑模式的旁边。这时地图图块区域的图块变成了带着编号、颜色各异的方块:
https://di.gameres.com/attachment/forum/201705/19/161544yoo999e9hsx3x1w9.png
区域编辑模式
区域编辑模式允许开发者为地图不同部分设置不同的ID编号,用以在不同的区域生成不同的怪物。比如这时我们用编号2的放歌涂满小镇外部,我们刚刚设置的怪物队伍就会出现在区域标号为2的地区了。
口袋妖怪中,也利用了类似的功能,只在草丛、山洞、水面出现怪物,因此草丛区域、水面区域、山洞区域带有不同的地图ID,保证了火属性怪物不会出现在水里,也保证了怪物不会出现在小镇里等等。
未完待续……
页:
[1]