赞 | 274 |
VIP | 142 |
好人卡 | 63 |
积分 | 77 |
经验 | 92043 |
最后登录 | 2024-9-29 |
在线时间 | 2650 小时 |
Lv4.逐梦者 (版主)
- 梦石
- 1
- 星屑
- 6651
- 在线时间
- 2650 小时
- 注册时间
- 2013-8-23
- 帖子
- 2315
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 鑫晴 于 2023-5-9 23:36 编辑
#RPG Maker MV
事件脚本,
是很多萌新一直想学会怎么用,但是又不知道从哪里入门的东西
今天,就来给大家简单讲一讲
希望对你有所帮助
在脚本指令的第三页,有一个脚本功能,
怎么用呢?
我们先来一句最简单的JavaScript脚本:
console.log('Hello World!')
console.log('Hello World!')
就随便放在一个NPC身上
运行游戏,每次跟她触发一次对话
你都会发现。。。。。
她好像什么事都没有发生一样
站在一片空荡荡地草原,一个人静静地望着远方.......
不管你怎么跟她讲话
她都不想理你.....
等等!
你再按下键盘按键F8(或者F12),
可以显示开发者控制台,
在Console标签页面,日志里可以看到多了一句话
然后,
我们也可以直接通过Developer Tools输入脚本,
跟在事件指令中使用脚本指令调用脚本的作用是一样的。
你把刚才那句脚本在这里输入试试~
console.log("Hi, Welcome to Project1") console.log("https://rpg.blue/thread-383083-1-1.html")
console.log("Hi, Welcome to Project1")
console.log("https://rpg.blue/thread-383083-1-1.html")
对了。
这篇文章即将要讲解事件脚本的使用,也是直接在这里测试。
因为在这里输入完,游戏里就会同步显示,非常方便!
那么,在这里该如何写脚本呢?
官方开发组的Archeia大佬已经整理了一个超级完整的事件脚本文档。
在Google搜索"RMMV Script Calls"就能找到(RMVA版也有)
不过Google文档在国内是打不开的,
所以为了方便其他用户阅读,我把文档搬运到这里:
https://shimo.im/sheets/RykXT9vdTXWtqwT3/
先来看看表格前面几行
对比一下,是不是发现,这份文档其实是按照事件指令的顺序整理好的!
为了让大家更容易理解事件脚本,我在截图的时候会把英文页面也一起贴出来,大家可以和中文页面对比一下,就会知道为什么脚本为什么是这样写了~
显示文字
Show Text
事件指令:
在正常使用事件指令来显示文字,是这样用的:
这里有几个可以让你自定义的选项:
- 显示脸图(可选)
- 设置对话框窗口背景
- 设置对话框窗口位置
- 输入文本内容
这个你已经是非常熟悉了,反正往最大的框框打字就对了。
事件脚本:
如果要用脚本来显示文字,只需要这句:
- $gameMessage.add("俺はルフィ,海贼王になる男だ")
复制代码
然后在游戏中就会显示这句对话了~
如果想要添加脸图,需要在显示文字的脚本前面,多写一句
- $gameMessage.setFaceImage('Actor1',0)
- $gameMessage.add("\\C[2]\\P[1]:\\C[0]\n嗨,冒险者,好久不见啊!")
复制代码
就相当于,选择素材库的"Actor1.png",第1张脸图
有萌新可能不懂了,既然是显示第1张图
为什么setFaceImage('Actor1', 0), 这后面居然是 0 ,而不是1呢?
- $gameMessage.setFaceImage('Actor1',0)
复制代码
在编程语言里,数组都是从0开始计数的。
也就是说,最后第8位绿头紫瞳小姐姐,她的编号是7
显示对话框脸图知道怎么用脚本了,
窗口背景,窗口位置,其实也是一样的用法
如果要设置样式,要在显示对话之前设置好
- $gameMessage.setFaceImage('Actor1',0)
- $gameMessage.setBackground(1)
- $gameMessage.setPositionType(1)
- $gameMessage.add("Show Text Script Call")
复制代码
刚才已经说了,0就是数组的第1项
设置对话框背景:
这里选中的就是列表中的第二个选项
- $gameMessage.setBackground(1)
复制代码
相当于
设置对话框窗口位置:
- $gameMessage.setPositionType(1)
复制代码
相当于
这样看明白了吗?
还有个问题
用事件脚本显示的文字,能不能加转义符?
当然能啊,其实我前面已经有示范了~
还记得这个吗?
- $gameMessage.setFaceImage('Actor1',0)
- $gameMessage.add("\\C[2]\\P[1]:\\C[0]\n嗨,冒险者,好久不见啊!")
复制代码
实际上就相当于:
要注意的是,脚本里如果需要换行,需要用 \n 作为换行符,可不能随便加回车噢!
然后其他的转义符要在前面多加一个 \
比如第1号变量 \V[1],在这里就要写成 \\V[1]
既然说到变量,顺便来讲讲变量吧:
变量操作
Control Variables
其实用起变量来更简单,而且更好玩!
事件指令是这样的:
如果想要让变量 = 某个数字,比如
用脚本来实现就是:
- $gameVariables.setValue(1, 20);
复制代码
顺便在显示文字中预览一下:
- $gameVariables.setValue(1, 20);
- $gameMessage.add("变量:" + $gameVariables.value(1))
复制代码
注意到了吗?
我在显示对话里面加了一个新的东西
这个是用来获取变量的
$gameVariables.value(n)
而这是用来操作变量的
$gameVariables.setValue(n)
获取变量和在显示文章中的 \V[n] 的作用一样
这个n就是第几号变量的意思
其实就相当于这么写
这两句对话的结果是相同的:
- $gameMessage.add("变量:" + $gameVariables.value(1))
- $gameMessage.add("变量:\\V[1]")
复制代码
所以,如果你希望某个变量的值等于另一个变量的值
就是这样:
- $gameVariables.setValue(1, $gameVariables.value(2));
复制代码
随机数:
在事件指令面板中,
你想要随机得到一个1~5的数字:
在脚本中看到的随机数函数函数是这样的:
但是,如果你像前面教你的一样,马上写出了这样一句。。
- $gameVariables.setValue(2, Math.randomInt(5))
复制代码
表面看起来好像没错,
然而,实际上的结果,却是这样的:
为什么?
来跟大家讲解下这个随机数函数的用法:
Math.randomInt(n)
返回的是 0 ~ n 之间的正整数(但不包括n)
所以,Math.randomInt(5)
这样得到的数字只有:0、1、2、3、4
正确的用法是:
这样就能得到 1~5 之间的数字了~
如果你想要使用更多数学函数,可以去翻一下JavaScript的Math库,还有很多好用的数学函数,比如:
- // 向下取整
- Math.floor(x)
- //四舍五入
- Math.round(x)
- // 绝对值
- Math.abs(x)
- //最大值最小值
- Math.max(x,y)
- Math.min(x,y)
- // 三角函数
- Math.sin(x)
- Math.cos(x)
- Math.tan(x)
- // 平方根
- Math.sqrt(x)
- // 求x的y次方:
- // Math.pow(3,4) = 3*3*3*3
- Math.pow(x,y)
复制代码
游戏数据:
用变量代入游戏数据,是事件中非常非常非常重要的一个功能
而且,这个用脚本更加方便!!
- $gameVariables.setValue(6, $gamePlayer.x)
- $gameVariables.setValue(7, $gamePlayer.y)
- $gameVariables.setValue(8, $gameMap.events()[n].x)
- $gameVariables.setValue(9, $gameMap.events()[n].y)
复制代码
这个能看懂吗?
- // 设置变量6,7号为玩家坐标的x、y
- $gameVariables.setValue(6, $gamePlayer.x)
- $gameVariables.setValue(7, $gamePlayer.y)
- // 设置变量8,9号为第n号事件的坐标x、y
- $gameVariables.setValue(8, $gameMap.events()[n].x)
- $gameVariables.setValue(9, $gameMap.events()[n].y)
复制代码
这两个是玩家的坐标
- $gamePlayer.x
- $gamePlayer.y
复制代码
第n号地图事件的坐标
- $gameMap.events()[n].x
- $gameMap.events()[n].x
复制代码
数据库的数据
- $gameActors.actor(1)._name
- $gameActors.actor(1)._exp[1] //经验值
- $gameActors.actor(1).level //等级
- $gameActors.actor(1).hp
- $gameActors.actor(1).mp
- $gameActors.actor(1).mhp
- $gameActors.actor(1).mmp
- $gameActors.actor(1).atk //攻击力
- $gameActors.actor(1).def //防御力
- $gameActors.actor(1).mat //魔法攻击
- $gameActors.actor(1).mdf //魔法防御
- $gameActors.actor(1).agi //敏捷
- $gameActors.actor(1).luk //幸运
复制代码
如果不知道具体还有哪些属性,有个超级好用的办法:
直接获取一个对象,就可以看到它的所有属性方法了
你看,这些游戏数据,全都在这里啦!
至于它们为什么显示(...)呢?你鼠标点击一下,有惊喜。
既然能获取了,那能不能修改呢?
直接赋值,像$gameActors.actor(1)._exp[1] = 100 这样行不行?
当然不行!这是错误的
但是已经有现成的方法可以用了:
- $gameActors.actor(1).gainExp(50); // 增加50点经验值
- $gameActors.actor(1).gainExp(-50); // 减少50点经验值
复制代码
第3名队友增加50点经验值
- $gameParty.members()[2].gainExp(50);
复制代码
全体队友减少1点经验
- $gameParty.members().forEach(function(m){
- m.gainExp(-1)
- });
复制代码
最后再讲一个最最最最最实用的事件脚本!
操作开关
Control Switch
操作开关也是非常重要的一个功能
用起来更是简单:
- $gameSwitches.setValue(id, true/false);
复制代码
举例:
打开 1 号开关
- $gameSwitches.setValue(1, true);
复制代码
关闭 5 号开关
- $gameSwitches.setValue(5, false);
复制代码
花式玩法:
- $gameSwitches.setValue(1, ($gameVariables.value(1) >= 10))
复制代码
这个什么意思?
拆解一下:原本的结构是这样滴。
- $gameSwitches.setValue(id, true/false);
复制代码
首先,1 是 id 很好理解了。
然后,($gameVariables.value(3) >= 10) 是什么?
噢, $gameVariables.value(3) 前面讲到了,是获取 3 号变量。
那就变成了 (3号变量 > 10),判断 3号变量是否大于并等于10。如果>=10,返回 true。 如果小于10,返回 false。
所以啊,这句的意思就是判断 3号变量是否大于10,如果是,打开1号开关。
这是不是可以用在某些游戏关卡上面呢?根据某些变量,解锁特定内容?
再来看一个复杂点的!
真的,很复杂!
- $gameSwitches.setValue(1,
- ($gameSwitches.value(1) == false) &&
- ($gameSwitches.value(2) == true) &&
- ($gameSwitches.value(3) == true)
- )
复制代码
这个什么意思?
如果1号开关为OFF,
并且2号开关和3号开关都为ON的状态,
那么就把1号开关ON;否则,保持OFF状态。
我们来测试一下:
在测试模式中按下键盘F9,可以开启DEBUG面板
默认的DEBUG面板可以直接看到变量和开关的值
然后,把1号开关关闭;并且打开2、3号开关
- $gameSwitches.setValue(1,false)
- $gameSwitches.setValue(2,true)
- $gameSwitches.setValue(3,true)
复制代码
再按2下键盘的F9,重新进入DEBUG面板,
可以看到已经发生了变化
然后我们运行上面的脚本:
- $gameSwitches.setValue(4,
- ($gameSwitches.value(1) == false) &&
- ($gameSwitches.value(2) == true) &&
- ($gameSwitches.value(3) == true)
- )
复制代码
很明显,全都满足了我们想要的条件,相当于:
- $gameSwitches.setValue(4,
- (true) && (true) && (true)
- )
复制代码
就相当于这样:
- $gameSwitches.setValue(4,true)
复制代码
所以1号开关,也就打开了
那如果我们再运行一次脚本
这时候明显是不满足判断条件的,
所以,就会变成这样:
- $gameSwitches.setValue(4,
- (false) && (true) && (true)
- )
复制代码
就相当于这样:
- $gameSwitches.setValue(4,false)
复制代码
1号开关会还原回去,变成OFF了
以某个开关的状态来判断目前开关状态应该打开还是关闭,这个应该是比较频繁的操作了。
直接这样看好像有点懵逼,换做具体的应用场景,应该就会比较好理解了~
例如,
1号开关:是否第一次进入场景? (否)
2号开关:是否解锁了剧情A?(是)
3号开关:是否解锁了剧情B?(是)
如果满足了这些条件,就打开 4号开关。
操作独立开关
Control Self Switch
跟你说,用脚本来控制开关,真的超级超级超级实用!
因为,在正常使用事件指令的时候,
你是没有办法在A事件里面控制B事件的独立开关的!!
但是!!!
脚本可以啊!!
- $gameSelfSwitches.setValue([mapID, eventID, 'A'], true);
复制代码
比如:
控制 1号地图,第3号事件 的独立开关A,设置为OFF
$gameSelfSwitches.setValue([1, 3, 'A'], false);[/code]
注意,这里的第1个参数是个数组。如果不好理解,也可以试试这样:
控制1号地图,第5号事件的独立开关A,设置为ON
- const key = [1, 5, 'A'];
- $gameSelfSwitches.setValue(key, true);
复制代码
花式玩法:
关闭当前事件所在的地图第1、2、3、4、5号事件的独立开关A、B、C、D
- var eventIds = [1, 2, 3, 4, 5];
- var letters = ['A','B','C','D']
- for (var i = 0; i < eventIds.length; i++) {
- for (var j = 0; j < letters.length; j++) {
- var key = [this._mapId, eventIds[i], letters[j]];
- $gameSelfSwitches.setValue(key, false);
- }
- }
复制代码
关闭当前事件身上的所有独立开关
- $gameSelfSwitches.clear();
复制代码
-END-
更多的方法,自己看表格文档吧。。
RMMV Script Calls
https://docs.google.com/spreadsh ... KO75dtfKDOetnvh7OHs
打不开Google文档的,可以看下面这个:
https://shimo.im/sheets/RykXT9vdTXWtqwT3/
对了,还有@绝汪 整理的这个RMMV事件脚本整合
https://rpg.blue/thread-403194-1-1.html
好了,今天先介绍这么多了
有空再更新~
(我也不知道哪天有空)
|
评分
-
查看全部评分
|