Project1

标题: 让角色在某些地图中禁用物品选项 [打印本页]

作者: YamazakiRyusa    时间: 2011-8-2 17:47
标题: 让角色在某些地图中禁用物品选项

如图。
相关讨论贴:怎么让角色在一个地图里无法使用物品
====
后面我想到,其实可以禁止调用物品场景。
为此,我们可以设立一个集合,集合中包含你想让角色无法使用物品的地图 ID。
然后读取当前地图 ID,将其导入到某个变量,作为一个元素。然后判断该元素是否在集合内。
而禁用物品选项的“变灰”,我们可以从标题场景中获得(其实在 Scene_Menu 那里也看到了,当人数为 0 时直接禁用四项功能)。于是该脚本完全可以取代之前的设置。并且不需要额外调用外部变量(“外部变量”:反正我是这么称呼的)。
====
复制下列脚本,覆盖到 Scene_Menu 脚本中。作为参考,需要学习的请仔细研究本脚本 36~44 行以及 134~138 行内容。
  1. #==============================================================================
  2. # ■ Scene_Menu
  3. #------------------------------------------------------------------------------
  4. #  处理菜单画面的类。
  5. #==============================================================================

  6. class Scene_Menu
  7.   #--------------------------------------------------------------------------
  8.   # ● 初始化对像
  9.   #     menu_index : 命令光标的初期位置
  10.   #--------------------------------------------------------------------------
  11.   def initialize(menu_index = 0)
  12.     @menu_index = menu_index
  13.   end
  14.   #--------------------------------------------------------------------------
  15.   # ● 主处理
  16.   #--------------------------------------------------------------------------
  17.   def main
  18.     # 生成命令窗口
  19.     s1 = $data_system.words.item
  20.     s2 = $data_system.words.skill
  21.     s3 = $data_system.words.equip
  22.     s4 = "状态"
  23.     s5 = "存档"
  24.     s6 = "结束游戏"
  25.     @command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6])
  26.     @command_window.index = @menu_index
  27.     # 同伴人数为 0 的情况下
  28.     if $game_party.actors.size == 0
  29.       # 物品、特技、装备、状态无效化
  30.       @command_window.disable_item(0)
  31.       @command_window.disable_item(1)
  32.       @command_window.disable_item(2)
  33.       @command_window.disable_item(3)
  34.     end
  35.     # Ryusa:自行设定禁用物品地图 ID
  36.     not_map_id_data = []
  37.     not_map_id_data.push(*[1,2,3])
  38.     # 将当前地图 ID 导入变量 ryumap 作为元素
  39.     ryumap = $game_map.map_id
  40.     unless not_map_id_data.include?(ryumap) # 除非 ryumap 元素不在集合内
  41.     # 什么也不做
  42.       else @command_window.disable_item(0) # 物品无效化
  43.     end
  44.     # 禁止存档的情况下
  45.     if $game_system.save_disabled
  46.       # 存档无效
  47.       @command_window.disable_item(4)
  48.     end
  49.     # 生成游戏时间窗口
  50.     @playtime_window = Window_PlayTime.new
  51.     @playtime_window.x = 0
  52.     @playtime_window.y = 224
  53.     # 生成步数窗口
  54.     @steps_window = Window_Steps.new
  55.     @steps_window.x = 0
  56.     @steps_window.y = 320
  57.     # 生成金钱窗口
  58.     @gold_window = Window_Gold.new
  59.     @gold_window.x = 0
  60.     @gold_window.y = 416
  61.     # 生成状态窗口
  62.     @status_window = Window_MenuStatus.new
  63.     @status_window.x = 160
  64.     @status_window.y = 0
  65.     # 执行过渡
  66.     Graphics.transition
  67.     # 主循环
  68.     loop do
  69.       # 刷新游戏画面
  70.       Graphics.update
  71.       # 刷新输入信息
  72.       Input.update
  73.       # 刷新画面
  74.       update
  75.       # 如果切换画面就中断循环
  76.       if $scene != self
  77.         break
  78.       end
  79.     end
  80.     # 准备过渡
  81.     Graphics.freeze
  82.     # 释放窗口
  83.     @command_window.dispose
  84.     @playtime_window.dispose
  85.     @steps_window.dispose
  86.     @gold_window.dispose
  87.     @status_window.dispose
  88.   end
  89.   #--------------------------------------------------------------------------
  90.   # ● 刷新画面
  91.   #--------------------------------------------------------------------------
  92.   def update
  93.     # 刷新窗口
  94.     @command_window.update
  95.     @playtime_window.update
  96.     @steps_window.update
  97.     @gold_window.update
  98.     @status_window.update
  99.     # 命令窗口被激活的情况下: 调用 update_command
  100.     if @command_window.active
  101.       update_command
  102.       return
  103.     end
  104.     # 状态窗口被激活的情况下: 调用 update_status
  105.     if @status_window.active
  106.       update_status
  107.       return
  108.     end
  109.   end
  110.   #--------------------------------------------------------------------------
  111.   # ● 刷新画面 (命令窗口被激活的情况下)
  112.   #--------------------------------------------------------------------------
  113.   def update_command
  114.     # 按下 B 键的情况下
  115.     if Input.trigger?(Input::B)
  116.       # 演奏取消 SE
  117.       $game_system.se_play($data_system.cancel_se)
  118.       # 切换的地图画面
  119.       $scene = Scene_Map.new
  120.       return
  121.     end
  122.     # 按下 C 键的情况下
  123.     if Input.trigger?(Input::C)
  124.       # 同伴人数为 0、存档、游戏结束以外的场合
  125.       if $game_party.actors.size == 0 and @command_window.index < 4
  126.         # 演奏冻结 SE
  127.         $game_system.se_play($data_system.buzzer_se)
  128.         return
  129.       end
  130.       # 命令窗口的光标位置分支
  131.       case @command_window.index
  132.       when 0  # 物品
  133.         unless @item_enabled
  134.         # 演奏无效 SE
  135.         $game_system.se_play($data_system.buzzer_se)
  136.           return
  137.         end
  138.         # 演奏确定 SE
  139.         $game_system.se_play($data_system.decision_se)
  140.         # 切换到物品画面
  141.         $scene = Scene_Item.new
  142.       when 1  # 特技
  143.         # 演奏确定 SE
  144.         $game_system.se_play($data_system.decision_se)
  145.         # 激活状态窗口
  146.         @command_window.active = false
  147.         @status_window.active = true
  148.         @status_window.index = 0
  149.       when 2  # 装备
  150.         # 演奏确定 SE
  151.         $game_system.se_play($data_system.decision_se)
  152.         # 激活状态窗口
  153.         @command_window.active = false
  154.         @status_window.active = true
  155.         @status_window.index = 0
  156.       when 3  # 状态
  157.         # 演奏确定 SE
  158.         $game_system.se_play($data_system.decision_se)
  159.         # 激活状态窗口
  160.         @command_window.active = false
  161.         @status_window.active = true
  162.         @status_window.index = 0
  163.       when 4  # 存档
  164.         # 禁止存档的情况下
  165.         if $game_system.save_disabled
  166.           # 演奏冻结 SE
  167.           $game_system.se_play($data_system.buzzer_se)
  168.           return
  169.         end
  170.         # 演奏确定 SE
  171.         $game_system.se_play($data_system.decision_se)
  172.         # 切换到存档画面
  173.         $scene = Scene_Save.new
  174.       when 5  # 游戏结束
  175.         # 演奏确定 SE
  176.         $game_system.se_play($data_system.decision_se)
  177.         # 切换到游戏结束画面
  178.         $scene = Scene_End.new
  179.       end
  180.       return
  181.     end
  182.   end
  183.   #--------------------------------------------------------------------------
  184.   # ● 刷新画面 (状态窗口被激活的情况下)
  185.   #--------------------------------------------------------------------------
  186.   def update_status
  187.     # 按下 B 键的情况下
  188.     if Input.trigger?(Input::B)
  189.       # 演奏取消 SE
  190.       $game_system.se_play($data_system.cancel_se)
  191.       # 激活命令窗口
  192.       @command_window.active = true
  193.       @status_window.active = false
  194.       @status_window.index = -1
  195.       return
  196.     end
  197.     # 按下 C 键的情况下
  198.     if Input.trigger?(Input::C)
  199.       # 命令窗口的光标位置分支
  200.       case @command_window.index
  201.       when 1  # 特技
  202.         # 本角色的行动限制在 2 以上的情况下
  203.         if $game_party.actors[@status_window.index].restriction >= 2
  204.           # 演奏冻结 SE
  205.           $game_system.se_play($data_system.buzzer_se)
  206.           return
  207.         end
  208.         # 演奏确定 SE
  209.         $game_system.se_play($data_system.decision_se)
  210.         # 切换到特技画面
  211.         $scene = Scene_Skill.new(@status_window.index)
  212.       when 2  # 装备
  213.         # 演奏确定 SE
  214.         $game_system.se_play($data_system.decision_se)
  215.         # 切换的装备画面
  216.         $scene = Scene_Equip.new(@status_window.index)
  217.       when 3  # 状态
  218.         # 演奏确定 SE
  219.         $game_system.se_play($data_system.decision_se)
  220.         # 切换到状态画面
  221.         $scene = Scene_Status.new(@status_window.index)
  222.       end
  223.       return
  224.     end
  225.   end
  226. end
复制代码



作者: 精灵使者    时间: 2011-8-2 20:38
其实可以更加简单:打开/关闭某个开关禁止某个选项。
作者: YamazakiRyusa    时间: 2011-8-3 09:25
精灵使者 发表于 2011-8-2 20:38
其实可以更加简单:打开/关闭某个开关禁止某个选项。

起先也是这么考虑的,不过自己感觉现在的方法更方便,懒得在地图出入口弄开关开来关去的。万一遗漏了得不偿失。还不如做个集合将禁用物品的地图 ID 作为元素来得方便。嘛、各有千秋罢了。
作者: 精灵使者    时间: 2011-8-3 10:50
地图出入口弄开关根本用不着啊。
弄个“取消物品操作”的公共事件塞移动之前就好。这样改的话就统一改。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1