以信息窗口、状态窗口为首,RPG中有非常多的窗口要处理。在本章将会解释这些窗口是如何管理的。
脚本编辑器里有很多名为 Window_Xxxx 的脚本。按照惯例,这些名称直接对应了类的名字。在这些当中特别重要的是头两个类。
类 | 内容 | 父类 |
---|---|---|
Window_Base | 基本窗口 | Window |
Window_Selectable | 带有选项的窗口 | Window_Base |
RGSS 已经预先内置了名为 Window 的类。这个类控制了窗口的边框、背景的描绘、内容卷动等基本的处理。
Window_Base 类继承了 Window 类,新增了 RPG 窗口必要的基本功能。这个类重要的功能是,自动把设置为当前窗口外观的素材图片读取进来。此外各种文字的颜色也是在这个类里定义的。在 VX Ace 中,\C[n] 这类基本文字控制符的处理也是在这个类中进行的。
Window_Selectable 类继承了 Window_Base 类,新增了检测方向键输入使光标移动、调用事先链接到的窗口方法之类的处理。例如物品的选择等等,在游戏中进行选择的窗口就经常需要用到。这个类就定义了那些窗口共通的功能。而实际上光标移动的处理,是在叫做 update 的法被调用的时候进行的。
调用窗口的 update 方法的是场景类,会在下一章进行解释。
前面说到 Window_Selectable 类有「调用事先链接到的窗口方法」的处理。这个就叫做 handler。这个概念是在 VX Ace 才新引进来的。
它的思路、举例来说就是将方法调用事先链接到「按下确定键之后」、「按下取消键之后」这些动作上,而实际上调用方法的处理则是在窗口类中进行的。
在 Window_Selectable 的中间附近有个叫做 set_handler 的方法,我们先找到它。
def set_handler(symbol, method) @handler[symbol] = method end
这就是设置 handler 的方法。在内部使用到的实例变量 @handler 是一个哈希表对象。
实际上在设置handler的时候会像下面这样调用:
@window.set_handler(:cancel, method(:on_cancel))
这句指令是把叫作 on_cancel 的方法设置为名为 cancel 的 handler。意思是当按下取消键之后就会自动调用 on_cancel 这个方法。method 这个东西则是 Object 类的方法,拥有把当作它的参数的该名称的方法转变成 Method 对象的功能。
前面说明过不少次,在指定方法或者是 handler 的名字会使用符号。这在显示图片的最后一节也有简单提起过,符号是一对一的对应于任何字符串的对象,通过冒号(":")后面写上任意的字符串来指定。虽然很像字符串,从内部处理的效率考虑的话,不需要利用字符串操作时就会使用符号。符号是 Symbol 类的实例。
Window_Selectable 类在窗口为生效状态 (当光标闪烁)会根据需要调用以下四种 handler:
符号 | 内容 |
---|---|
:ok | 确定 |
:cancel | 取消 |
:pageup | 上一页 (L) |
:pagedown | 下一页 (R) |
另外,如果没有设置 handler 就不会执行任何动作。
Window_Selectable 类又派生出了 Window_Command 类。
类 | 内容 | 父类 |
---|---|---|
Window_Command | 指令窗口 (泛用) | Window_Selectable |
Window_HorzCommand | 指令窗口 (横向选择) | Window_Command |
这些类控制所有指令窗口的基本处理。菜单画面或战斗画面的各种指令窗口都有定义各自的类,不过所有的类都是以 Window_Command 类作为父类的。
Window_Command 类使用了前一节解释的 handler 的结构,每个指令都链接到一个符号上。比如要让「物品」这个指令链接到 :item 这个符号上,就要像下方一样使用 add_command 。
add_command("物品", :item)
add_command 的第一个参数是要当做指令名称显示的字符串,第二个参数则是用来指定所对应的符号。
像这个例子所进行的指定是,当选择「物品」这个指令并按下确定键后,对应 :item 的 handler(通过 set_handler 方法)有设置的话,那么就调用该方法。
掌握 handler 的使用会有点辛苦,不过只要先记住大致的概念就足够了。在实践篇中将会用具体的例子进一步说明。
接下来一口气介绍其他相关窗口的类。
类 | 使用画面 | 内容 | 父类 |
---|---|---|---|
Window_Help | 各窗口 | 帮助窗口 | Window_Base |
Window_Gold | 菜单、商店 | 显示持有金币窗口 | Window_Base |
Window_MenuCommand | 菜单 | 指令窗口 | Window_Command |
Window_MenuStatus | 菜单 | 状态窗口 | Window_Selectable |
Window_MenuActor | 物品、技能 | 项目选择窗口 | Window_MenuStatus |
Window_ItemCategory | 物品、商店 | 分类选择窗口 | Window_HorzCommand |
Window_ItemList | 物品 | 物品选择窗口 | Window_Selectable |
Window_SkillCommand | 技能 | 指令窗口 | Window_Command |
Window_SkillStatus | 技能 | 状态窗口 | Window_Base |
Window_SkillList | 技能 | 技能选择窗口 | Window_Selectable |
Window_SkillStatus | 技能 | 状态窗口 | Window_Base |
Window_EquipStatus | 装备 | 状态窗口 | Window_Base |
Window_EquipCommand | 装备 | 指令窗口 | Window_HorzCommand |
Window_EquipSlot | 装备 | 当前装备窗口 | Window_Selectable |
Window_EquipItem | 装备 | 物品窗口 | Window_ItemList |
Window_Status | 状态 | 状态窗口 | Window_Base |
Window_SaveFile | 保存、读取 | 存档窗口 | Window_Base |
Window_ShopCommand | 商店 | 指令窗口 | Window_HorzCommand |
Window_ShopBuy | 商店 | 买入窗口 | Window_Selectable |
Window_ShopSell | 商店 | 出售窗口 | Window_Item |
Window_ShopNumber | 商店 | 输入数量窗口 | Window_Base |
Window_ShopStatus | 商店 | 状态窗口 | Window_Base |
Window_NameEdit | 名字输入 | 名字窗口 | Window_Base |
Window_NameInput | 名字输入 | 文字选择窗口 | Window_Base |
Window_ChoiceList | 地图 | 选项窗口 | Window_Command |
Window_NumberInput | 地图 | 数值输入窗口 | Window_Base |
Window_KeyItem | 地图 | 物品选择窗口 | Window_ItemList |
Window_Message | 地图 | 文字信息窗口 | Window_Selectable |
Window_ScrollText | 地图 | 滚动文字窗口 | Window_Base |
Window_BattleLog | 战斗 | 战斗信息窗口 | Window_Message |
Window_PartyCommand | 战斗 | 队伍指令窗口 | Window_Command |
Window_ActorCommand | 战斗 | 角色指令窗口 | Window_Command |
Window_BattleStatus | 战斗 | 状态窗口 | Window_Selectable |
Window_BattleActor | 战斗 | 角色选择窗口 | Window_BattleStatus |
Window_BattleEnemy | 战斗 | 敌人选择窗口 | Window_Command |
Window_BattleSkill | 战斗 | 技能选择窗口 | Window_SkillList |
Window_BattleItem | 战斗 | 物品选择窗口 | Window_ItemList |
Window_TitleCommand | 标题 | 指令窗口 | Window_Command |
Window_GameEnd | 结束游戏 | 指令窗口 | Window_Command |
Window_DebugLeft | 调试 | 左边的窗口 | Window_Selectable |
Window_DebugRight | 调试 | 右边的窗口 | Window_Selectable |