设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 36126|回复: 37
打印 上一主题 下一主题

[原创发布] 写给萌新的超简单事件脚本指南

[复制链接]

Lv4.逐梦者 (版主)

梦石
1
星屑
5791
在线时间
2649 小时
注册时间
2013-8-23
帖子
2315

开拓者

跳转到指定楼层
1
发表于 2019-8-16 11:16:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 鑫晴 于 2023-5-9 23:36 编辑

#RPG Maker MV

事件脚本,

是很多萌新一直想学会怎么用,但是又不知道从哪里入门的东西



今天,就来给大家简单讲一讲

希望对你有所帮助




在脚本指令的第三页,有一个脚本功能,

怎么用呢?



我们先来一句最简单的JavaScript脚本:
JAVASCRIPT 代码复制
  1. console.log('Hello World!')




就随便放在一个NPC身上




运行游戏,每次跟她触发一次对话

你都会发现。。。。。





她好像什么事都没有发生一样

站在一片空荡荡地草原,一个人静静地望着远方.......


不管你怎么跟她讲话

她都不想理你.....





等等!

你再按下键盘按键F8(或者F12)

可以显示开发者控制台,

在Console标签页面,日志里可以看到多了一句话





然后,

我们也可以直接通过Developer Tools输入脚本,

跟在事件指令中使用脚本指令调用脚本的作用是一样的。





你把刚才那句脚本在这里输入试试~


JAVASCRIPT 代码复制
  1. console.log("Hi, Welcome to Project1")
  2. console.log("https://rpg.blue/thread-383083-1-1.html")




对了。

这篇文章即将要讲解事件脚本的使用,也是直接在这里测试。
因为在这里输入完,游戏里就会同步显示,非常方便!


那么,在这里该如何写脚本呢?


官方开发组的Archeia大佬已经整理了一个超级完整的事件脚本文档。

在Google搜索"RMMV Script Calls"就能找到(RMVA版也有)





不过Google文档在国内是打不开的,
所以为了方便其他用户阅读,我把文档搬运到这里:

https://shimo.im/sheets/RykXT9vdTXWtqwT3/



先来看看表格前面几行



对比一下,是不是发现,这份文档其实是按照事件指令的顺序整理好的!





为了让大家更容易理解事件脚本,我在截图的时候会把英文页面也一起贴出来,大家可以和中文页面对比一下,就会知道为什么脚本为什么是这样写了~






显示文字
Show Text



事件指令:
在正常使用事件指令来显示文字,是这样用的:





这里有几个可以让你自定义的选项:
- 显示脸图(可选)
- 设置对话框窗口背景
- 设置对话框窗口位置
- 输入文本内容


这个你已经是非常熟悉了,反正往最大的框框打字就对了。



事件脚本:
如果要用脚本来显示文字,只需要这句:
  1. $gameMessage.add("俺はルフィ,海贼王になる男だ")
复制代码





然后在游戏中就会显示这句对话了~



如果想要添加脸图,需要在显示文字的脚本前面,多写一句
  1. $gameMessage.setFaceImage('Actor1',0)
  2. $gameMessage.add("\\C[2]\\P[1]:\\C[0]\n嗨,冒险者,好久不见啊!")
复制代码



就相当于,选择素材库的"Actor1.png",第1张脸图




有萌新可能不懂了,既然是显示第1张图

为什么setFaceImage('Actor1', 0), 这后面居然是 0 ,而不是1呢?
  1. $gameMessage.setFaceImage('Actor1',0)
复制代码





在编程语言里,数组都是从0开始计数的。
也就是说,最后第8位绿头紫瞳小姐姐,她的编号是7




显示对话框脸图知道怎么用脚本了,
窗口背景,窗口位置,其实也是一样的用法

如果要设置样式,要在显示对话之前设置好
  1. $gameMessage.setFaceImage('Actor1',0)
  2. $gameMessage.setBackground(1)
  3. $gameMessage.setPositionType(1)
  4. $gameMessage.add("Show Text Script Call")
复制代码



刚才已经说了,0就是数组的第1项


设置对话框背景:
这里选中的就是列表中的第二个选项
  1. $gameMessage.setBackground(1)
复制代码


相当于




设置对话框窗口位置:
  1. $gameMessage.setPositionType(1)
复制代码


相当于





这样看明白了吗?



还有个问题
用事件脚本显示的文字,能不能加转义符?





当然能啊,其实我前面已经有示范了~

还记得这个吗?
  1. $gameMessage.setFaceImage('Actor1',0)
  2. $gameMessage.add("\\C[2]\\P[1]:\\C[0]\n嗨,冒险者,好久不见啊!")
复制代码



实际上就相当于:




要注意的是,脚本里如果需要换行,需要用 \n 作为换行符,可不能随便加回车噢!


然后其他的转义符要在前面多加一个 \

比如第1号变量 \V[1],在这里就要写成  \\V[1]




既然说到变量,顺便来讲讲变量吧:



变量操作
Control Variables


其实用起变量来更简单,而且更好玩!




事件指令是这样的:




如果想要让变量 = 某个数字,比如



用脚本来实现就是:
  1. $gameVariables.setValue(1, 20);
复制代码




顺便在显示文字中预览一下:
  1. $gameVariables.setValue(1, 20);
  2. $gameMessage.add("变量:" + $gameVariables.value(1))
复制代码







注意到了吗?

我在显示对话里面加了一个新的东西
  1. $gameVariables.value(n)
复制代码



这个是用来获取变量的
$gameVariables.value(n)


而这是用来操作变量的
$gameVariables.setValue(n)


获取变量和在显示文章中的 \V[n] 的作用一样
这个n就是第几号变量的意思

其实就相当于这么写
这两句对话的结果是相同的:
  1. $gameMessage.add("变量:" + $gameVariables.value(1))
  2. $gameMessage.add("变量:\\V[1]")
复制代码




所以,如果你希望某个变量的值等于另一个变量的值


就是这样:
  1. $gameVariables.setValue(1, $gameVariables.value(2));
复制代码






随机数:

在事件指令面板中,
你想要随机得到一个1~5的数字:





在脚本中看到的随机数函数函数是这样的:
  1. Math.randomInt(n)
复制代码



但是,如果你像前面教你的一样,马上写出了这样一句。。

  1. $gameVariables.setValue(2, Math.randomInt(5))
复制代码



表面看起来好像没错,
然而,实际上的结果,却是这样的:




为什么?
来跟大家讲解下这个随机数函数的用法:


Math.randomInt(n)
返回的是 0 ~ n 之间的正整数(但不包括n)


所以,Math.randomInt(5)
这样得到的数字只有:0、1、2、3、4


正确的用法是:
  1. 1 + Math.randomInt(5)
复制代码



这样就能得到 1~5 之间的数字了~



如果你想要使用更多数学函数,可以去翻一下JavaScript的Math库,还有很多好用的数学函数,比如:


  1. // 向下取整
  2. Math.floor(x)

  3. //四舍五入
  4. Math.round(x)

  5. // 绝对值
  6. Math.abs(x)

  7. //最大值最小值
  8. Math.max(x,y)
  9. Math.min(x,y)

  10. // 三角函数
  11. Math.sin(x)
  12. Math.cos(x)
  13. Math.tan(x)

  14. // 平方根
  15. Math.sqrt(x)

  16. // 求x的y次方:
  17. // Math.pow(3,4) = 3*3*3*3
  18. Math.pow(x,y)
复制代码






游戏数据:

用变量代入游戏数据,是事件中非常非常非常重要的一个功能




而且,这个用脚本更加方便!!

  1. $gameVariables.setValue(6, $gamePlayer.x)
  2. $gameVariables.setValue(7, $gamePlayer.y)
  3. $gameVariables.setValue(8, $gameMap.events()[n].x)
  4. $gameVariables.setValue(9, $gameMap.events()[n].y)
复制代码




这个能看懂吗?
  1. // 设置变量6,7号为玩家坐标的x、y
  2. $gameVariables.setValue(6, $gamePlayer.x)
  3. $gameVariables.setValue(7, $gamePlayer.y)

  4. // 设置变量8,9号为第n号事件的坐标x、y
  5. $gameVariables.setValue(8, $gameMap.events()[n].x)
  6. $gameVariables.setValue(9, $gameMap.events()[n].y)
复制代码




这两个是玩家的坐标
  1. $gamePlayer.x
  2. $gamePlayer.y
复制代码




第n号地图事件的坐标
  1. $gameMap.events()[n].x
  2. $gameMap.events()[n].x
复制代码






数据库的数据






  1. $gameActors.actor(1)._name
  2. $gameActors.actor(1)._exp[1] //经验值
  3. $gameActors.actor(1).level   //等级
  4. $gameActors.actor(1).hp
  5. $gameActors.actor(1).mp
  6. $gameActors.actor(1).mhp
  7. $gameActors.actor(1).mmp
  8. $gameActors.actor(1).atk //攻击力
  9. $gameActors.actor(1).def //防御力
  10. $gameActors.actor(1).mat //魔法攻击
  11. $gameActors.actor(1).mdf //魔法防御
  12. $gameActors.actor(1).agi //敏捷
  13. $gameActors.actor(1).luk //幸运
复制代码





如果不知道具体还有哪些属性,有个超级好用的办法:

直接获取一个对象,就可以看到它的所有属性方法了

  1. $gameActors.actor(1)
复制代码






你看,这些游戏数据,全都在这里啦!

至于它们为什么显示(...)呢?你鼠标点击一下,有惊喜。


既然能获取了,那能不能修改呢?
直接赋值,像$gameActors.actor(1)._exp[1] = 100 这样行不行?
当然不行!这是错误的



但是已经有现成的方法可以用了:


  1. $gameActors.actor(1).gainExp(50);   // 增加50点经验值
  2. $gameActors.actor(1).gainExp(-50);  // 减少50点经验值
复制代码



第3名队友增加50点经验值
  1. $gameParty.members()[2].gainExp(50);
复制代码




全体队友减少1点经验
  1. $gameParty.members().forEach(function(m){
  2.   m.gainExp(-1)
  3. });
复制代码






最后再讲一个最最最最最实用的事件脚本!


操作开关
Control Switch



操作开关也是非常重要的一个功能



用起来更是简单:
  1. $gameSwitches.setValue(id, true/false);
复制代码



举例:
打开 1 号开关
  1. $gameSwitches.setValue(1, true);
复制代码


关闭 5 号开关
  1. $gameSwitches.setValue(5, false);
复制代码



花式玩法:

  1. $gameSwitches.setValue(1, ($gameVariables.value(1) >= 10))
复制代码


这个什么意思?

拆解一下:原本的结构是这样滴。
  1. $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号开关。
这是不是可以用在某些游戏关卡上面呢?根据某些变量,解锁特定内容?


再来看一个复杂点的!
真的,很复杂!


  1. $gameSwitches.setValue(1,
  2.   ($gameSwitches.value(1) == false) &&
  3.   ($gameSwitches.value(2) == true) &&
  4.   ($gameSwitches.value(3) == true)
  5. )
复制代码




这个什么意思?

如果1号开关为OFF,
并且2号开关和3号开关都为ON的状态,
那么就把1号开关ON;否则,保持OFF状态。


我们来测试一下:

在测试模式中按下键盘F9,可以开启DEBUG面板
默认的DEBUG面板可以直接看到变量和开关的值



然后,把1号开关关闭;并且打开2、3号开关
  1. $gameSwitches.setValue(1,false)
  2. $gameSwitches.setValue(2,true)
  3. $gameSwitches.setValue(3,true)
复制代码



再按2下键盘的F9,重新进入DEBUG面板,
可以看到已经发生了变化





然后我们运行上面的脚本:


  1. $gameSwitches.setValue(4,
  2.   ($gameSwitches.value(1) == false) &&
  3.   ($gameSwitches.value(2) == true) &&
  4.   ($gameSwitches.value(3) == true)
  5. )
复制代码



很明显,全都满足了我们想要的条件,相当于:
  1. $gameSwitches.setValue(4,
  2.   (true) && (true) && (true)
  3. )
复制代码



就相当于这样:
  1. $gameSwitches.setValue(4,true)
复制代码




所以1号开关,也就打开了




那如果我们再运行一次脚本
这时候明显是不满足判断条件的,

所以,就会变成这样:
  1. $gameSwitches.setValue(4,
  2.   (false) && (true) && (true)
  3. )
复制代码



就相当于这样:
  1. $gameSwitches.setValue(4,false)
复制代码



1号开关会还原回去,变成OFF了



以某个开关的状态来判断目前开关状态应该打开还是关闭,这个应该是比较频繁的操作了。

直接这样看好像有点懵逼,换做具体的应用场景,应该就会比较好理解了~

例如,
1号开关:是否第一次进入场景? (否)
2号开关:是否解锁了剧情A?(是)
3号开关:是否解锁了剧情B?(是)

如果满足了这些条件,就打开 4号开关。




操作独立开关
Control Self Switch



跟你说,用脚本来控制开关,真的超级超级超级实用!





因为,在正常使用事件指令的时候,
你是没有办法在A事件里面控制B事件的独立开关的!!


但是!!!
脚本可以啊!!


  1. $gameSelfSwitches.setValue([mapID, eventID, 'A'], true);
复制代码



比如:
控制 1号地图,第3号事件 的独立开关A,设置为OFF
$gameSelfSwitches.setValue([1, 3, 'A'], false);[/code]


注意,这里的第1个参数是个数组。如果不好理解,也可以试试这样:

控制1号地图,第5号事件的独立开关A,设置为ON
  1. const key = [1, 5, 'A'];
  2. $gameSelfSwitches.setValue(key, true);
复制代码




花式玩法:

关闭当前事件所在的地图第1、2、3、4、5号事件的独立开关A、B、C、D


  1. var eventIds = [1, 2, 3, 4, 5];
  2. var letters = ['A','B','C','D']

  3. for (var i = 0; i < eventIds.length; i++) {
  4.   for (var j = 0; j < letters.length; j++) {
  5.     var key = [this._mapId, eventIds[i], letters[j]];
  6.     $gameSelfSwitches.setValue(key, false);
  7.   }
  8. }
复制代码





关闭当前事件身上的所有独立开关
  1. $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





好了,今天先介绍这么多了

有空再更新~
(我也不知道哪天有空)






评分

参与人数 36+36 收起 理由
落阳冰晨 + 1 精品文章
white514 + 1 精品文章
Alceer + 1 认可答案
fanprobox + 1 精品文章
zf756268 + 1 塞糖
实馅包子 + 1 精品文章
背棺走的骷髅 + 1 精品文章
indio + 1 精品文章
古登堡面 + 1 精品文章
夏冷薄荷 + 1 精品文章

查看全部评分

Lv1.梦旅人

梦石
0
星屑
247
在线时间
23 小时
注册时间
2012-8-15
帖子
34
2
发表于 2019-8-17 08:13:38 | 只看该作者
我居然看懂了一点点!
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3446
在线时间
1158 小时
注册时间
2016-8-9
帖子
2389

开拓者

3
发表于 2019-8-17 20:28:46 | 只看该作者
好教程,我值得拥有~
酸酸甜甜就④哇噢
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
240
在线时间
13 小时
注册时间
2019-11-26
帖子
11
4
发表于 2019-11-28 07:00:34 | 只看该作者
楼主nb 谢谢分享
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
20538
在线时间
123 小时
注册时间
2019-5-18
帖子
68
5
发表于 2019-12-23 13:03:03 | 只看该作者
石墨文档在新疆被屏蔽了,好惨啊
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
20538
在线时间
123 小时
注册时间
2019-5-18
帖子
68
6
发表于 2019-12-23 13:11:50 | 只看该作者
RMMV Script Calls.zip (201.17 KB, 下载次数: 346)
翻墙下载的
回复 支持 1 反对 0

使用道具 举报

Lv2.观梦者

梦石
0
星屑
469
在线时间
44 小时
注册时间
2020-5-19
帖子
17
7
发表于 2020-5-20 13:23:54 | 只看该作者
跪谢大大插眼防失踪!!!!!!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
21
在线时间
83 小时
注册时间
2011-8-30
帖子
11
8
发表于 2020-5-21 01:45:32 | 只看该作者
感谢大佬,非常实用
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
571
在线时间
83 小时
注册时间
2011-12-2
帖子
22
9
发表于 2020-5-27 13:53:53 | 只看该作者
我反手就是一个赞
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
117
在线时间
16 小时
注册时间
2020-7-6
帖子
15
10
发表于 2020-7-11 01:45:52 | 只看该作者
支持啊,慢慢学啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-20 00:26

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表