RpgmakerMV脚本教程(4)-我有特殊的脚本技巧
前言
教程太监很久了,我这个人做事没什么计划也没什么常性,今天登录豆瓣发现有一些朋友还是很感兴趣我写的教程,所以今天我再来给大家分享点脚本技巧吧。
我们要讲就讲点别人没教过的特殊脚本技巧——动态调用RM事件命令的技术
如有雷同实属巧合。
痛点
在日常的RM事件编辑器中的命令可以满足绝大多数游戏开发需求。如果不满足的时候,我们可以扩展现有的rpg_window、rpg_sprites、rpg_scenes、rpg_objests里的元素,达到定制化的目的。这也是一般开发者做的事情,但是扩展一个元素对大多数人来说还是太麻烦了。
下面我举一个具体的例子(可能并不贴切),我在游戏中定义很多NPC,有好人有坏人,有任务NPC,有展现随机对话的普通NPC,不同的NPC肯定有不同的对话菜单。普通NPC的菜单是“对话,离开”。任务NPC的菜单是“对话,领任务,离开”,坏人的菜单是“对话,战斗,离开”。
“笨蛋”们怎么去实现这个功能呢?肯定是用事件编辑器机械的为每一个NPC机械的去写自己应该有的脚本对话框选项。这么做的好处是代码可读性比较高,大多数人都能看得懂。缺点是什么呢?可维护性较差。比如当你已经有100NPC时,突然想给好人和坏人NPC都加一个查看选项。。。。。。。。。刺激不刺激。
“聪明的家伙”们会用公共事件来实现这个功能,为普通NPC创建一个公共事件,为任务NPC创建一个公共事件,为坏人创建一个公共事件,对不同类别的NPC展现不同的对话框。这么做的好处是,可读性和可维护性都比较高,但是仍然不够灵活。比如说,玩家从任务NPC领完任务并完成之后“领任务”是不是应该变成“交任务”?我们在跟这个坏人“战斗”之前,如果了解到这个坏人还不是那么无药可救,是不是应该增加一个“感化”选项?难道我们还要再增加两个公共事件去展现这两种新的对话选项么?
一般情况下我们得按照RM的语法去手动扩展实现一个灵活选项的window(窗口),和相应的scene(场景),还要在插件里定义函数供事件编辑器去调用我们自定义的新场景展现窗口,这一波下来我们已经心疲力竭,明明跟事件编辑器里的功能就差那么一点,为什么我要写这么多代码。
正文来啦,下面我就为大家分享一种简单的办法,来灵活的调用事件编辑器里的功能。
设想
基于之前教程,我为大家展示了 data\Map001.json 中事件编辑器维护的事件命令的格式(json格式)。我们打开CommonEvents.json(在全局事件中设定过显示选项的脚本之后)

看到“显示选项”对应的命令CODE是102,判断选中那个选项的分支命令是402(402之后的脚本为分支内的脚本,indent要加1),那么我们是否可以动态的生成这种json格式的命令来动态执行呢?
普通NPC是{"code":102,"indent":0,"parameters":[["对话","离开"],3,0,2,0]},
任务NPC是{"code":102,"indent":0,"parameters":[["对话","领任务","离开"],3,0,2,0]},
普通NPC是{"code":102,"indent":0,"parameters":[["对话","战斗","离开"],3,0,2,0]},
我们能不能只用在plugin中直接调用json命令,动态修改parameters的内容就可以在一段脚本中动态展现不同选项框的效果。
答案是肯定的,我们可以通过脚本实现这种功能。
实现
1、我们在项目的文件夹下新建一个文件,起名叫NpcMenu.js

2、扩展 Game_Interpreter类(事件解释器,用于将json命令翻译成js脚本并执行),增加两个方法。

insertCommands是将参数中的json命令插入到解释器的当前执行命令的后面。
showTalkMenu是扩展一个可以直接在事件编辑器里调用的方法。
这个方法的最后在解释器中插入了一个编号为102显示选项的命令,选项的内容是根据参数type来决定的。
3、下面我们在RM编辑器中引入我们编写的plugin,并设置为NO。
在地图新建一个事件

确定》保存》运行游戏

总结
本期教程目的是给大家展现一个可以动态拼接RM原生json命令的技术,在-牺-牲-代-码-可-读-性-的前提下,提高代码的灵活性,通用性,最大发挥原生命令的价值,减少开发量的一个技术。我本身也不是什么高手,如果有不足和错误,还请大牛指点我改正。
可读性问题已经有解决方案,详见文章:https://www.douban.com/note/754174211/
大家有哪些地方搞不大懂的,可以留言