我是Lem0,自学倡导者,执迷于“不务正业”,被批评“旁门左道”。我注册并使用简书,希望能够记录一些我记不住的事情,或者与大家一起共享知识,共同学习。
往期回顾(点击链接访问):
「从0开始:开发自己的游戏[0]」
「从0开始:开发自己的游戏[1]」
「从0开始:开发自己的游戏[2]」
「从0开始:开发自己的游戏[3]」
「从0开始:开发自己的游戏[4]」
「从0开始:开发自己的游戏[5]」
在上一期教程中,我完成了游戏中开关和变量概念的讲解,并且修复之前的线性任务,使得开关、变量得以相互配合推进游戏发展。本期教程我将带领大家制作一个完善的任务剧情,使之看起来更像一个完整的游戏。请喜欢本系列教程的朋友们关注我,避免错过更新动态。
如果您没有看过之前的教程,或者在阅读本文时发现自己已经记不起以前的一些内容,建议您先查看往期的回顾,再继续本教程以确保效率。
6、复杂事件 - 更加复杂的任务流程制作
为了完成本期教程的案例,您需要根据您的喜好绘制一张如下所示的森林地图。如果您没有要求,也可以直接导入RMVA内置的范例地图。

首先我们来明确一下本期教程我们需要达成的目标。我们要制作一个类似于口袋妖怪游戏开始不久时的场景 - 玩家想要离开民居,走入森林中,但这时一位NPC(比如玩家的母亲)就会从屋子里冲出来挡在玩家面前,说你还没有武器不能进森林blabla,然后玩家从母亲那里获得武器并装备好,进入森林砍死几只史莱姆。
看起来是个很简单的情境,接下来我们就动手实现这个剧情。
Step1 分析流程
对于一切没有头绪的问题,我都建议仔细分析这个问题中可能出现的种种情况。我将这个情境的实现逻辑整理如下图:

Step2 进行接触检测
在游戏开发中有一个概念称为“碰撞检测”,即检测两个游戏世界中具有物理刚体性质的物体是否发生了碰撞。
RMVA本身不具备物理引擎,但依然需要处理游戏中各个游戏事件的碰撞。我在这里引入了一个概念“接触检测”,顾名思义,碰撞检测用以检测两个事件是否发生了碰撞,那接触检测就用来检测两个事件是否完全接触(即是否重合)。
RMVA提供了上述两种检测机制,在游戏事件页的“触发条件”中可以选择。其中“与玩家接触”即该事件检测到自己和玩家完全接触后触发,“按下确定键”即玩家在此事件前按下确定键后触发。一般而言与NPC的对话应当选择后者,而进行接触检测应当选择前者。
在玩家走入森林的必经之路上,放置一个游戏事件,选择触发方式为“与玩家接触”。

在事件指令中,我们再次回想我们的目的:当玩家走进森林时一定会与此事件接触,接触过后触发剧情。玩家的母亲从木屋中出来,挡在玩家面前。
Step3 编写事件指令
为了让玩家的母亲能够从木屋中“走出来”,我们要先使用事件指令“打开房门”。
如何打开房门呢?请大家回忆本系列教程[3]中,我们在室外地图的房屋上快速新建特定事件“门扉”的时候,曾经点开门扉事件查看了其事件指令。在快速新建该事件的时候,系统自动生成了一系列事件指令,完成“开门--角色进门--转换场景”的一系列操作。我们再次打开该事件,会发现负责处理“开门”这个动态效果的是一个“移动路线”指令。
我们在教程[2]中说到过,门也是包含在角色行走图中的,不同的是角色行走图里四个方向被替换为门从完全关闭到完全打开的四个样式。所以利用事件指令“移动路线”的命令,可以让门事件“转向”从而达到门打开的效果。
所以负责开门的指令如下:

之后我们需要做的是让另一个NPC,在本例中是玩家的母亲,从房门里走出来,来到玩家面前挡住玩家的去路。
让母亲从房门里出来,需要事先隐藏母亲的形象,也就是让母亲“隐身”,等房门打开时,再让母亲“出现”即可。为了让母亲隐身,我们可以在母亲事件页中新建一个空白的、没有设置图像的事件页,利用游戏开关进行事件页切换。
注意:如若多个事件页出现条件都达成,则先执行事件页编号高的页中的指令。因此,你需要将空白事件页设置为1,将含有母亲图像的事件页设置为2。


但是在RMVA中不允许将两个事件放置在同一个位置,也就是说,我们没法将母亲事件和门事件放置在同一个方格里。所以我们只能事先将母亲事件的位置放置在门上方一格:

在玩家触发剧情之后,先将母亲事件设置为“可以穿透”,然后设置母亲事件移动路线为“向下移动1次”。如此设置可以保证母亲事件和门事件出现在了同一格中。此时就可以使用开关切换母亲事件的事件页,让母亲从隐身变得可见。

接下来,让母亲走出房门,走到角色面前。我们需要数一数母亲所在的位置走到角色面前需要怎么行动,然后将路线写入到“移动路线”指令中,将移动对象设置为“母亲”。

然后我们添加“显示文字”指令,告知玩家还没有武器;之后通过“增减武器”指令给玩家一把长剑。我们需要让玩家装备好武器后再进入森林。
我们可以通过事件指令为玩家打开游戏菜单,让玩家装备武器。但是倘若玩家没有装备武器就退出菜单,我们还需要重复上述过程。因而我们需要用到循环指令。
在循环指令中,一定要设置一个跳出循环的条件,否则循环会一直执行。在本例中,循环内部可以使用条件分支指令判断玩家是否装备好了武器,若没有,继续循环,否则跳出循环。事件指令完成后如下图:

当玩家装备好武器之后,我们就应该让玩家的母亲返回到屋子里,依然使用“移动路线”指令即可。当玩家的母亲走入房门事件的时候,我们可以使用开关切换事件页,将母亲“隐身”,然后使用指令让房门关闭。这里和前面的指令基本类似,注意调整其中移动路线指令的顺序和方向即可。

这时你可以打开游戏测试一下。如果你的主角无法装备剑类别武器,请你按下F9打开数据库,对角色进行如下设置:

到此为止我们已经完成了玩家触发剧情的一系列事件指令。经历这个短暂的剧情之后玩家就可以进入森林冒险了。但这时地图上还没有任何怪物,我们需要给地图上添加敌人。
Step4 添加敌人
要添加敌人很简单,我们只需要在地图树上选定这张森林小镇地图,按下空格或者右键->地图设置,打开地图参数设置窗口:

在右侧的遇敌界面,我们可以双击空白部分添加敌人的队伍。这里添加的队伍都是事先在数据库里默认设置好的。以后大家可以访问数据库进行修改,添加自己想要制作的敌人和怪物队伍。

默认的出现范围是整张地图,但我们的城镇明显是安全的,因此我们可以选择“指定地图ID”来指定地图ID。比如这里我们先在第一个框内设置地图ID为2,剩下两个框保持原定的0即可。
点击确定即可完成设置。权重表示了该种类型的敌人队伍在指定区域出现的几率,而平均遇敌步数表示玩家在地图上平均移动多少步会遭遇敌人,这也是我们常说的“地雷遇敌”或者“暗雷遇敌”方式。关于如何制作明雷敌人,我们会在后面介绍。
那么回到地图ID上。什么是地图ID呢?我们点击上方工具栏的区域编辑模式,就在事件编辑模式的旁边。这时地图图块区域的图块变成了带着编号、颜色各异的方块:

区域编辑模式允许开发者为地图不同部分设置不同的ID编号,用以在不同的区域生成不同的怪物。比如这时我们用编号2的放歌涂满小镇外部,我们刚刚设置的怪物队伍就会出现在区域标号为2的地区了。
口袋妖怪中,也利用了类似的功能,只在草丛、山洞、水面出现怪物,因此草丛区域、水面区域、山洞区域带有不同的地图ID,保证了火属性怪物不会出现在水里,也保证了怪物不会出现在小镇里等等。
大家可以对这个剧情进行任意扩展。在下一期教程中我将带领大家了解RMVA的数据库,并且进行自己的游戏中道具、技能、角色、职业等系统的了解。
最近一直加班,教程写作过程可能过于仓促,如果您有任何问题请私信我留言,我会尽快回复。另外,由于工作压力太大本人打算赚点外快就跳槽,如果有意向找我合作,请用私信砸我,谢谢!
已授权“版权印”进行版权保护。
点击链接获取授权许可
<a>TBC 未完待续</a>
网友评论