制作剧情提示画面

在本章中笔者会解说在菜单画面中加入新的选项,呼出专属的场景的方法。

我们这次以全屏显示的窗口「剧情提示」为例,制作「剧情提示」选项。

新增自制选项

在菜单画面中,与含有「物品」、「技能」之类选项的那块窗口对应的类是 Window_MenuCommand。

请到 Window_MenuCommand 的脚本页,大致看一遍内容。有看见 add_original_commands 这个空的方法吧。在 VX Ace 里面,只要重新定义这个方法,就可以很容易地追加选项。具体的写法如下所述:

class Window_MenuCommand
  alias xxx001_add_original_commands add_original_commands
  def add_original_commands
    xxx001_add_original_commands
    add_command("剧情提示", :story)
  end
end

请将这段代码加到插件脚本的地方,在测试游戏的时确认指令是否已经增加到菜单中。

尽管这个方法原本就是空白的,使用别名是考虑到别的脚本素材可能已经重新定义过这个方法,所以才会用这个方法避免冲突。让笔者再重复一次,在网络上发布独立的插件脚本时,请务必更改 xxx001 这一处。

    add_command("剧情提示", :story)

add_command 这个方法,是在解读篇的窗口管理中解说过的东西。 我们在这里使叫作「剧情提示」的选项和叫作 :story 的符号(symbol)产生联系。

设置 command handler

选项被选择时,实际在进行处理的不是 Window_MenuCommand,而是 Scene_Menu 这个类。请进到 Scene_Menu 的脚本页,并大致看一下内容。应该会在 create_command_window 这个方法中,看见以下的这一行:

    @command_window.set_handler(:item,      method(:command_item))

就像在窗口管理中解说过的,这是在对应 :item 的选项被选择之后,呼叫出 command_item 这个方法的指定方式。

呼叫出的 command_item 以下面的方式定义。在这里使用了在解读篇的场景管理中解说过的场景的呼叫方式。

  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

只要是从 Window_Selectable 这个类衍生出来的窗口,因为已经设置了 :cancel 这个符号的 handler,所以可以指定在「有效状态」下按下取消按钮后所进行的处理。return_scene 是在 Scene_Base 类中定义的方法。方法如其名,它负责进行回到上一个场景的处理。

此外,场景类中,直接赋值给实例变量的窗口,会由 Scene_Base 自动释放,因此在这里不需要写下 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 本身在处理字符串时,\ 这个符号本身就具有特殊意义,在利用 "" 双引号夹住字符串的时候,必须要用 \\ 这样的双重写法来表示\。

所谓的 activate,是让窗口成为有效状态的方法。这样一来 :cancel 的处理才会生效(这次我们只设置了:cancel 的处理,因此像是按下确定键也不会发生任何事情)。

输入完以上的代码后,就可以测试游戏了。赶快执行看看吧。

使用游戏中的变量

如果要依据事件的进行状况来改变显示的内容,利用 RM 的变量功能就很简单。比方说要使用变量 07 的值,可以用 $game_variables[7]。如果要在游戏中控制变量的值,请利用事件指令[变量操作],或者是用 F9 叫出 debug 画面后再进行操作。

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 形式的分支条件,但若使用哈希表的话,可以写得更漂亮。学有余力的人不妨一试。