我是Lem0,自学倡导者,执迷于“不务正业”,被批评“旁门左道”。我注册并使用,希望能够记录一些我记不住的事情,或者与大家一起共享知识,共同学习。
往期回顾(点击链接访问):
「从0开始:开发自己的游戏[0]」
「从0开始:开发自己的游戏[1]」
「从0开始:开发自己的游戏[2]」
「从0开始:开发自己的游戏[3]」
「从0开始:开发自己的游戏[4]」
由于近期频繁加班造成教程更新不定期。但我依然会尽量回复大家的评论和私信,再次对各位的鼓励和欣赏表示感谢。
在上一期教程中,我简单介绍了游戏中“开关”的概念和使用,并且结合事件指令中的分支条件和其他指令创建了一个简单的单线性任务。本期教程我将修复上节课后我们发现的几个问题,带领大家认识游戏变量并且运用流程控制指令丰富任务。请喜欢本系列教程的朋友们关注我,避免错过更新动态。
如果您没有看过之前的教程,或者在阅读本文时发现自己已经记不起以前的一些内容,建议您先查看往期的回顾,再继续本教程以确保效率。
问题处理
在上一节留下的诸多遗留问题,不知道诸位是否已经有了解决方案。接下来我将带领大家完善上期教程最后,我们经过测试留下的一系列问题。
当玩家完成任务后,如果背包内没有药剂,则下次和NPC对话,依然会提示“没有完成任务”,以及当玩家完成任务后,如果背包内还有药剂,则下次和NPC对话时,任务会重复交付,玩家依然会被扣除恢复药剂。这两个现象出现的原因是在玩家完成任务之后,任务NPC士兵的游戏事件中,执行的依然是事件页2的内容。由于事件页2的事件指令是为了“判断玩家是否完成任务”的,所以倘若玩家已经完成了任务,就不需要再进行事件页2的判断。
要解决这个问题,需要设置一个标记,在第一次交付任务之后,我们可以在事件指令中进行一个开关操作,将开关0002的名称设置为“玩家已经完成任务”。然后更改一下我们事件指令中的逻辑:
事件指令执行内容如下:
当然,要解决上面的问题,你也可以新建一个出现条件为“开关0002:玩家完成了任务 开启时”的事件页3,在事件页3中对玩家已经完成任务后的行为进行处理。这里不再演示。
大家可能会觉得,这样一个简单的任务就要用到2个开关,那如口袋妖怪和最终幻想之类的RPG行业顶尖大作不得用成千上万个开关吗?事实上,我们可以使用一种叫做独立开关的特殊开关。
独立开关和开关一样,具有ON和OFF两个状态,且作用也与一般开关无异。但相比于开关,独立开关使用A、B、C、D而不是数字编号,而且独立开关是“独立在每个事件中的”,也就是说,每一个事件都有A、B、C、D四个开关,且不同事件中的独立开关不受其他事件中独立开关的影响。即使每个游戏事件都有A、B、C、D四个独立开关,但你一定要记住,他们互相独立,互不干扰。用编程方面的语言解释,独立开关的作用域仅限于它所在的游戏事件。
所以我们可以对NPC士兵的游戏事件中的事件页1进行如下更改:
对事件页2进行如下更改:
至此,我们已经完成了对于这个单线型任务的更改。你可以再次测试游戏。
- 下一个需要修复的问题是:在室内地图中,玩家可以重复领取恢复药剂。桌子上药剂这个游戏事件不会消失。这个很简单,我们只需要在室内地图中的药剂游戏事件中,添加一个空的事件页,并且使用独立开关进行“跳转”就可以了:
至此,上期教程遗留的主要问题已经被解决了。
认识游戏变量
每个游戏都有大量的游戏变量。这些变量用于储存游戏中的数据,比如玩家生命值、某个道具的数量、玩家当前获得的成就数量、玩家的等级……
在RMVA中,操作变量的过程就需要为变量赋值或运算。我们新建一个游戏事件,新建一个事件指令,在事件指令窗口中找到变量操作命令,单击它,弹出如下图所示的窗口:
在变量操作中,变量数量可以更改,且以数值标号(从0001开始)。你可以操作单个变量,也可以对多个变量批量赋值。变量在被创建时,如果不赋值而直接进行算术运算,则默认初值为0.
比如我们制作一个形象为老爷爷的游戏事件,并且创建一个名称为0001:和老爷爷对话次数的变量,每和老爷爷对话一次,这个变量就增加1。然后我们使用显示文字指令中的转义控制符,每次输出我们和老爷爷对话的次数:
在游戏中进行测试,则会发现这个变量每次增长1.这就是我们想要的结果。在更多情况下,我们还可能利用变量进行条件分支等操作。比如,当我们和老爷爷对话十次之后,第11次对话就会获得1金币的奖励,第12次对话会获得2金币奖励,奖励数量依次累加……
为了达到如此效果,我们需要一个条件分支指令。忘记的朋友可以返回之前的教程查看。这里我直接上图:
可能有些复杂,但毕竟已经不需要手写代码了,所以也没有多么复杂。没有看懂的朋友可以看我来慢慢解释。
首先,每次对话我都需要为对话次数变量0001累加常数1。如果你不是程序员,那么你需要知道[变量0001:和老爷爷对话次数] += 1
中,这个+=操作符号其实相当于[变量0001:和老爷爷对话次数] = [变量0001:和老爷爷对话次数] + 1
。
之后,我需要判断对话次数是否达到了10次。这时就需要用到条件分支指令,判断一下对话次数变量0001的大小。
对话次数达到10次之后,我需要计算玩家获得的奖励,这里使用了另外一个0002号变量,储存玩家应该获得的金币数量。[变量0002:玩家应该获得的金币数量] = [变量0001:玩家和老爷爷对话数量] - 10
。实际上这个计算等价于下面的两步计算,因为我们的RMVA必须将操作的变量自身作为一个操作数,因此这个计算步骤没法一次完成。
[变量0002:玩家应该获得的金币数量] = [变量0001:玩家和老爷爷对话数量]
[变量0002:玩家应该获得的金币数量] -= 10
完成之后,我们使用增减金钱的事件指令为玩家增加金钱,增加的数量为变量0002的数值。
测试无误后,我们再进行新的一次变量操作。想象一下很多游戏里的情形:在柜子里找到了道具或者金钱,但道具种类、金钱数量等都是随机的。这也需要变量的操作。
一般来说,玩家和NPC对话时,NPC的对话内容可能是随机的。我们只需要用一个随机数变量随机生成0~2三个数中的一种,再通过条件分支判断生成的随机数是几,从而设置不同的对话内容。
制作游戏的时候我们通常使用一个变量“游戏进程”来表示游戏进度,根据游戏进程的数值判断玩家处于游戏中的进度,从而控制游戏中事件的动作和表现。比如游戏进程为1的时候表示玩家刚刚创建角色进入游戏,新手村的NPC都会给予玩家帮助;但游戏进程为3的时候表示玩家已经该离开新手村了,这时新手村的NPC都会对玩家的离开表示不舍。
总之,利用游戏开关和游戏变量,配合多个事件页的运用,你就可以制作出更复杂的任务流程。在这里留下一个作业:
从NPC士兵处接受任务,在房子里为士兵取得一个恢复药剂。但房间的门是紧锁的,需要和NPC老爷爷对话来获取钥匙。每次和老爷爷对话都有1/4的几率获得钥匙。最终将恢复药剂交到士兵手里,任务完成。
下一期教程中我会带领大家进行复杂的任务流程制作,使这个样例看起来更像是一个成熟的游戏。为此,你需要做如下准备:绘制新的地图“森林”,森林中有一片空地和小房子。
如果您喜欢本教程或者对游戏开发产生了兴趣,不妨关注我避免错过更新动态。另外,在本系列教程结束后我会进行Unity3D入门教程的编写,如果有喜欢吧Unity3D引擎的朋友也可以和我提前交流。
最近一直加班,教程写作过程可能过于仓促,如果您有任何问题请私信我留言,我会尽快回复。合作/授权/约稿请私信联系,不要向公众号后台发送消息(微信公众号还在建设,我不常登录)。另外,由于工作压力太大本人打算赚点外快就跳槽,如果有意向找我商谈约稿或出版的事宜,请用私信砸我,谢谢!
已授权“版权印”进行版权保护。获取授权