制作逃脱物品

在这部分,笔者将会解说从菜单画面使用物品或技能时,进行该技能或物品的专属处理的方法。

我们这次以制作从迷宫内部瞬间移动到入口的物品为范例。

制作物品数据

在制作脚本之前,先打开数据库设置逃脱物品。请在适当的地方增加一个新的项目。

把该物品的效果范围设为[无],使用场合设为[仅菜单中],然后在备注栏输入 <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 方法并不是在 Scene_ItemBase 类里定义的,而是在继承这个类的 Scene_Item 以及 Scene_Skill 这两者中定义)。note 则是对应[备注]的字符串。至于字串类 String 中的 include? 方法,则是判定字符串是否包含特定的字符串部分。

而 use_escape_item 中的内容则是将「逃脱!」字符串输出到控制台──先用这个替代实际处理。

  def use_escape_item
    print "逃脱!\n"
  end

实际进行测试,使用刚才制作的逃脱物品,确定方法有没有被正常调用,有的话就进到下一步吧。

场景的转移

请将 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

参数依序是地图 ID、X 坐标和 Y 坐标。上面的例子表示往地图 ID = 1,x 座标 = 10,y 座标 = 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? 方法开始追溯并尝试解读看看就好咯。