笔者将在本章解说商店画面的改造方法。
我们会制作可以用某个变量的值当成持有金,以进行物品交换的「礼品交换所」作为范例。
到目前为止的范例中,比方说要参考 7 号变量的值时,我们都是用 $game_variables[7] 这样的方式直接指定数字。这么做是为范例必须简单易懂为主要的考虑,然而一般的情况,如果某个变量之后会常常改变值,不要用 7 而是用常量的形式去定义会是较好的做法。
关于常量,就跟在 Vocab 模块章节中解说过的一样,只要以英文大写字母为开头定义变量名称就好,只是习惯上常常会全部字母都用大写。
这次我们要制作的商店的规格是,在 20 号开关为 ON 的状态时,呼叫一般商店时会变成「礼品交换所」,而且将以变量 20 的值当作持有的金额。
PRIZE_SHOP_SID = 20 PRIZE_SHOP_VID = 20
我们将开关 ID 省略成 SID、变量 ID 省略成 VID 的形式命名。这个定义直接写在类的定义的外部就好。如果要在不同的地方使用同样的数值的话,像这样先用常数来定义好,后面想要更改常量的值的时候,发生有地方漏掉更改这种失误的风险就会消失。
在实作商店之前,考虑到等等需要测试,麻烦先制作一个事件,让变量 20 增加到适当的值、开关 20 为 ON 的状态,并且会呼叫出商店。
第一步是要将商店画面的[买入]指令名称改成[兑换],然后移除[卖出]指令。
而对应选择[买入]等指令的窗口的类是 Window_ShopCommand。
class Window_ShopCommand alias xxx001_make_command_list make_command_list def make_command_list if $game_switches[PRIZE_SHOP_SID] add_command("兑换", :buy) add_command("离开", :cancel) else xxx001_make_command_list end end end
我们让它参考了刚才定义的常量,如果特定的开关变成了 ON,就会显示[兑换]、[离开]两个指令。关於 add_command 方法,因为笔者已经在制作剧情提示画面中解说过,内容应该很容易理解。由于我们要直接使用一般商店的购买处理,所以符号 :buy 的部分就不作改动。
在显示持有金的窗口中,我们改成显示一个变量的值。这件事情通过重新定义 Window_Gold 类的 value 方法就能办到。
class Window_Gold alias xxx001_value value def value if $game_switches[PRIZE_SHOP_SID] $game_variables[PRIZE_SHOP_VID] else xxx001_value end end end
同样地,需要改变货币的单位的缘故,我们重新定义 currency_unit 方法。笔者假想的是赌场的情况,所以单位就用「枚」来显示。
class Window_Gold alias xxx001_currency_unit currency_unit def currency_unit if $game_switches[PRIZE_SHOP_SID] "枚" else xxx001_currency_unit end end end
在这个窗口显示的变量值和货币单位,在选择商品或是输入购买个数的时候,会自动沿用下去。
实际上决定购买商品之后,会调用 Scene_Shop 类的 do_buy 方法。通过重新定义这个方法,我们能让系统不扣掉金币,而是减少变量的值。
class Scene_Shop alias xxx001_do_buy do_buy def do_buy(number) if $game_switches[PRIZE_SHOP_SID] $game_variables[PRIZE_SHOP_VID] -= number * buying_price $game_party.gain_item(@item, number) else xxx001_do_buy(number) end end end
number 表示购买数量,@item 是购买的物品本身,buying_price 则是物品的单价。
在这边调用的 gain_item 则是 Game_Party 类的方法,进行增加所购买的物品指定个数到物品栏中的处理。
如同在解读篇的场景管理中解说的,场景类中备有用来进行「处理开始」和「处理结束」的方法。
这次我们要向下面一样重新定义处理结束的方法 terminate。
class Scene_Shop alias xxx001_terminate terminate def terminate xxx001_terminate $game_switches[PRIZE_SHOP_SID] = false end end
如此一来,在关闭商店画面的时候,用来识别礼品交换所的开关会自动关闭。