Project1
标题: RGSS3 脚本入门(全文翻译) [打印本页]
作者: 喵呜喵5 时间: 2013-12-21 21:14
标题: RGSS3 脚本入门(全文翻译)
本帖最后由 喵呜喵5 于 2014-2-4 14:00 编辑
在K岛看到完整版的翻译了,所以我自己接下去的翻译就弃坑了啦啦啦
https://googledrive.com/host/0B2GGQwUSXTWfVVNMd05iVlB5Nkk/
(可能需要翻墙)
======================================
↓个人已翻译部分留档
==========================================
以下的内容翻译自RPG制作大师VX Ace的官方帮助文档中的スクリプト入門-実践編,共包含以下内容:
タイマーの改造
あらすじ画面の作成
脱出アイテムの作成
アイテム消費スキルの作成
景品交換所の作成
テレポートアイテムの作成
タイトル画面の改造
如同标题所说,这是一个RGSS脚本教程,而不是Ruby编程语言教程,并且已经是实践篇了,所以我不负责普及Ruby语言的知识。如果你是一个完全没有编程基础的人,建议你先去学习一下Ruby语言或者C语言或者至少去看看RMVX的中文帮助文档中的基础篇和解读篇(传送门:http://pan.baidu.com/s/1OIwk)。
(另外再说一句,别觉得自己初中高中义务教育课上学的那些东西叫编程基础……幼儿园你就会加减乘除了你想想你自己现在数学学成个什么样= =,义务教育课上学习的那些内容最多只是一点皮毛罢了。)
整个翻译工程的进度和完成度需要看我的心情,请不要催稿……
你可以转载这篇文章,但请不要抹去这篇文章的地址(http://rpg.blue/forum.php?mod=viewthread&tid=343091)。
(↑ 当然,也不要抹去上面这句话。)
如果任何翻译的错误或者编程上的错误可以直接在留言中告诉我。如果对我的翻译有哪句无法理解或者看不懂也可以直接告诉我。
那么以下便是正文。
实践篇目的是说明如何用脚本实际对游戏进行改造。
首先从事件指令中『计时器操作』的计时器显示方式开始。
最开始先关掉脚本编辑器,在地图上新建一个计时器事件用来测试。
如图中这样,设置成自动执行,这样一打开游戏就可以对改造后的效果进行确认。
之前基础篇部分让你测试的那些脚本已经不会使用了,请删掉他们,在脚本编辑器「▼ 素材」的下方插入一个新的脚本,起一个合适的名字。
虽然也可以在原脚本部分直接编辑,不过把所有对原脚本的改变全部都合在一起从各方面来说都更加方便一点。因此,即使你不打算把这个脚本作为素材公开发布也建议你在「▼ 素材」下方插入新脚本。
开始写脚本前的第一件事便是找到为了实现自己的目标而需要进行修改的地方。
这次要改造的是计时器,所以全局搜索一下『计时器(タイマー)』吧,注意不要勾选『仅全词匹配』。搜索出来的结果总共有哪几条?依次看下去,寻找和计时器有关的部分。
这次要改的计时器就是『Sprite_Timer』这个脚本。脚本的介绍在脚本开头也有。改造特定的功能就是如此的简单,掌握诀窍的话很快就能找到需要修改的脚本位置。
在新创建的这个脚本中,输入:在Ruby编程语言中,已经定义过的东西可以通过再次定义来变更。因此,在我们写在class Sprite_Timer和end中间的内容也可以看成是对原来那个class Sprite_Timer的修改。 阅读原本的Sprite_Timer脚本应该可以找到一个名为create_bitmap的方法,这个方法设定了计时器的文字颜色及大小,这次我们要改造的就是这里,复制create_bitmap这个方法,粘贴到我们新建的这个脚本中。脚本变成了现在这样:- class Sprite_Timer
- def create_bitmap
- self.bitmap = Bitmap.new(96, 48)
- self.bitmap.font.size = 32
- self.bitmap.font.color.set(255, 255, 255)
- end
- end
复制代码 新的脚本和旧的脚本中都出现了名为create_bitmap的这个方法(def create_bitmap),在Ruby语言中,同一个类(class Sprite_Timer)中出现两个名字相同的方法(def create_bitmap)时是只会识别放在最下方的那个脚本中的方法的(即,只认我们新写的这个脚本中的def create_bitmap),所以,我们可以用这个脚本中的create_bitmap替换掉原本的create_bitmap。这便是脚本的实质(同时也是脚本冲突的实质嗯= =)。
把刚才的create_bitmap这个方法实际的来修改一下吧。
- class Sprite_Timer
- def create_bitmap
- self.bitmap = Bitmap.new(128, 96)
- self.bitmap.font.size = 64
- self.bitmap.font.color.set(255, 0, 0)
- end
- end
复制代码 按照上面的数字进行修改后,计时器显示的文字成功放大并且变成红色的了。
对于这里的这些数字的意义还不甚了解的人可以把数字自己改一改来实验一下,如果想要详细确定其意义的话可以参考Bitmap、Font、Color这三个类。
通过上面的步骤我们已经完成了一个『计时器显示文字放大变红』的脚本素材,然而,如果要把这个脚本给其他人使用时由于我们覆盖了原本的create_bitmap,所以脚本与其他脚本可能存在冲突,如果你要做的不是完全修改掉某个方法而只是在已有的方法后面添加什么内容的话,可以使用alias(别名)这个功能。
- class Sprite_Timer
- alias xxx001_create_bitmap create_bitmap
- def create_bitmap
- xxx001_create_bitmap
- self.bitmap.font.color.set(255, 0, 0)
- end
- end
复制代码 上面这种写法可以在执行原本的create_bitmap的基础上把文字的色彩改成红色
- alias xxx001_create_bitmap create_bitmap
复制代码 这一行的作用是给原来的create_bitmap起一个xxx001_create_bitmap的别名,让原本的create_bitmap躲进xxx001_create_bitmap避难以免遭到覆盖。这样一来,在新的create_bitmap中就可以用xxx001_create_bitmap来调用原先的create_bitmap。但是,别名相同的情况也是有可能发生的,为了使别名不与其他脚本素材发生冲突,独特的别名是很有必要的。即使是同一个脚本在相同的地方定义了同样的别名同样会发生冲突。
稍微容易给人造成混乱的地方是,重新定义create_bitmap并不是在原来的方法里写新的内容,而是创造了一个看起来好像是这样的新方法,因此,躲进别名里面避难的旧方法是不会受到重新定义的新方法带来的影响的。
作者: 喵呜喵5 时间: 2013-12-21 21:15
本帖最后由 喵呜喵5 于 2013-12-28 23:27 编辑
接下去将介绍在菜单中增加一个新指令来调出一个新的场景(界面)的方法。
下面以制作一个包含全屏幕大小的前情提要窗口的界面为例。
在菜单中显示物品、技能等命令的那个窗口对应脚本中的Window_MenuCommand。
在Window_MenuCommand中稍微的找一找,可以发现add_original_commands这个方法。在VA中对这个方法进行修改可以很简单的追加新命令,具体的脚本如下:- class Window_MenuCommand
- alias xxx001_add_original_commands add_original_commands
- def add_original_commands
- xxx001_add_original_commands
- add_command("前情提要", :story)
- end
- end
复制代码 把这个脚本放进脚本编辑器中之后测试游戏时便会发现菜单中追加了『前情提要』的命令。虽然add_original_commands这个方法原本什么内容都没有,在这里我们也要使用alias定义它的别名防止其他和其他修改了这里的脚本发生冲突。如果最后你要把这个脚本作为一个素材发布的话,还是建议你把别名“xxx001_add_original_commands”改成其他更不容易与别人重复的别名。- add_command("前情提要", :story)
复制代码 add_command这个命令之前在解读篇曾经介绍过,这里的作用是追加一个名为『前情提要』的命令,这个命令对应的标志符号为『:story』
实际执行选项的脚本并不在Window_MenuCommand中而在Scene_Menu中。打开Scene_Menu,确认里面的内容,在create_command_window中可以看到下面这行代码:- @command_window.set_handler(:item, method(:command_item))
复制代码 这个也在窗口管理部分解说过,当选择标志符号为『:item』的选项时,系统会执行command_item这个方法。
command_item这个方法的内容如下,它使用了之前解读篇中场景解说部分提到的切换界面的方法(SceneManager.call)。- def command_item
- SceneManager.call(Scene_Item)
- end
复制代码 因此,如果希望制作出选择标志符号为『:story』的选项时界面切换到Scene_Story的效果的话,思路基本上相同,照着写就可以了。- class Scene_Menu
- alias xxx001_create_command_window create_command_window
- def create_command_window
- xxx001_create_command_window
- @command_window.set_handler(:story, method(:command_story))
- end
- def command_story
- SceneManager.call(Scene_Story)
- end
- end
复制代码 下面开始制作Scene_Story。这个前情提要界面和菜单界面风格类似,所以把它的超类定为Scene_MenuBase。- class Scene_Story < Scene_MenuBase
- end
复制代码 覆盖掉原来载入界面时自动执行的start方法,在里面增加一个代码来创建新的窗口。代码中出现的Window_Story将在之后进行定义。- class Scene_Story < Scene_MenuBase
- def start
- super
- @story_window = Window_Story.new
- @story_window.set_handler(:cancel, method(:return_scene))
- end
- end
复制代码 :cancel是Window_Selectable及其子类的窗口中自带的一个标志,当窗口处于选择状态时按下取消键就会执行:cancel这个标志对应的方法。return_scene则在Scene_Base中进行过定义,执行return_scene这个方法可以返回上一个界面。
另外,父类为Scene_Base的界面,被赋值为实例变量的那些窗口(比如@story_window = Window_Story.new)可以自动释放,因此没有必要再特地写上一句dispose了(@story_window.dispose)。
下面开始制作在前情提要界面上显示的Window_Story这个窗口。虽然这个窗口没有必要让玩家进行选择,不过为了使用前面提到过的:cancel这个功能,还是把它的父类定为了Window_Selectable。- class Window_Story < Window_Selectable
- def initialize
- super(0, 0, Graphics.width, Graphics.height)
- draw_text_ex(4, 0, "窗口需要显示的文字")
- activate
- end
- end
复制代码 initialize这个用于初始化方法在基础篇的类定义部分解说过了,当一个对象被创建出来的时候都会自动执行这个方法。super的作用是调用父类的方法,在这个例子中,它所代表的意义就是调用Window_Selectable中的initialize方法。
Graphics.width 和 Graphics.height可以获取游戏窗口的宽和高,我们使用这两个参数来定义窗口的大小。
draw_text_ex的作用是在窗口中显示文字,同时,它也支持类似\C[n]、\V[n]这样的转义字符,另外,由于Ruby语言中“\”这个符号有特殊的意义,所以在双引号括起来的文字中,原本一个反斜杠必须转成类似“\\C”这样两个反斜杠的形式。
activate的作用是使窗口能够接收玩家的指令,在这个窗口中,使用了activate以后玩家就可以按取消键了(其他的按键由于这里没有设置所以按下了也不会有反应)。
输入以上内容后就可以进行测试了,下面让我们实际来运行一下吧。
为了让这个窗口显示的前情提要能够随着游戏的进行而发生变化,可以简单的判定变量的数值来实现。这里假设让这个窗口与游戏中的7号变量$game_variables[7]进行对应。在游戏中使用变量操作指令或者F9调出控制台来修改这个变量的值。- class Window_Story < Window_Selectable
- def initialize
- super(0, 0, Graphics.width, Graphics.height)
- case $game_variables[7]
- when 0
- story = "在进行第0段剧情时的前情提要"
- when 1
- story = "在进行第1段剧情时的前情提要"
- when 2
- story = "在进行第2段剧情时的前情提要"
- end
- draw_text_ex(4, 0, story)
- activate
- end
- end
复制代码 例子中使用了case ~ end这种形式的条件分歧来更改前情提要的内容。使用哈希的话还可以让脚本变的更加优雅,如果有余裕的话请自己试试看。
制作瞬移道具
作者: 喵呜喵5 时间: 2013-12-21 21:15
本帖最后由 喵呜喵5 于 2014-2-2 20:25 编辑
下面开始讲解菜单界面里物品以及技能的处理。
作为例子,这里向大家介绍如何制作在迷宫中快速移动到入口的瞬移道具。
在开始写脚本前,请先打开数据库设定一下瞬移道具的数据。
在适当的位置新建一个道具。
作用范围选择“无”,使用条件选择“仅菜单中”,在备注中填入<ESCAPE>(包含“<>”这个符号) 。
创建一个拥有特殊效果的技能/道具的时候,利用备注会比较方便,之后只需要判定备注栏里是否有制定的内容就好,比起判定道具/技能的名字、ID,使用备注可以提升脚本的通用性。在这个例子中我们通过判定备注栏里是否含有<ESCAPE>来判定是否属于瞬移道具/技能。
数据设置完毕后,使用事件指令『增减物品』制作一个能够快速获得该道具的工程用于测试,准备工作便完成了。
在菜单中处理技能和道具的是Scene_ItemBase里的use_item方法 (虽然名字叫item,这个方法也负责处理技能)。最开始就从这里入手,重新对其进行定义。
- class Scene_ItemBase
- alias xxx001_use_item use_item
- def use_item
- xxx001_use_item
- use_escape_item if item.note.include?("<ESCAPE>")
- end
- def use_escape_item
- print "瞬移!\n"
- end
- end
复制代码 上面这段脚本实现了如果备注栏里有<ESCAPE>则执行use_escape_item方法的功能。
- use_escape_item if item.note.include?("<ESCAPE>")
复制代码 在这句代码中,item代表使用的道具,也就是是RPG::Item或者RPG::Skill的一个实例方法(这句不太确定,附上原文:item というのは、使用されたアイテムのオブジェクト、つまり RPG::Item や RPG::Skill のインスタンスを返すメソッドです (これは Scene_ItemBase クラスではなく、継承先の Scene_Item および Scene_Skill クラスで定義されています) 。)
note代表数据库中的备注,是一个字符串,字符串的include?方法用于判定其是否包含特定的文字。
use_escape_item这个方法执行的内容目前就暂时用在控制台显示“瞬移”两个字来代替。
- def use_escape_item
- print "瞬移!\n"
- end
复制代码 实际测试的时候也先像这样试试能不能正常执行use_escape_item再继续下一步吧。
为了让瞬移道具使用后能自动返回地图界面,这里需要在use_escape_item里增加一句返回地图的代码。除了用之前介绍过的call方法外,因为之后没有必要再返回这个界面了所以也可以使用goto方法
- def use_escape_item
- SceneManager.goto(Scene_Map)
- end
复制代码 Scene_Map正如其名字一样,对应地图场景,这句代码调用了SceneManager模块中的goto方法来让物品使用时自动返回地图界面。
游戏角色对应的Game_Player类中已经预定义了场所移动的方法reserve_transfer。
- def use_escape_item
- $game_player.reserve_transfer(1, 10, 8)
- SceneManager.goto(Scene_Map)
- end
复制代码 reserve_transfer对应的三个参数分别是地图ID、X坐标、Y坐标,例如在这个例子中执行这个语句后玩家将移动到ID为1的地图上坐标为(10,8)的地方。这里先随意写几个数确定一下是否能正常移动过去吧。
确认能够正常移动后,下面要使用游戏变量来设定场所移动的位置了。
- def use_escape_item
- m = $game_variables[21]
- x = $game_variables[22]
- y = $game_variables[23]
- $game_player.reserve_transfer(m, x, y)
- SceneManager.goto(Scene_Map)
- end
复制代码 例子中使用21~23号变量确定移动的位置,当然,使用其他变量也是可以的。
在很多情况下,例如当玩家不在迷宫中时,我们希望禁止玩家使用瞬移道具。为了满足这些要求,接下去我们设定当之前用来储存地图ID的21号变量值为0的时候禁止选择瞬移道具。- class Game_BattlerBase
- alias xxx001_usable_item_conditions_met? usable_item_conditions_met?
- def usable_item_conditions_met?(item)
- if item.note.include?("<ESCAPE>") && $game_variables[21] == 0
- false
- else
- xxx001_usable_item_conditions_met?(item)
- end
- end
- end
复制代码 用来判定物品/技能是否可以使用的语句在Game_BattlerBase里,这里对usable_item_conditions_met?这个方法进行重新定义。如同注释中所写的,这个方法用来判定某个技能/道具的使用方法,返回true代表可以使用,返回false代表不能使用。
如果想要知道使用条件具体是怎么判定的话,请尝试解读usable?方法吧。
作者: 喵呜喵5 时间: 2013-12-21 21:16
本帖最后由 喵呜喵5 于 2014-2-4 13:57 编辑
弃坑
{:2_260:}
作者: tan12345 时间: 2013-12-23 11:26
什么时候填坑?
作者: 天地有正气 时间: 2013-12-26 09:33
我会说我已经拿到了RMVA帮助的汉化版?
作者: 喵呜喵5 时间: 2013-12-28 13:45
本帖最后由 喵呜喵5 于 2014-2-4 13:58 编辑
已弃坑
{:2_260:}
此帖作废
作者: 喵呜喵5 时间: 2013-12-28 22:31
本帖最后由 喵呜喵5 于 2014-2-4 13:59 编辑
弃坑,之前占的楼作废
{:2_260:}
作者: Sion 时间: 2014-1-9 23:16
你这个字太多了啊,看到都怕了
作者: 喵呜喵5 时间: 2014-2-4 14:01
在K島看到了完整的全文翻譯,所以之後這個帖子就不會更新了
棄坑前最後一次自頂
作者: rmav 时间: 2014-2-5 09:56
用的半英半中的帮助文件,没有这一部分内容。
去官方网站下了最新国际版,里头居然也没有这一部分内容 。 这一部分是日文版独有的?{:2_251:}
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |