窗口管理

以信息窗口、状态窗口为首,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 方法的是场景类,会在下一章进行解释。

handler

前面说到 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