Project1

标题: 如何在地图上快捷使用物品 [打印本页]

作者: 陈大帅帅帅哥    时间: 2019-7-29 10:57
标题: 如何在地图上快捷使用物品
比如在背包里可以登记某个物品到A键,然后在地图上按A键就可以使用该物品
作者: guoxiaomi    时间: 2019-8-10 14:51
本帖最后由 guoxiaomi 于 2019-8-10 14:54 编辑

使用并行公共事件,在地图上使用就行,但是你可能需要考虑到物品的消耗、和目标选择:

  1. item = $data_items[物品ID]
  2. # 1. 使用物品
  3. $game_party.actors[队伍ID].item_effect(item)
  4. # 2. 使用的物品数减 1
  5. if item.consumable
  6.   $game_party.lose_item(item.id, 1)
  7. end
  8. # 3. 预约公共事件
  9. if item.common_event_id > 0
  10.   $game_temp.common_event_id = item.common_event_id
  11. end
复制代码

如果是全体队伍为目标,第 1 步应该是:
  1. $game_party.actors.each do |actor|
  2.   actor.item_effect(item)
  3. end
复制代码


音效和动画可以在公共事件里添加,注意你可能需要让并行事件等待 1 帧
作者: guoxiaomi    时间: 2019-8-10 16:17
本帖最后由 guoxiaomi 于 2019-8-10 16:20 编辑

凑合着用吧,这个脚本需要占一个变量、一个开关和一个公共事件,指定ID就行。
RUBY 代码复制
  1. # encoding: utf-8
  2. module Item_ShortCut
  3.   Variable_ID = 1
  4.   Switches_ID = 1
  5.   CommonEvent_ID = 1
  6.   Animation_ID = 3
  7.   Select_Key = Input::X
  8.   Use_Key = Input::X
  9.   Cool_Down = 40
  10. end
  11.  
  12. class Scene_Item
  13.   include Item_ShortCut
  14.   alias _item_shortcut_update_item update_item
  15.  
  16.   def update_item
  17.     if Input.trigger?(Select_Key)
  18.       # 获取物品窗口当前选中的物品数据
  19.       @item = @item_window.item
  20.       # 不使用物品的情况下
  21.       unless @item.is_a?(RPG::Item)
  22.         # 演奏冻结 SE
  23.         $game_system.se_play($data_system.buzzer_se)
  24.         return
  25.       end
  26.       # 不能使用的情况下
  27.       if !$game_party.item_can_use?(@item.id)
  28.         # 演奏冻结 SE
  29.         $game_system.se_play($data_system.buzzer_se)
  30.         return
  31.       end
  32.       # 演奏确定 SE
  33.       $game_system.se_play($data_system.decision_se)
  34.       # 标记并激活公共事件
  35.       item_id = $game_variables[Variable_ID]
  36.       if @item.id == item_id
  37.         $game_switches[Switches_ID] = false
  38.         $game_variables[Variable_ID] = 0
  39.       else
  40.         $game_switches[Switches_ID] = true
  41.         $game_variables[Variable_ID] = @item.id
  42.         # 准备公共事件
  43.         $data_common_events[CommonEvent_ID] ||= RPG::CommonEvent.new
  44.         event = $data_common_events[CommonEvent_ID]
  45.         if event.name != "_item_shortcut"
  46.           event.name = "_item_shortcut"
  47.           event.trigger = 2
  48.           event.switch_id = Switches_ID
  49.           event.list = [
  50.             RPG::EventCommand.new(355, 0, ["_item_shortcut_use_item"]),
  51.             RPG::EventCommand.new,
  52.           ]
  53.           $game_map.need_refresh = true
  54.         end
  55.       end
  56.     end
  57.     # 继续后面的判断
  58.     _item_shortcut_update_item
  59.   end
  60. end
  61.  
  62. class Interpreter
  63.   include Item_ShortCut
  64.  
  65.   def _item_shortcut_use_item
  66.     if !Input.trigger?(Use_Key)
  67.       return
  68.     end
  69.     if !$scene.is_a?(Scene_Map)
  70.       return
  71.     end
  72.     item_id = $game_variables[Variable_ID]
  73.     item = $data_items[item_id]
  74.     if !$game_party.item_can_use?(item.id)
  75.       # 演奏冻结 SE
  76.       $game_system.se_play($data_system.buzzer_se)
  77.       return
  78.     end
  79.     if item.scope > 3
  80.       if item.scope == 4 || item.scope == 6
  81.         $game_party.actors.each do |actor|
  82.           actor.item_effect(item)
  83.         end
  84.       else
  85.         # 给队伍第一个角色使用
  86.         $game_party.actors[0].item_effect(item)
  87.       end
  88.     end
  89.     if item.consumable
  90.       $game_party.lose_item(item.id, 1)
  91.     end
  92.     if item.common_event_id > 0
  93.       $game_temp.common_event_id = item.common_event_id
  94.     end
  95.     # 播放动画和设置冷却时间
  96.     $game_player.animation_id = Animation_ID
  97.     @wait_count = Cool_Down
  98.   end
  99. end

最好配置一下公共事件为:并行处理,一行脚本,否则在读取新的存档的时候,需要重新绑定快捷键:
  1. _item_shortcut_use_item
复制代码





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