Project1
标题: 【新手向】RMVA - RGSS3脚本入门教程(施工中) [打印本页]
作者: RaidenInfinity 时间: 2016-12-31 22:30
标题: 【新手向】RMVA - RGSS3脚本入门教程(施工中) 本帖最后由 RaidenInfinity 于 2017-5-5 12:44 编辑
本教程献给所有想学习RMVA脚本的游戏制作者,祝你们可以靠所学到的知识成功编制梦想世界。
展开折叠
前言
RGSS3,全名Ruby Game Scripting System 3(Ruby游戏脚本系统3)。它基于Ruby 1.9.2 编程语言,是RPGMaker VX Ace所采用的游戏系统。
至于为什么叫3嘛…RGSS的第一代是XP的,第二代是VX的,那么VA的就是第三代了。(MV用的语言是JavaScript,那就是另一回事了)
既然是第三代,那么它的功能当然比前二代强得多,默认脚本的结构也成熟得多。
想当年我参加XP区R考场的时候,我的天啊写XP脚本的我好佩服你们可以忍受那么紊乱的结构和那超级多余让强迫症无所适从的写法啊!(碎碎念中)
那么说到脚本(Script)。啥?不就是一堆代码吗?为啥叫脚本呢?
百度百科中对“脚本”这个词的解释是:脚本是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,又称作宏或批处理文件。
没错,脚本就像戏剧的剧本(小知识:剧本的英文也叫Script)那样,是给“解释器”(可以理解为演员)看的,按照里面所描述的行为来运行而达成演出效果。
这个解释器包含在RGSS300.dll里面,而它的“舞台”是Game.exe。脚本数据则存在Data文件夹里的Scripts.rvdata2,可由脚本编辑器修改。
由此可见,脚本构成了RMVA游戏的血肉,是非常重要的事物。通过深入地研究脚本,你甚至可以抛弃数据库,直接在脚本里面定义数据。(说实话,这个我干过也很推荐这么做)
就连事件指令,也是由“事件解释系统”进一步转换成脚本调用而实现的。通过事件指令第三页的脚本指令(按了会看到一个白框),很多原本做不到的事情都可以像施展魔法那样弄出来。
当然,事件脚本指令这个部分,我们在接下来有机会会说到。
脚本技术是非常重要的。本教程的目标不止是要让读者能改默认脚本,而且是要能自制系统,也能自行检查和排除插件脚本冲突的问题。
我认为,每个游戏都是一个个案,应该是独一无二的。滥用插件脚本(尤其是成配套的战斗系统)会造成玩家因为审美疲劳而产生排斥感,这是很明显的。
对脚本技术的知识缺乏甚至会扼杀很多天马行空的想法,导致制作者屈服于现有的插件脚本,与自己理想中的效果有巨大的落差。
因此,我希望可以透过这个教程,以图文并茂的方式,为读者们讲解RGSS3的基础和实践运用。
预习
在开始教学之前,我建议先阅读一些资源,预习一下。这可以垫下一下关于编程的基础,让学习变得更有效率。
当然,在阅读本教程时遇到的一些问题或不理解的深奥词汇(希望是没有啦…),可以参考这些资源,或直接去百度/谷歌搜索。
毕竟,读这个教程就是为了不求助于他人,对吧?
首先是taroxd所发布的,由6R一群大触所翻译的,本区一直以来都有置顶但大概是被无视的,F1 帮助文档汉化版 。
链接:https://rpg.blue/forum.php?mod=viewthread&tid=369922
(注:对这个资源有什么疑问请在该帖回复,毕竟解铃还须系铃人)
这么说好了。你买了个洗衣机,你总得看说明书才知道怎么组装怎么用,对吧?那么F1帮助文档,就是RMVA的说明书。
无奈的是,汉化版的RMVA并未附上汉化版的帮助文档,导致很多制作者只能自己摸索,遇到诸多不便。
因此,这个资源可说是必读的。本区的版规(A-10-b项)就有规定,帮助文档内可以查询到的提问将视为违规,这是有明显原因的。
所以不管你是新手还是老手,在继续阅读本教程之前,还请从头到尾过目这个帮助文档。可能有你所遗漏的知识也说不定。
本教程默认你已经看过这个帮助文档了,所以如果你没看过的话,也许会遇上一些问题(所以去看啊啊啊啊!)。
接下来是 @QQ蚊子湯 同学所建议的 Ruby菜鸟教程 (中文)。
链接:http://www.runoob.com/ruby/ruby-tutorial.html
既然是中文版的教程,那就没有理由不看了啊。见多识广啊,你说是吧?
这个网站里面简略地说明了Ruby的默认系统提供了什么样的功能,和基本语法。
当然在本教程也会粗略地再提及一次,所以就算没看…喂!去看啊!不会损你一管血的吧!
如果你看得懂英文,我推荐阅读Tutorials Point 的Ruby教程(英文)。
链接:https://www.tutorialspoint.com/ruby/
(注:我不知道需不需要“魔法”,需要的话就用咯)
比起中文版的,我个人是觉得英文版的比较齐全和详细,使用的例子也比较好。
看得懂英文可以阅读,就算不会…嘛也可以尝试一下啦。百度机翻不知道可不可靠呢。
最后是Ruby 1.9.2的官方帮助文档 RubyDoc (英文)。
链接:https://ruby-doc.org/core-1.9.2/
(注:我不知道需不需要“魔法”,需要的话就用咯)
RMVA有官方帮助文档,Ruby当然也有官方帮助文档。
这个网站里面列出了Ruby所提供的核心方法和它的调用参数,也有很多范例。
我个人呢,如果我忘记了一个核心方法怎么用,我常翻阅的是这个资源。
线上解释器
当今的科技非常发达,程序员们想要测试一些灵机一闪时想到的算法的时候,直接开浏览器找个线上解释器就行了。
在阅读本教程前段(关于Ruby基础)的时候,没有关系到RM本身的一些代码可以直接开个解释器测试运行。这可以省去很多功夫,也比较容易能调试。
这里会介绍几个Ruby语言的线上解释器。要注意的是,这些解释器的Ruby版本可能比较高 (有些方法RMVA自带的没有),不过应该没有太大的问题。
1. 书村网提供的Ruby在线解释器(中文)
链接:http://www.shucunwang.com/RunCode/ruby/
2. Repl.it提供的Ruby在线解释器(英文,可能需要“魔法”)
链接:https://repl.it/languages/ruby
3. Tutorials Point提供的Ruby在线解释器(英文,可能需要“魔法”)
链接:http://www.tutorialspoint.com/execute_ruby_online.php
展开折叠
作者: RaidenInfinity 时间: 2016-12-31 22:53
本帖最后由 RaidenInfinity 于 2018-4-21 18:15 编辑
注意:相关知识已充足的读者们可以直接跳过第一和/或第二章。这楼的内容主要是给没接触过编程(也懒得看/看不懂预习部分提供的教程资源)的读者拓荒用。
1.1 变量赋值
展开折叠
1.2 基本数据类型
展开折叠
1.3 基本运算法
展开折叠
1.4 方法定义与调用
展开折叠
1.5 流程控制
展开折叠
1.6 数组与哈希表
展开折叠
1.7 系统方法
展开折叠
2.1 面向对象
展开折叠
2.2 类与实例
展开折叠
2.3 实例方法与变量
展开折叠
2.4 封装、继承与多态
展开折叠
2.5 猴子补丁
展开折叠
2.6 类方法与模块
展开折叠
2.7 垃圾回收机制
展开折叠
注意:2.8和2.9是较高级的内容,但是只要能成功理解,会对脚本的编写有很大的帮助。
2.8 对象之根与高阶操作
展开折叠
2.9 方法对象与代码块
展开折叠
作者: RaidenInfinity 时间: 2016-12-31 22:54
本帖最后由 RaidenInfinity 于 2018-6-22 23:38 编辑
3.1 游戏工程与启动
展开折叠
3.2 游戏主循环
展开折叠
3.3 声乐呈现
展开折叠
3.4 输入处理与图像缓存
展开折叠
3.5 数据库与档案存取
展开折叠
作者: RaidenInfinity 时间: 2016-12-31 22:55
本帖最后由 RaidenInfinity 于 2017-5-5 12:52 编辑
图像可以说是RM游戏脚本里非常非常重要的一环。
我们收集到的背景,战斗界面,事件行走图等图像素材,要把它“贴”到游戏里实装应用。
那么在这个部分,我们将过目一下RM中图像呈现的概念和尝试在游戏内显示想要的图像。
这也许是整个教程里最长最复杂的部分,毕竟这是非常非常重要的一环,也会影响接下来的章节。
不过,只要仔细阅读并理解其中的概念,这会对相关脚本的理解和创作起到很大的帮助。
4.1 颜色
展开折叠
作者: RaidenInfinity 时间: 2016-12-31 22:56
本帖最后由 RaidenInfinity 于 2017-5-5 13:05 编辑
施工现场 - 4.2 位图,图像精灵,矩形
位图 (Bitmap),又称点阵图,是使用像素 阵列(Pixel array)来表示的图像。
什么是像素?像素就是图像显示的基本单位。一个点,一个颜色。
像素的英文叫Pixel 。这是由图片(Pic ture)和元素(El ement)的英文单词混合而成的。
那么我们可以将RM里面的位图理解成一个存着像素的二维数组 。
如果不记得什么叫二维数组,那就请拉上去再看一次章节1.6。
像素也是位图大小的单位。假设我们有一个宽32像素,高32像素的图片,那么这个图片里面就有1024个像素。(32 * 32 = 1024)
再提醒一次:每一个像素也就是每个点都有一个颜色。
为什么我们要知道这个呢?这是非常重要的基础概念。图片越大,图片内像素的数量就越多,占的内存也就越大。
当然,对这个位图的操作(会在另一个部分里解说),需要的运算时间也就越长。
不过,现在我们暂时不深入讨论这些关于效率的问题。
在RMVA,创建位图(Bitmap)的方式有两种:
1. 从文件 中读取,在解码后载入内存
2. 创建空的 位图,全部像素的颜色值都是 (0, 0, 0, 0)
目前,我们只看前者。后者将在“位图操作”的部分进一步说明。
RMVA的F1帮助文档对Bitmap创建的说明是这样的:
Bitmap.new ( filename)
载入由 filename 参数所指定的图像,生成一个 Bitmap 对象。
RGSS-RTP 和加密档案中的文件会自动搜索。扩展名可以省略。
Bitmap.new ( filename)
载入由 filename 参数所指定的图像,生成一个 Bitmap 对象。
RGSS-RTP 和加密档案中的文件会自动搜索。扩展名可以省略。
简单来说就是用 Bitmap.new(文件名字) 来执行位图载入。
系统会自动寻找RTP文件,而且会读取加密档案。如果找不到怎么办呢?当然是报错啦!找不到文件的错误没看过吗?
还有一种情况下会报错,就是内存不足。(错误讯息是位图创建失败)内存不足怎么办呢?
一就是电脑该换了,二就是你载入了太多图片,内存撑不住了。
比如如果我要载入RTP里史莱姆的战斗图 ,要怎么办呢?首先,游戏的图像素材是存在Graphics文件夹里的。这我们都知道。
图像文件夹里又区分很多个文件夹。战斗图是Battlers。史莱姆是Slime.png。文件格式不需要加,所以Slime就好了。
因此,要载入这个图片,我们要这么写:
@bitmap = Bitmap.new ( "Graphics/Battlers/Slime" )
@bitmap = Bitmap.new ( "Graphics/Battlers/Slime" )
如果游戏未脱离RTP的话,系统会自动读取RTP的文件,所以能正常运行。
位图既然是图片,那么当然有宽度和高度这两个属性。分别用width和height这两个方法来获取。
啥?你想要修改?不行。位图创建了之后,宽和高是不能再修改的。
@bitmap = Bitmap.new ( "Graphics/Battlers/Slime" )
p @bitmap .width #输出:136
p @bitmap .height #输出:47
@bitmap = Bitmap.new ( "Graphics/Battlers/Slime" )
p @bitmap .width #输出:136
p @bitmap .height #输出:47
如果我不想要这个位图了,也没有重复使用的可能性,怎么办?放着让它被垃圾回收机制处理吗?
RGSS3的Bitmap,说白了就是一个包裹 着一段载入内存的位图的对象。
垃圾回收机制(参考章节2.7)的确可以处理它,但是我们不知道这个机制什么时候才会工作。
如果放任不管的话,什么时候内存满出来,出什么问题也说不定。
因此,Bitmap类提供了一个方法:dispose(释放),来手动清除位图所占用的内存,并弃用 这个对象。
在释放之后,我们可以用disposed?(是否已释放)方法来检查这个位图的状况。
@bitmap = Bitmap.new ( "Graphics/Battlers/Slime" )
p @bitmap .disposed ? #输出: false
@bitmap .dispose
p @bitmap .disposed ? #输出: true
@bitmap = Bitmap.new ( "Graphics/Battlers/Slime" )
p @bitmap .disposed ? #输出: false
@bitmap .dispose
p @bitmap .disposed ? #输出: true
如果一个Bitmap对象已经被释放,那么再次呼叫dispose是没有效果的。
现在你可能在纳闷:图片是加载了啊,可是怎么在屏幕上显示呢?
这么形容吧。如果屏幕是个墙壁,位图是个相片,那么我们需要一个相框 来把相片挂上去展示。
RGSS3自带的这个“相框”名叫Sprite 。我个人将它译名为“图像精灵”。(Sprite在英文的意思是精灵)
维基百科对Sprite的解释是:包含于场景中的二维图像或动画。 “包含于场景中”是个重点。
假设现在你有一个Bitmap,存着你要在屏幕上显示的图片。你总得告诉系统,你要把这个图片挂到屏幕上的哪个地方啊,对吧?
Sprite的用途就是给系统指定如何显示 一个Bitmap,提供显示的坐标,比例,角度,色调等参数。
创建Sprite的方式也有两个,不过目前我们只介绍第一种,没有参数的创建方法:Sprite.new 。
在创建一个Sprite之后,我们要修改它的bitmap变量,给它指定 一个图片(Bitmap对象)让它显示。
注意:在下面的大部分关于图像显示的范例里面,我们会调用RGSS3內建的rgss_stop 函数来定住画面,以免受到默认游戏系统的影响。
F1帮助文档对rgss_stop的解释:
rgss_stop
停止脚本的执行,只保留画面的刷新。
等效于下面这一句:
loop { Graphics.update }
rgss_stop
停止脚本的执行,只保留画面的刷新。
等效于下面这一句:
loop { Graphics.update }
让我们直接尝试吧!将史莱姆的战斗图显示到屏幕上!
@bitmap = Bitmap.new ( "Graphics/Battlers/Slime" ) #载入史莱姆的战斗图
@sprite = Sprite.new #创建新的Sprite对象
@sprite .bitmap = @bitmap #指定要显示的Bitmap
rgss_stop #停止所有脚本的运行,画面定格
@bitmap = Bitmap.new ( "Graphics/Battlers/Slime" ) #载入史莱姆的战斗图
@sprite = Sprite.new #创建新的Sprite对象
@sprite .bitmap = @bitmap #指定要显示的Bitmap
rgss_stop #停止所有脚本的运行,画面定格
效果:
哇哦哦!显示出来了!不过,为啥史莱姆在左上角啊?这当然啊。又没指定坐标,默认的位置就是左上角。
RGSS3(和大部分2D游戏)所使用的坐标系统 是从左上角 开始的。啥,你不知道什么是坐标?问问百度吧。
画面的左上角是原点 。在这个位置,X(横)轴和Y(直)轴的值都是0。嗯,得记住了!横的叫X!直的叫Y!
X值越大,图片就越靠右,反过来就是靠左。Y值越大,图片就越靠下,越小则靠上。
Sprite的显示坐标调整的方式是给x 和y 这两个变量赋值。
我们直接来看范例和其效果:
@bitmap = Bitmap.new ( "Graphics/Battlers/Slime" ) #载入史莱姆的战斗图
@sprite = Sprite.new #创建新的Sprite对象
@sprite .bitmap = @bitmap #指定要显示的Bitmap
@sprite .x = 200 #设置X值
@sprite .y = 100 #设置Y值
rgss_stop #停止所有脚本的运行,画面定格
@bitmap = Bitmap.new ( "Graphics/Battlers/Slime" ) #载入史莱姆的战斗图
@sprite = Sprite.new #创建新的Sprite对象
@sprite .bitmap = @bitmap #指定要显示的Bitmap
@sprite .x = 200 #设置X值
@sprite .y = 100 #设置Y值
rgss_stop #停止所有脚本的运行,画面定格
效果:(附上说明)
X和Y都可以 是负值,也可以超出屏幕的宽度和高度。想要知道效果的话,可以自己尝试调整。
作者: RaidenInfinity 时间: 2017-5-5 10:17
本帖最后由 RaidenInfinity 于 2017-5-5 12:47 编辑
未完成,编辑中
作者: RaidenInfinity 时间: 2017-5-5 10:17
本帖最后由 RaidenInfinity 于 2017-5-5 10:18 编辑
这里列出的词汇,不需要全部都背起来。遇到不懂的词语时,可以把这个部分当做字典来科普。当然,更好的方法还是去网上搜索。
基本词汇说明
点击打开
常见关键词
点击打开
常见运算符
点击打开
内建函数,数据库结构
请自行阅读F1帮助文档。
以下为默认脚本里面常见到的词汇,就是类或者模块的名字,和常用到的全局变量。
模块
点击打开
游戏对象
点击打开
图像类
点击打开
窗口类
点击打开
场景类
点击打开
主进程
点击打开
全局变量 (数据库)
点击打开
全局变量 (游戏对象)
点击打开
作者: ganhuadong 时间: 2018-6-18 19:10
神贴啊!膜拜
作者: KB.Driver 时间: 2018-6-20 09:29
看到图像篇竟然没有后续了……
不过前面的一些东西还是比较有用的,虽然现在还没有足够的动手能力去改造。。。
作者: ABC11224399 时间: 2018-7-8 22:37
哇。。。看到一半突然没了。。。。
不过貌似看了也几乎没懂。。。。先消化消化吧
作者: 千昭 时间: 2019-2-9 01:46
所以3.4里提到的位图其实是在4.2里解释的,并没有出现在3.3里
作者: miantouchi 时间: 2019-2-19 19:25
我在看天书
作者: Mirion 时间: 2019-3-3 22:46
2017年的,断更了么
作者: 淞…… 时间: 2019-3-9 10:29
请问大神,写完脚本以后经常性的出现
critical error C0000005 at address 00000000
是怎么肥四鸭
作者: Trlaitioer 时间: 2019-3-23 08:37
mark一下,有时间再看
作者: larloses 时间: 2019-4-16 14:59
看完了…………感觉
还是不懂啊!
感觉菜鸡看完还是不会写脚本
作者: 逗逗比子 时间: 2019-6-21 21:46
咦咦咦???学到一半突然没有了???作者大大是弃坑了吗???
作者: OldWhite_M 时间: 2020-2-29 00:04
顶一下,消化消化。
作者: 刈飒的风 时间: 2020-3-8 19:36
很早就接触va了,后来才知道66,然后开始找脚本做游戏,现在想写脚本,看了这个之后,作为粗人,只能在这里喊 666
作者: 哇哇哇啊叭叭 时间: 2023-1-24 01:28
本帖最后由 哇哇哇啊叭叭 于 2023-1-23 20:29 编辑
为求教程眼望穿,万水千山腿跑断
正想豪掷赠千万,掏穿口袋不见钱
捶胸顿足血吐干,抓挠送走发际线
绞尽脑汁水一贴,慌忙告罪管理员
作者: jienluck 时间: 2023-1-24 15:44
很好很强大 虽然看不懂的说
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1