查看: 80|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    2024-5-10 09:55
  • 签到天数: 37 天

    连续签到: 3 天

    [LV.5]常住居民I

    2028

    主题

    32

    回帖

    7260

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    0
    卡币
    5184
    OK点
    16
    积分
    7260
    发表于 同元九百九十六年八月十七日(秋) | 显示全部楼层 |阅读模式
    写在前面
    时光荏苒,距离上次写 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 中,// 后的一整行文字或被 /* 和 */ 夹在中间的若干行文字会被认定为注释。  
    作为注释的代码或文字不会被执行,不会影响到程序的运行,只作为编写者标记的备忘录来使用。  
    1. /* 我是一句块注释我也是一句块注释我还是一句块注释*/// 我是一句行注释,我并不会被执行复制代码
    复制代码
    这两种方式和事件指令的“注释”功能相同,是记录程序处理内容的简单说明,使用注释会很容易知道这段脚本是做什么的。即使是自己编写的程序,但时间一长,该段内容是指定做什么处理也会忘记。在脚本的学习和实际操作时,推荐注意多使用注释功能。  
    还有,作为程序的说明,在后面的学习中脚本会写有很多的注释。但实际操作中没有必要完全仿效其注释的内容。// 以后的文字,可以按实际中最容易理解的说明注释。  
    除此之外,当在学习脚本的时候遇到想要使程序的某个部分暂时不运行时,也可以使用 /* 和 */ 将代码包裹起来(或在逐行在代码前加上 //),这是调试脚本和排查 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 命令。  
    请在脚本中添加以下代码:  
    1. console.log(233);复制代码
    复制代码
    然后测试游戏,按【F8】打开开发者工具,并切换到【Console】选项卡,就可以看到控制台中打印出的文字了!  
    也许你注意到了,这个语句的结尾是有一个分号 ; 的,这是 JavaScript 中的语法,用于表示语句的结束。JavaScript 中的语句可以不用分号结尾,因为 JavaScript 会自动在每行的结尾加上分号,但为了保证代码的可读性,我们建议在每个语句的结尾都加上分号。  
    在后面的教程中,我们也会用 console.log 打印各种调试信息,用于排除程序 Bug,是十分有用的一个指令。  
    计算方法
    在 JavaScript 上进行计算吧:  
    1. console.log(1 + 1);         // 加法console.log(114 - 514);     // 加法console.log(7 * 5);         // 乘法console.log(24 / 4);        // 除法复制代码
    复制代码
    像上面这样写上普通算式就会输出计算结果。其中 + 和 - 等符号被称为运算符。  
    优先级
    和普通算式一样,在 JavaScript 中,运算符的优先级是有规律的,优先级高的运算符会先被计算,例如先乘除后加减。想要改变这个顺序,可以使用括号来改变运算顺序。  
    1. console.log(1 + 2 * 3);     // 7console.log((1 + 2) * 3);   // 9复制代码
    复制代码
    括号还可以多层重叠起来使用(不需要跟数学中一样需要变成中括号、大括号)。  
    其他运算符
    除了上面提到的加减乘除运算符,JavaScript 还有其他运算符,例如求余运算符(%,也叫取模运算):  
    1. console.log(4 % 3);         // 1console.log(5 % 3);         // 2console.log(6 % 3);         // 0复制代码
    复制代码
    以及指数运算符(**):  
    1. console.log(2 ** 3);        // 8console.log(3 ** 2);        // 9复制代码
    复制代码
    此外,有时我们也会用到位运算符,例如按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移()、无符号右移(>>>),在此先不做赘述。

    变量与常量
    所谓变量,就是可以改变的量,它是一种可以存储数据的容器,可以在程序运行时改变其值,是相对于常量的数据类型。在 MZ 中,变量只能用来存储数字,对变量的操作也只是加减乘除取模这些操作,而在 JavaScript 中,变量可以存储任意类型的数据,例如字符串、对象、数组等(后面都会进行介绍),在本节中,我们先用数字来讲解变量的基本使用方法。  
    变量的命名
    不同于 MZ 编辑器中变量只能以四位数字为代号,JavaScript 中的变量可以起符合以下规则的任意名字,并且从此以后和 MZ 中编辑器中的四位数字一样把这个名字作为“代号”使用:  
    首先,变量名必须以字母、下划线(_)或美元符号($)开头,不能以数字开头。  
    其次,变量名中可以包含字母、数字、下划线(_)或美元符号($),但不能包含空格或其他符号。  
    最后,不能使用 JavaScript 中的关键字作为变量名,以下是 JavaScript 中的关键字:  
    1. abastract   arguments   boolean     break           bytecase        catch       char        class           constcontinue    debugger    default     delete          dodouble      else        enum        export          extendsfalse       final       finally     float           forfunction    goto        if          implements      importin          instanceof  int         interface       letlong        native      new         null            packageprivate     protected   public      return          shortstatic      super       switch      synchronized    thisthrow       throws      transient   true            trytypeof      var         void        volatile        whilewith        yield复制代码
    复制代码
    此外,变量名是区分大小写的,例如 a 和 A 是两个不同的变量名。  
    正确的变量名示例:  
    1. aa1a_ba$ba1b2c3复制代码
    复制代码
    错误的变量名示例:  
    1. 1a      // 不能以数字开头a b     // 不能包含空格a-b     // 不能包含符号let     // 不能使用关键字复制代码
    复制代码
    声明变量
    在 JavaScript 中,使用 var 命令来声明变量,例如:  
    1. var a;复制代码
    复制代码
    这样就声明了一个名为 a 的变量,但此时变量 a 的值是 undefined,因为我们还没有为它赋值。  
    除了使用 var 命令声明变量,还可以使用 let 或通过直接赋值声明变量,let 的用法和 var 命令类似,但是它有一些不同的地方,我们会在后面的教程中详细介绍。  
    1. var a;      // 使用 var 命令声明变量let b;      // 使用 let 命令声明变量c = 1;      // 直接赋值声明变量复制代码
    复制代码
    赋值和引用
    下面是一个赋值和引用变量的例子:  
    1. var a = 1, b = 2;console.log(a + b);复制代码
    复制代码
    在这个例子中,我们在第一行声明了变量 a 和 b,然后给它们赋值1 和 2。其中,= 号被称为赋值运算符。和数学上表示“左边等于右边”的意思不同,这里表示“将右边的值赋给左边的变量”。  
    第二行是引用变量 a 和 b 的值。所谓引用,就是使用变量的值。变量的运算和数字的运算是一样的,这里可以解释为 1 + 2,最后输出结果为 3。  
    另外,引用未定义的变量会使程序报错,例如:  
    1. console.log(xxx); // ReferenceError: xxx is not defined复制代码
    复制代码
    常量
    在 JavaScript 中,使用 const 命令来声明常量,例如:  
    1. const a = 1;复制代码
    复制代码
    这样就声明了一个名为 a 的常量,它的值是 1,并且不能被修改。  
    简写运算符
    在 JavaScript 中,除了 = 这个赋值运算符,还有其他的赋值运算符,例如 +=、-=、*=、/=、%=等。  
    1. var x = 1;x += 7;x -= 3;x *= 5;console.log(x); // 25复制代码
    复制代码
    上面的代码中,第二行的 x += 7 等同于 x = x + 7,同样 -=、*=、/=、%=、**=、=、>>>=、&=、^=、|= 也是如此。这些运算符是 JavaScript 中的简写运算符,它们的作用是将运算符右侧的值与左侧的值进行运算,然后再赋值给左侧的变量。  
    这个示例中,第一行是定义变量 x 并赋值为 1,第二行加上 7,第三行减去 3,第四行乘以 5,最后输出计算结果为 25。  
    自运算符
    在 JavaScript 中,还有一种特殊的运算符,叫做自运算符,它可以对变量进行自增(++)或自减(--)操作。  
    1. var x = 1;x++;console.log(x); // 2复制代码
    复制代码
    上面的代码中,第二行的 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 以及两者的异同将在后面的教程中介绍。  
    1. console.log(a); // undefinedvar a;console.log(a); // undefineda = 1;console.log(a); // 1复制代码
    复制代码

    字符串
    一般来说,由文字连接起来的数据就称为字符串
    字符串的定义
    在 JavaScript 中,字符串是用一对双引号 " 或单引号 ' 包裹的一串字符。  
    和数字一样,字符串也能代入变量为其赋值和通过 console.log() 输出。  
    1. var str1 = "Hello World!";var str2 = 'Hello World!';console.log(str1); // Hello World!console.log(str2); // Hello World!复制代码
    复制代码
    字符串也能进行加法运算,可以得到一个连接起来的字符串,例如:  
    1. var str1 = "Hello";var str2 = "World";console.log(str1 + " " + str2); // Hello World复制代码
    复制代码
    转义字符
    字符串中 \ 符号及其后面的字符称为转义字符,是作为一段连续文字中换行等操作使用的特殊文字,例如 undefined 表示换行。  
    转义字符有 \t(Tab)和 \s(空格)等,另外 undefined 表示换行,重叠起来的 \\ 表示 \ 字符本身。  
    1. var a = "Hello";var b = "\\World";console.log(a + '\n' + b);  // Hello                            // \World复制代码
    复制代码
    模板字符串
    在 JavaScript 中,还有一种特殊的字符串,叫做模板字符串,它的作用是可以在字符串中嵌入变量。  
    模板字符串用反引号(`)包裹,其中的变量用 ${} 包裹。它可以让变量的值在字符串中显示出来。  
    1. var name = "World";var str = `Hello ${name}!`;console.log(str); // Hello World!复制代码
    复制代码
    上面的代码中,第一行将变量 name 的值赋为 字符串 "World"。第二行里面,${name} 表示将变量 name 的值嵌入到字符串中,和前后的 Hello  和 ! 合在一起,从而得到了一个新的字符串。RMMV 的事件指令「显示文字」里,在文本中使用 \V[n] 和 undefined[n] 可以将变量的值和角色的名字作为信息嵌入到文本中,这个功能与此非常相似。  

    分支条件语句
    满足一定条件时,执行一段代码,不满足时,执行另一段代码,这就是分支条件。  
    语句块
    在讲分支条件之前,我们先来讲一下表达式语句语句块的概念。  
    在 JavaScript 中,表达式是指可以计算出一个值的代码,例如 1 + 1、"Hello World" 等。  
    语句是指可以被执行的代码,例如 var x = 1;、console.log(x); 等。  
    语句块是指用一对花括号 {} 包裹的一段代码,例如:  
    1. {    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 后面的条件成立的话,就运行下面的代码”的意思。  
    1. var x = 1;                          // 定义变量 x 并赋值为 1if (x >= 0) {                       // 如果 x 大于等于 0 的话    console.log('x 大于等于 0');    // 显示 x 大于等于 0}                                   // 结束 if 语句复制代码
    复制代码
    在不满足条件也要进行处理的情况下,可以使用 else 语句。  
    1. var x = 1;                          // 定义变量 x 并赋值为 1if (x >= 0) {                       // 如果 x 大于等于 0 的话    console.log('x 大于等于 0');    // 显示 x 大于等于 0} else {                            // 否则    console.log('x 小于 0');        // 显示 x 小于 0}                                   // 结束 if 语句复制代码
    复制代码
    在满足多个条件的情况下,可以使用 else if 语句。  
    1. var x = 1;                          // 定义变量 x 并赋值为 1if (x > 0) {                        // 如果 x 大于 0 的话    console.log('x 大于 0');        // 显示 x 大于 0} else if (x < 0) {                 // 除此之外,如果 x 小于 0 的话    console.log('x 小于 0');        // 显示 x 小于 0} else {                            // 其他,    console.log('x 等于 0');        // 显示 x 等于 0}                                   // 结束 if 语句复制代码
    复制代码
    switch 语句
    在条件为根据特定变量的值进入不同分支的情况下使用 switch 语句会更方便。  
    1. var x = 1;                          // 定义变量 x 并赋值为 1switch (x) {    case 0:                         // 如果 x 等于 0 的话        console.log('x 等于 0');    // 显示 x 等于 0        break;                      // 结束 switch 语句    case 1:                         // 如果 x 等于 1 的话        console.log('x 等于 1');    // 显示 x 等于 1        break;                      // 结束 switch 语句    case 2:                         // 如果 x 等于 2 的话        console.log('x 等于 2');    // 显示 x 等于 2        break;                      // 结束 switch 语句    default:                        // 其他情况        console.log('x 不等于 0、1 或 2');  // 显示 x 不等于 0、1 或 2        break;                      // 结束 switch 语句}复制代码
    复制代码
    把第一行的 var x = 1; 改成 var x = 2;,再运行一次,然后再来看看输出结果是什么。当 x 代入 1 时会输出“x 等于 1”,当 x 代入 2 时会输出“x 等于 2”。  
    需要注意的是,switch 语句中的 case 语句后面的 : 是必须的,而 break 语句也是必须的,break 前可以写任意多句语句。  
    条件运算符
    使用 ? 和 : 运算符也是运算符形式的分支条件语句。  
    1. var x = 1;console.log(x > 0 ? '大于' : '小于等于'); // 大于复制代码
    复制代码
    这个例子的意思是,变量 x 的值大于 0 的话,就输出“大于”,否则就输出“小于等于”。条件运算符的语法是“条件?真时的值:假时的值”。上述的条件是 x > 0,真时的值是“大于”,假时的值是“小于等于”,会根据条件是否满足来决定使用 ? 或 : 后面的值。  
    当然使用 if 语句也可以完成同样的功能:
    1. var x = 1;if (x > 0) {    console.log('大于');} else {    console.log('小于等于');}复制代码
    复制代码
    使用 if 语句的语法就会像上面那样,但是使用条件运算符的语句就会更简洁。  

    循环语句
    重复进行特定的处理就要使用循环语句。  
    while 语句
    在满足特定条件期间进行循环的情况下使用 while 语句。  
    [code]var x = 0;                          // 定义变量 x 并赋值为 0var i = 1;                          // 定义变量 i 并赋值为 1while (i
    天天去同能,天天有童年!
    回复 论坛版权

    使用道具 举报

    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-5-20 16:43 , Processed in 0.051596 second(s), 41 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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