设为首页收藏本站同能贴吧 切换语言 繁体中文
开启辅助访问 切换到窄版
返回列表
+ 发新帖
查看: 902|回复: 0

[转载发布] 【MZ评测活动】RMMZ脚本教程-基础篇

[复制链接]
累计送礼:
0 个
累计收礼:
1 个
  • TA的每日心情
    开心
    前天 23:25
  • 签到天数: 223 天

    连续签到: 2 天

    [LV.7]常住居民III

    9102

    主题

    897

    回帖

    7万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    7
    卡币
    64954
    OK点
    16
    推广点
    0
    同能卷
    50
    积分
    74983

    灌水之王

    发表于 2024-2-20 10:13:50 | 显示全部楼层 |阅读模式
    写在前面
    时光荏苒,距离上次写 RMMV 教程居然已经过去了三年多...三年间我由一名大一新生变成了大四老油条,期间由于我在 RMMV 中对 JavaScript 脚本的学习而免试加入了校科协的前端组(虽然半年后就跑路到了算法组),此后也或多或少做了些前端项目,还拿 Node.js 完善了项目的后端...总之 RPG Maker 系列软件与 6R(Project1)论坛让我发现了对编程的兴趣,影响了我高中时选择参加信息学竞赛、大学报考计算机专业直至现在。  
    而三年后的现在,恰逢此次评测活动,感谢 @梦结界工作室 和 @project1论坛支持的 RMMZ 软件,我决定再次回归到 RPG Maker 系列软件脚本教程的撰写,为 RPG Maker 系列软件的蓬勃发展做一点微小的贡献。  
    我在这次的教程选题时做了诸多思考,在翻看自己珍藏多年、初中时手抄的脚本教程(彼时不能随时使用电脑,被迫如此)时,发现了 RMVA 官方脚本教程的身影。教程分为「基础篇」、「解读篇」与「实践篇」三部分,由浅入深介绍了从 Ruby 语法到 RGSS3 系统组成再到对其的修改(即编写脚本)。令人惋惜的是在 RMMV 之后的文档这部分内容便销声匿迹了,因此我希望能够借此机会为 RMMZ 补充这样一份教程,即“RMMZ 味”的 RMVA 脚本教程,以期能够抛砖引玉为 RMMZ 吸引更多插件开发者与教程创作者。  
    注意事项
    1. 本教程复刻于 RMVA 帮助文档中脚本入门的章节,可以说是该教程直接翻译成 MZ 的版本。教程分为「基础篇」、「解读篇」与「实践篇」三部分,这篇文章为「基础篇」,另外两部分将稍后发布。  
    2. 教程中会用到的资料/参考链接/推荐阅读:






    3. 因为本人能力有限和粗枝大叶,并且教程最初由 markdown 编写由自编 markdown2bbcode 程序转换而来,故教程中或许一定会有错误,请大家批评指正~  
    4. 本教程同步发布于 Project1论坛 和我的博客青い記憶(本篇需要稍后发布)。  
    5. 感谢 @梦结界工作室 和 @project1论坛支持的 RMMZ 软件,感谢 ChatGPT、Copilot 和 New Bing 为本教程的撰写提供的帮助。  

    正文
    新的开始
    在基础篇,我们将一边完成较短的程序一边介绍 JavaScript 以及 RMMZ 核心脚本的基础知识。  
    首先要做好学习的准备,请提前准备好 RMMZ 软件本体、一款趁手的代码编辑器(本教程使用的是 VSCode,至少别是记事本)、好学的大脑以及勤奋的双手~  
    建立项目与脚本
    既然是新的开始,那么我们从头建立一个学习脚本入门用的新项目。建立项目后,在主菜单【游戏】中选择【打开文件夹】,在弹出的资源管理器窗口内进入【js\plugins】目录,这里便是 RMMZ 存放插件的地方啦~可以看到已经有四个官方为我们写好的插件:AltMenuScreen.js、AltSaveScreen.js、ButtonPicture.js、TextPicture.js,在后续的实践篇中或许有机会向大家讲解这四个插件是如何编写的。  
    今天,我们先建立一个新文件。脚本文件的名称是什么无所谓,这里为了便于理解,我们暂且命名为 TEST.js(注意扩展名一定要是 js 结尾),然后使用代码编辑器打开这个文件(也可以在代码编辑器里面新建一个 js 文件然后保存到插件目录中)。  
    打开插件
    此时,再次回到 RMMZ 在主菜单【工具】中选择【插件管理器】(也可以直接按 F10),在空白处双击,点击名称,就能在弹出的菜单中看到我们新建的名为 TEST 的插件了,请选择这个插件并保持开启(这时候插件管理器的下方会提示无法加载插件“TEST”,这是正常现象),然后就可以正式开始我们的脚本学习啦!  
    注释
    在 JavaScript 中,// 后的一整行文字或被 /* 和 */ 夹在中间的若干行文字会被认定为注释。  
    作为注释的代码或文字不会被执行,不会影响到程序的运行,只作为编写者标记的备忘录来使用。  这两种方式和事件指令的“注释”功能相同,是记录程序处理内容的简单说明,使用注释会很容易知道这段脚本是做什么的。即使是自己编写的程序,但时间一长,该段内容是指定做什么处理也会忘记。在脚本的学习和实际操作时,推荐注意多使用注释功能。  
    还有,作为程序的说明,在后面的学习中脚本会写有很多的注释。但实际操作中没有必要完全仿效其注释的内容。// 以后的文字,可以按实际中最容易理解的说明注释。  
    除此之外,当在学习脚本的时候遇到想要使程序的某个部分暂时不运行时,也可以使用 /* 和 */ 将代码包裹起来(或在逐行在代码前加上 //),这是调试脚本和排查 Bug 时的常用技巧。  
    语法和库
    等等...在真正开始学习前,先插播一条关于程序语言的小知识:程序语言在结构上大致分为语法和库两种。  
    所谓语法,就是用语言表达某种意思时所要遵循的规则。与中文、英文等自然语言一样,程序语言也有语法,例如条件分支的语法、循环的语法等。上面所讲的「// 后面的一整行文字都是注释,不会被执行」则是语法之一。语言的说法,狭义上指的就是语法。  
    所谓库,就是像图片的显示、这样带有应用功能的语言集。与中英文等自然语言中的单词和成语的意思类似。学习了英语的语法在使用英文时,增加词汇量(掌握库的使用方法)则是非常重要的。  
    本教程的基础篇是以学习 JavaScript 语法为重点。最开始学习时或许会产生「学习语法,到底有什么用」的厌烦感,应用逻辑思维来理解基本语法就能突破最初的屏障,仔细阅读参考程序记住实际的使用方法,其实并不是多么困难的事情。  
    那么让我们开始吧!  

    数值计算
    这是关于 JavaScript 中数字和计算的基础知识。作为例子使用计算器那样简单的计算来解说。  
    显示开发者工具
    在测试游戏时,你可以按【F8】或【F12】来打开开发者工具,这将是我们调试脚本的有力工具。  
    开发者工具的作用十分强大,包括元素查看器(Elements)、调试控制台(Console,可以查看输出、执行脚本等)、源代码查看器(Sources)、网络资源调试器(Network)、性能表现(Performance)等众多方便实用的功能。在我们的教程中,经常用到的时调试控制台(Console),用于查看运行过程中的数据、文本打印结果。  
    数值
    在其他编程语言中,你或许会了解到许多不同的术语来描述不同类型的数字,例如整数(例如 10、400、-5)、浮点数(有小数点或小数位,如 12.5、114.514)、双精度(一种特殊类型的浮点数,他们比标准浮点数精度更高,可以精确到更大的小数位数)。在开始担心弄混上面这些概念之前,请直接忘掉他们吧!JavaScript 中只有一个数据类型 Number 来表示数字(内部均为双精度浮点类型),任何类型的数字都可以用完全相同的方式处理它们。  
    此外,JavaScript 的数字支持四种进制:十进制、二进制(如 0b101)、八进制(如 0377)、十六进制(如 0xff)。但在教程中我们一般使用的是十进制(也许颜色色号会用到十六进制)。  
    显示
    空说这么多挺没意思的,让我们实际将数字显示出来吧:在控制台中打印数值时,可以使用 console.log 命令。  
    请在脚本中添加以下代码:  然后测试游戏,按【F8】打开开发者工具,并切换到【Console】选项卡,就可以看到控制台中打印出的文字了!  
    也许你注意到了,这个语句的结尾是有一个分号 ; 的,这是 JavaScript 中的语法,用于表示语句的结束。JavaScript 中的语句可以不用分号结尾,因为 JavaScript 会自动在每行的结尾加上分号,但为了保证代码的可读性,我们建议在每个语句的结尾都加上分号。  
    在后面的教程中,我们也会用 console.log 打印各种调试信息,用于排除程序 Bug,是十分有用的一个指令。  
    计算方法
    在 JavaScript 上进行计算吧:  像上面这样写上普通算式就会输出计算结果。其中 + 和 - 等符号被称为运算符。  
    优先级
    和普通算式一样,在 JavaScript 中,运算符的优先级是有规律的,优先级高的运算符会先被计算,例如先乘除后加减。想要改变这个顺序,可以使用括号来改变运算顺序。  括号还可以多层重叠起来使用(不需要跟数学中一样需要变成中括号、大括号)。  
    其他运算符
    除了上面提到的加减乘除运算符,JavaScript 还有其他运算符,例如求余运算符(%,也叫取模运算):  以及指数运算符(**):  此外,有时我们也会用到位运算符,例如按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移()、无符号右移(>>>),在此先不做赘述。

    变量与常量
    所谓变量,就是可以改变的量,它是一种可以存储数据的容器,可以在程序运行时改变其值,是相对于常量的数据类型。在 MZ 中,变量只能用来存储数字,对变量的操作也只是加减乘除取模这些操作,而在 JavaScript 中,变量可以存储任意类型的数据,例如字符串、对象、数组等(后面都会进行介绍),在本节中,我们先用数字来讲解变量的基本使用方法。  
    变量的命名
    不同于 MZ 编辑器中变量只能以四位数字为代号,JavaScript 中的变量可以起符合以下规则的任意名字,并且从此以后和 MZ 中编辑器中的四位数字一样把这个名字作为“代号”使用:  
    首先,变量名必须以字母、下划线(_)或美元符号($)开头,不能以数字开头。  
    其次,变量名中可以包含字母、数字、下划线(_)或美元符号($),但不能包含空格或其他符号。  
    最后,不能使用 JavaScript 中的关键字作为变量名,以下是 JavaScript 中的关键字:  此外,变量名是区分大小写的,例如 a 和 A 是两个不同的变量名。  
    正确的变量名示例:  错误的变量名示例:  声明变量
    在 JavaScript 中,使用 var 命令来声明变量,例如:  这样就声明了一个名为 a 的变量,但此时变量 a 的值是 undefined,因为我们还没有为它赋值。  
    除了使用 var 命令声明变量,还可以使用 let 或通过直接赋值声明变量,let 的用法和 var 命令类似,但是它有一些不同的地方,我们会在后面的教程中详细介绍。  赋值和引用
    下面是一个赋值和引用变量的例子:  在这个例子中,我们在第一行声明了变量 a 和 b,然后给它们赋值1 和 2。其中,= 号被称为赋值运算符。和数学上表示“左边等于右边”的意思不同,这里表示“将右边的值赋给左边的变量”。  
    第二行是引用变量 a 和 b 的值。所谓引用,就是使用变量的值。变量的运算和数字的运算是一样的,这里可以解释为 1 + 2,最后输出结果为 3。  
    另外,引用未定义的变量会使程序报错,例如:  常量
    在 JavaScript 中,使用 const 命令来声明常量,例如:  这样就声明了一个名为 a 的常量,它的值是 1,并且不能被修改。  
    简写运算符
    在 JavaScript 中,除了 = 这个赋值运算符,还有其他的赋值运算符,例如 +=、-=、*=、/=、%=等。  上面的代码中,第二行的 x += 7 等同于 x = x + 7,同样 -=、*=、/=、%=、**=、=、>>>=、&=、^=、|= 也是如此。这些运算符是 JavaScript 中的简写运算符,它们的作用是将运算符右侧的值与左侧的值进行运算,然后再赋值给左侧的变量。  
    这个示例中,第一行是定义变量 x 并赋值为 1,第二行加上 7,第三行减去 3,第四行乘以 5,最后输出计算结果为 25。  
    自运算符
    在 JavaScript 中,还有一种特殊的运算符,叫做自运算符,它可以对变量进行自增(++)或自减(--)操作。  上面的代码中,第二行的 x++ 等同于 x += 1,即将变量 x 的值加 1,然后再赋值给变量 x。  
    自运算符有两种形式,一种是前置形式,即 ++x,另一种是后置形式,即 x++。我们暂时不用区分这两种形式,只需要记住,自运算符会改变变量的值。  
    变量的作用域
    作用域是指变量的作用范围,变量的作用域决定了变量是否可以被引用。如果一个变量在它的作用域外被引用,JavaScript 就会报 ReferenceError 错误。  
    JavaScript 中有以下三种作用域:
      全局作用域:所有代码的默认作用域,具有全局作用域的变量在程序的任何地方都可以被引用。

      函数作用域:函数(后面会讲到)内部的作用域,具有函数作用域的变量只能在函数内部被引用。

      块级作用域:用一对花括号 {} 包裹的代码块(后面会讲到),例如 if 语句、for 循环等。

    在 JavaScript 中,在函数外声明的变量具有全局作用域,而在函数内部声明的变量具有函数作用域,特别地,只有 let 和 const 命令在代码块内声明的变量才具有块级作用域。  
    虽然具有全局作用域的变量可以在任何地方被引用,但是这样做会使程序变得难以维护,因此,我们应该尽量避免在全局作用域中声明变量。  
    undefined 和 null
    在 JavaScript 中,undefined 和 null 都表示“没有值”,它们都是原始类型的值。  
    undefined 表示“未定义”,即此处的值尚未定义,如果一个变量没有被赋值,或者由 var 声明的具有全局作用域的变量尚未被定义,那么它的值就是 undefined。  
    null 以及两者的异同将在后面的教程中介绍。  
    字符串
    一般来说,由文字连接起来的数据就称为字符串。
    字符串的定义
    在 JavaScript 中,字符串是用一对双引号 " 或单引号 ' 包裹的一串字符。  
    和数字一样,字符串也能代入变量为其赋值和通过 console.log() 输出。  字符串也能进行加法运算,可以得到一个连接起来的字符串,例如:  转义字符
    字符串中 \ 符号及其后面的字符称为转义字符,是作为一段连续文字中换行等操作使用的特殊文字,例如 undefined 表示换行。  
    转义字符有 \t(Tab)和 \s(空格)等,另外 undefined 表示换行,重叠起来的 \\ 表示 \ 字符本身。  模板字符串
    在 JavaScript 中,还有一种特殊的字符串,叫做模板字符串,它的作用是可以在字符串中嵌入变量。  
    模板字符串用反引号(`)包裹,其中的变量用 ${} 包裹。它可以让变量的值在字符串中显示出来。  上面的代码中,第一行将变量 name 的值赋为 字符串 "World"。第二行里面,${name} 表示将变量 name 的值嵌入到字符串中,和前后的 Hello  和 ! 合在一起,从而得到了一个新的字符串。RMMV 的事件指令「显示文字」里,在文本中使用 \V[n] 和 undefined[n] 可以将变量的值和角色的名字作为信息嵌入到文本中,这个功能与此非常相似。  

    分支条件语句
    满足一定条件时,执行一段代码,不满足时,执行另一段代码,这就是分支条件。  
    语句块
    在讲分支条件之前,我们先来讲一下表达式、语句和语句块的概念。  
    在 JavaScript 中,表达式是指可以计算出一个值的代码,例如 1 + 1、"Hello World" 等。  
    语句是指可以被执行的代码,例如 var x = 1;、console.log(x); 等。  
    语句块是指用一对花括号 {} 包裹的一段代码,例如:  还记得我们在前面讲过的变量的作用域吗?在 JavaScript 中,只有 let 和 const 命令在代码块内声明的变量才具有块级作用域。这里的代码块就是一个语句块。  
    比较运算符
    在具体学习处理分支条件之前,要先记住条件判断中所使用的运算符。  
    下面 这些运算符称为比较运算符。使用这些运算符,和给予的条件(数字和字符串)比较,然后返回结果。  

    [table][tr][td]运算符[/td][td]作用  [/td][/tr][tr][td]==[/td][td]等于  [/td][/tr][tr][td]!=[/td][td]不等于 [/td][/tr][tr][td]>[/td][td]大于  [/td][/tr][tr][td]=[/td][td]大于等于[/td][/tr][tr][td] 514); // falseconsole.log(!true); // false复制代码[/code]
    上面的例子中,第一行表示“3 + 1 等于 1 + 3 同时 114 小于 514”,因为这两个运算都成立,所以输出结果就为 true(真、正确);第二行表示的是“3 + 1 等于 2 + 3 或者 114 大于 514”,因为比较运算符 || 是只要有一个运算成立就为 true,而很显然两个运算都不成立,所以输出结果就为 false;第三行的 ! 运算符和另外两个运算符稍微有点不同,它表示的内容为后面的条件不成立或取反,可以理解为颠倒 true 和 false 的运算符,因此第三行的意思就是“非真”,输出结果就为 false。  
    此外,不只 + 和 - 等用于计算的运算符具有优先级,比较运算符和逻辑运算符也具有优先级。目前只要知道 == 之类的比较运算符的优先级高于 && 和 || 之类的逻辑运算符就可以了。  
    if ... else 语句
    if 语句是 JavaScript 中分支条件的语法,这个和英文中的 if(如果 ... 就)的意思一样,表示“如果 if 后面的条件成立的话,就运行下面的代码”的意思。  在不满足条件也要进行处理的情况下,可以使用 else 语句。  在满足多个条件的情况下,可以使用 else if 语句。  switch 语句
    在条件为根据特定变量的值进入不同分支的情况下使用 switch 语句会更方便。  把第一行的 var x = 1; 改成 var x = 2;,再运行一次,然后再来看看输出结果是什么。当 x 代入 1 时会输出“x 等于 1”,当 x 代入 2 时会输出“x 等于 2”。  
    需要注意的是,switch 语句中的 case 语句后面的 : 是必须的,而 break 语句也是必须的,break 前可以写任意多句语句。  
    条件运算符
    使用 ? 和 : 运算符也是运算符形式的分支条件语句。  这个例子的意思是,变量 x 的值大于 0 的话,就输出“大于”,否则就输出“小于等于”。条件运算符的语法是“条件?真时的值:假时的值”。上述的条件是 x > 0,真时的值是“大于”,假时的值是“小于等于”,会根据条件是否满足来决定使用 ? 或 : 后面的值。  
    当然使用 if 语句也可以完成同样的功能:使用 if 语句的语法就会像上面那样,但是使用条件运算符的语句就会更简洁。  

    循环语句
    重复进行特定的处理就要使用循环语句。  
    while 语句
    在满足特定条件期间进行循环的情况下使用 while 语句。  
    [code]var x = 0;                          // 定义变量 x 并赋值为 0var i = 1;                          // 定义变量 i 并赋值为 1while (i

    帖子地址: 

    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    简体中文
    繁體中文
    English(英语)
    日本語(日语)
    Deutsch(德语)
    Русский язык(俄语)
    بالعربية(阿拉伯语)
    Türkçe(土耳其语)
    Português(葡萄牙语)
    ภาษาไทย(泰国语)
    한어(朝鲜语/韩语)
    Français(法语)
    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2026-10-24 21:02 , Processed in 0.110360 second(s), 54 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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