Project1

标题: 我又跳出来了,关于双持【已解决】 [打印本页]

作者: 间桐樱    时间: 2025-2-19 17:15
标题: 我又跳出来了,关于双持【已解决】
本帖最后由 间桐樱 于 2025-3-3 22:35 编辑

已知双持武器和盾不可共存,准备将武器和盾替换成【主手】和【副手】,如何能在双持情况下既能双持武器,又能持有剑盾(不把盾放在武器类别里的情况下),而不是定死只能选一
又或者干脆按键切换,像扔道具或删技能那样,在装备栏里按个CTRL就能切换是否双持
已拿到三种方法,超出预期,感谢各位大佬
作者: yyzq1432    时间: 2025-2-19 20:15
我觉得吧,既然你都能接受用按键切换,不如更直接点。
开局给玩家一个物品,物品绑一个公共事件,设置俩个职业,一个双持一个剑盾(可以加个后缀便于玩家分辨),公共事件用来切换职业。
笨是笨了点。(反正都要说明,把这点麻烦推给玩家,作者就不需要多费心思了)
作者: yyzq1432    时间: 2025-2-19 21:06
yyzq1432 发表于 2025-2-19 20:15
我觉得吧,既然你都能接受用按键切换,不如更直接点。
开局给玩家一个物品,物品绑一个公共事件,设置俩个 ...


有没有一种可能,我不知道你这是自娱自乐,你也用不着来阴阳怪气我。
如果你想说明这是自娱自乐的,请不要在话前面加上有没有可能,来让我恶心。
作者: 间桐樱    时间: 2025-2-19 22:47
yyzq1432 发表于 2025-2-19 21:06
有没有一种可能,我不知道你这是自娱自乐,你也用不着来阴阳怪气我。
如果你想说明这是自娱自乐的,请不 ...

我主观上并没有阴阳你的意思,但你这么一说我更恶心
作者: soulsaga    时间: 2025-2-19 23:41
本帖最后由 soulsaga 于 2025-2-25 19:27 编辑

我又跳出来了,关于双持
RUBY 代码复制
  1. class Game_Actor < Game_Battler
  2.   #--------------------------------------------------------------------------
  3.   # ● 获取装备栏的数组
  4.   #--------------------------------------------------------------------------
  5.   def equip_slots
  6.     if armors[0]
  7.     return [0,1,2,3,4] if dual_wield? and !weapons[0] and armors[0].atype_id>=5 and weapons.size==0 or dual_wield? and weapons[0] and armors[0].atype_id>=5 and weapons.size==1# 双持武器兼剑盾
  8.     end
  9.     return [0,0,2,3,4] if dual_wield? and weapons.size>0 or weapons[1]  # 双持武器
  10.     return [0,1,2,3,4] # 普通
  11.   end
  12. end

MAIN上面插入以上脚本
然后在主手副手都没有装备武器只装备盾的情況下可以同时装备剑盾
卸下盾后主手装备一把武器时则可以双持
没有深入测试..不排除有BUG..可留回复

atype_id>=5是用语设定的防具类型ID对应原版工程的小盾和大盾类型
作者: yyzq1432    时间: 2025-2-20 03:47
间桐樱 发表于 2025-2-19 22:47
我主观上并没有阴阳你的意思,但你这么一说我更恶心

别主观了,你在话前面加上有没有可能就是来膈应人的。
退一万步讲,你也是把这恶心人的话当成了“幽默风趣”,你们这类人恶心别人时,就觉得只是自己语言幽默,要么就是别人不懂你们的“玩笑”,别人反驳就说别人小题大做,“上纲上线”。
老子本来就是想好心帮个忙,但就像是被狗反过来咬了一口,就算我干的是无用事,但怎么也没干坏事,你非得先恶心我,再跟我杠上。
如果你不明白你的话是来恶心人的,就打个比方。
你问你爸妈要某样东西,你爸妈给了,结果和你想象的有些不符。
你可以回答,我想要的不是这样的。
但你要是在这话之前加上个“有没有可能”——“有没有可能,我想要的不是这样的”,你能说完,看你爸妈抽不抽你就完了。
别杠了,再回复,就直接加族谱了。
作者: kangxi0109    时间: 2025-2-20 08:40
XP党,不大清楚Ace的处理方法。

思路是直接复制一个主手武器的定义,跟原有的盾牌定义同时挂载在副手栏上。
再增加一个判定,副手的武器或盾牌不能同时存在。


作者: soulsaga    时间: 2025-2-20 21:59
上传了视频

双持.zip

1.48 MB, 下载次数: 4


作者: chen12311    时间: 2025-2-22 12:57
本帖最后由 chen12311 于 2025-2-25 20:19 编辑
  1. class Game_BattlerBase
  2.   attr_accessor :equip_switch
  3.   def switch
  4.     @equip_switch
  5.   end
  6.   def switch_open
  7.     if dual_wield?
  8.       change_equip(1, nil)
  9.       @equip_switch=true
  10.     end
  11.   end
  12.   def switch_closs
  13.     if dual_wield?
  14.       change_equip(1, nil)
  15.       @equip_switch=false
  16.     end
  17.   end
  18. end
  19. class Game_Actor < Game_Battler

  20.   #--------------------------------------------------------------------------
  21.   # ● 获取装备栏的数组
  22.   #--------------------------------------------------------------------------

  23.   alias equip_slots_change equip_slots
  24.   def equip_slots
  25.     if switch
  26.       return [0,1,2,3,4,4,4,4] if dual_wield?
  27.     end
  28.     equip_slots_change
  29.   end
  30. end

  31. class Window_Selectable < Window_Base
  32.   alias process_handling_change process_handling
  33.   def process_handling
  34.     process_handling_change
  35.     return process_change   if handle?(:change)   && Input.trigger?(:CTRL)
  36.   end
  37.   
  38.   def process_change
  39.     Audio.se_play("Audio/SE/Equip1", 90, 100)
  40.     Input.update
  41.     activate
  42.     call_handler(:change)
  43.   end
  44. end
  45. class Scene_Equip < Scene_MenuBase
  46.   alias create_slot_window_equip_change create_slot_window
  47.   def create_slot_window
  48.     create_slot_window_equip_change
  49.     @slot_window.set_handler(:change, method(:on_item_change))
  50.   end
  51.   def on_item_change
  52.     if [email protected]
  53.       @actor.switch_open
  54.     elsif @actor.switch
  55.       @actor.switch_closs
  56.     end
  57.     @slot_window.refresh
  58.     @item_window.refresh
  59.   end
  60. end
复制代码

你可以试试这个,测试可以使用
如果有问题的话可以问我
按ctrl切换

#已更新,理解错意思了抱歉
作者: srwjrevenger    时间: 2025-2-24 21:58
soulsaga 发表于 2025-2-19 23:41
我又跳出来了,关于双持

class Game_Actor < Game_Battler

怎么能放弃啊!?
我们掉进过的坑必须得把它埋了(滑稽)
  1. class Game_Actor < Game_Battler
  2. #--------------------------------------------------------------------------
  3.   # ● 获取装备栏的数组
  4.   #--------------------------------------------------------------------------
  5.   def equip_slots
  6.      
  7. if equips[1] #有副武器的情况
  8. return [0,1,2,3,4] if equips[1].name.include?("盾") #副武器名字有盾就是剑盾  
  9. return [0,0,2,3,4] if dual_wield? #1 角色或者副武器有双持就是双持
  10. return [0,0,2,3,4] #2 有双持的主武器卸下时,那个没有双持的副武器也能保留
  11. end     

  12.     #没有副武器的情况
  13.     return [0,0,2,3,4] if dual_wield?
  14.     return [0,1,2,3,4]               
  15.   end
  16. end #
复制代码

作者: soulsaga    时间: 2025-2-24 23:14
srwjrevenger 发表于 2025-2-24 21:58
怎么能放弃啊!?
我们掉进过的坑必须得把它埋了(滑稽)

大佬你埋吧
作者: chen12311    时间: 2025-2-25 20:10
本帖最后由 chen12311 于 2025-2-25 20:28 编辑

RUBY 代码复制
  1. class Game_BattlerBase
  2.   attr_accessor :equip_switch
  3.   def switch
  4.     @equip_switch
  5.   end
  6.   def switch_open
  7.     if dual_wield?
  8.       change_equip(1, nil)
  9.       @equip_switch=true
  10.     end
  11.   end
  12.   def switch_closs
  13.     if dual_wield?
  14.       change_equip(1, nil)
  15.       @equip_switch=false
  16.     end
  17.   end
  18. end
  19. class Game_Actor < Game_Battler
  20.  
  21.   #--------------------------------------------------------------------------
  22.   # ● 获取装备栏的数组
  23.   #--------------------------------------------------------------------------
  24.  
  25.   alias equip_slots_change equip_slots
  26.   def equip_slots
  27.     if switch
  28.       return [0,1,2,3,4,4,4,4] if dual_wield?
  29.     end
  30.     equip_slots_change
  31.   end
  32. end
  33.  
  34. class Window_Selectable < Window_Base
  35.   alias process_handling_change process_handling
  36.   def process_handling
  37.     process_handling_change
  38.     return process_change   if handle?(:change)   && Input.trigger?(:CTRL)
  39.   end
  40.  
  41.   def process_change
  42.     Audio.se_play("Audio/SE/Equip1", 90, 100)
  43.     Input.update
  44.     activate
  45.     call_handler(:change)
  46.   end
  47. end
  48. class Scene_Equip < Scene_MenuBase
  49.   alias create_slot_window_equip_change create_slot_window
  50.   def create_slot_window
  51.     create_slot_window_equip_change
  52.     @slot_window.set_handler(:change, method(:on_item_change))
  53.   end
  54.   def on_item_change
  55.     if !@actor.switch
  56.       @actor.switch_open
  57.     elsif @actor.switch
  58.       @actor.switch_closs
  59.     end
  60.     @slot_window.refresh
  61.     @item_window.refresh
  62.   end
  63. end
现已经更改
作者: 间桐樱    时间: 2025-2-25 21:21
chen12311 发表于 2025-2-25 20:10
class Game_BattlerBase
  attr_accessor :equip_switch
  def switch

大佬,有时间能帮我改一下连续按两次CTRL再切换武器风格吗?
下边这个是我之前请教遗忘技能的时候,某位大佬写的脚本,一秒内按两次CTRL才触发
我试着改了一下加到切换装备里,然而没成功
  def process_ctrl
    Sound.play_ok
    if Time.now - (@last_ctrl_time || Time.at(0)) < 1
      Sound.play_ok
      Input.update
      call_handler(:CTRL)
    end
    @last_ctrl_time = Time.now
  end
end
作者: chen12311    时间: 2025-2-26 08:01
本帖最后由 chen12311 于 2025-2-26 09:50 编辑
  1.   def process_change
  2.     if Time.now - (@last_ctrl_time || Time.at(0)) < 1
  3.       Audio.se_play("Audio/SE/Equip1", 90, 100)
  4.       Input.update
  5.       activate
  6.       call_handler(:change)
  7.     end
  8.     @last_ctrl_time = Time.now
  9.   end
复制代码

#已更新
你那个道具丢出的插件我能看看吗


作者: 间桐樱    时间: 2025-2-26 09:36
本帖最后由 间桐樱 于 2025-2-26 09:40 编辑
chen12311 发表于 2025-2-26 08:01
这个你试试看


还是只按一次就切换武器,不过我找到问题所在了,出在技能遗忘脚本,不知道冲突原因在哪儿,这两个都是按两次CTRL生效,删掉技能遗忘脚本,装备切换就变成正常两次生效,但我又不可能删
#==============================================================================
# ■ Scene_Skill
#==============================================================================
class Scene_Skill < Scene_ItemBase
  #--------------------------------------------------------------------------
  # ● アイテムウィンドウの作成
  #--------------------------------------------------------------------------
  def create_item_window
    wx = 0
    wy = @status_window.y + @status_window.height
    ww = Graphics.width
    wh = Graphics.height - wy
    @item_window = Window_SkillList.new(wx, wy, ww, wh)
    @item_window.actor = @actor
    @item_window.viewport = @viewport
    @item_window.help_window = @help_window
    @item_window.set_handler(:ok,     method(:on_item_ok))
    @item_window.set_handler(:cancel, method(:on_item_cancel))
    @item_window.set_handler(:CTRL,   method(:on_item_del))
    @command_window.skill_window = @item_window
  end
  #--------------------------------------------------------------------------
  # ● スキルを忘れる
  #--------------------------------------------------------------------------
  def on_item_del
    if !item.nil?
      skill_id = item.id
      @actor.forget_skill(skill_id)
      @item_window.refresh
    end
  end
end
#==============================================================================
# ■ Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● スキルを忘れる
  #--------------------------------------------------------------------------
  alias _forget_skill_copy forget_skill
  def forget_skill(skill_id)
    _forget_skill_copy(skill_id)
    @copy_skills.delete(skill_id)
  end
end
#==============================================================================
# ■ Window_Selectable
#==============================================================================
class Window_Selectable < Window_Base
  #--------------------------------------------------------------------------
  # ● 決定やキャンセルなどのハンドリング処理
  #--------------------------------------------------------------------------
  def process_handling
    return unless open? && active
    return process_ok       if ok_enabled?        && Input.trigger?(:C)
    return process_cancel   if cancel_enabled?    && Input.trigger?(:B)
    return process_pagedown if handle?(:pagedown) && Input.trigger?(:R)
    return process_pageup   if handle?(:pageup)   && Input.trigger?(:L)
    return process_ctrl     if Input.trigger?(:CTRL)
  end
  #--------------------------------------------------------------------------
  # ● CTRL ボタン(CTRL)が押されたときの処理
  #--------------------------------------------------------------------------
  def process_ctrl
    Sound.play_ok
    if Time.now - (@last_ctrl_time || Time.at(0)) < 1
      Sound.play_ok
      Input.update
      call_handler(:CTRL)
    end
    @last_ctrl_time = Time.now
  end
end
作者: 间桐樱    时间: 2025-2-26 10:26
chen12311 发表于 2025-2-26 08:01
#已更新
你那个道具丢出的插件我能看看吗

这个就是道具丢弃的脚本,和遗忘脚本一样都是两次CTRL,但不知道为什么不冲突
#==============================================================================
# ■ Window_ItemList
#==============================================================================
class Window_ItemList < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 決定やキャンセルなどのハンドリング処理
  #--------------------------------------------------------------------------
  def process_handling
    return unless open? && active
    return call_handler(:append_ctrl) if handle?(:append_ctrl) && Input.trigger?(:CTRL)
    super
  end
end
#==============================================================================
# ■ Window_ItemNumber
#==============================================================================
class Window_ItemNumber < Window_ShopNumber
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader   :number                   # 入力された個数
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    x = (Graphics.width - window_width) / 2
    super(x, 200, line_height * 2 + 32)
    @item = nil
    @Max = 1
    @number = 1
  end
  #--------------------------------------------------------------------------
  # ● アイテム、最大個数の設定
  #--------------------------------------------------------------------------
  def set(item, max)
    @item = item
    @max = max
    @number = 1
    refresh
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    contents.clear
    contents.draw_text(0, 0, 200, line_height, "捨てる数:")
    draw_item_name(@item, 4, line_height)
    draw_number
  end
  #--------------------------------------------------------------------------
  # ● アイテム名表示行の Y 座標
  #--------------------------------------------------------------------------
  def item_y
    line_height
  end
end
#==============================================================================
# ■ Scene_Item
#==============================================================================
class Scene_Item < Scene_ItemBase
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  alias start_dump start
  def start
    start_dump
    create_item_dump_window
  end
  #--------------------------------------------------------------------------
  # ● アイテムウィンドウの作成
  #--------------------------------------------------------------------------
  alias create_item_window_dump create_item_window
  def create_item_window
    create_item_window_dump
    @item_window.set_handler(:append_ctrl, method(:on_item_dump))
  end
  #--------------------------------------------------------------------------
  # ● アイテム数選択ウィンドウの作成
  #--------------------------------------------------------------------------
  def create_item_dump_window
    @number_window = Window_ItemNumber.new
    @number_window.viewport = @viewport
    @number_window.hide
    @number_window.set_handler(:ok,     method(:on_number_ok))
    @number_window.set_handler(:cancel, method(:on_number_cancel))
  end
  #--------------------------------------------------------------------------
  # ● アイテム[捨てる]
  #--------------------------------------------------------------------------
  def on_item_dump
    if item_dumpable?
      Sound.play_ok
      if Time.now - (@last_ctrl_time || Time.at(0)) < 1
        Sound.play_ok
        @number_window.set(item, max_item)
        @number_window.show.activate
        @item_window.deactivate
      else
        Sound.play_buzzer
      end
    end
    @last_ctrl_time = Time.now
  end
  #--------------------------------------------------------------------------
  # ● 個数入力[決定]
  #--------------------------------------------------------------------------
  def on_number_ok
    Sound.play_ok
    do_item_dump(@number_window.number)
    @number_window.hide
    activate_item_window
  end
  #--------------------------------------------------------------------------
  # ● 個数入力[キャンセル]
  #--------------------------------------------------------------------------
  def on_number_cancel
    Sound.play_cancel
    @number_window.hide
    activate_item_window
  end
  #--------------------------------------------------------------------------
  # ● 捨てるの実行
  #--------------------------------------------------------------------------
  def do_item_dump(number)
    $game_party.lose_item(item, number)
  end
  #--------------------------------------------------------------------------
  # ● アイテムを捨てる判定
  #--------------------------------------------------------------------------
  def item_dumpable?
    item.is_a?(RPG::Item) ? !item.key_item? : (!item.nil?)
  end
  #--------------------------------------------------------------------------
  # ● 所持数の取得
  #--------------------------------------------------------------------------
  def max_item
    $game_party.item_number(item)
  end
end
作者: chen12311    时间: 2025-2-26 10:34
本帖最后由 chen12311 于 2025-2-26 11:35 编辑
间桐樱 发表于 2025-2-26 10:26
这个就是道具丢弃的脚本,和遗忘脚本一样都是两次CTRL,但不知道为什么不冲突
#======================== ...


因为所用到的地方不一样
一个是Scene_Equip
另一个是Scene_Item
#好吧,放错了,实际上还得看新手教程
放错了,我的问题
再根据游戏设置,这是所对应的,还有就是不要整与其产生冲突的键位,比如上下左右确认取消键
esc不行是因为他对应的键位为B,而b是取消
在Window_Selectable有写
  1.   #--------------------------------------------------------------------------
  2.   # ● “确定”和“取消”的处理
  3.   #--------------------------------------------------------------------------
  4.   def process_handling
  5.     return unless open? && active
  6.     return process_ok       if ok_enabled?        && Input.trigger?(:C)
  7.     return process_cancel   if cancel_enabled?    && Input.trigger?(:B)
  8.     return process_pagedown if handle?(:pagedown) && Input.trigger?(:R)
  9.     return process_pageup   if handle?(:pageup)   && Input.trigger?(:L)
  10.   end
复制代码

1.png (88.08 KB, 下载次数: 5)

1.png

2.png (7.06 KB, 下载次数: 5)

2.png

作者: chen12311    时间: 2025-2-26 15:35
本帖最后由 chen12311 于 2025-2-26 16:22 编辑

这样子
这个是你的忘掉技能的插件
  1.   def on_item_del
  2.     if !item.nil?
  3.       skill_id = item.id
  4.       @actor.forget_skill(skill_id)
  5.       @item_window.refresh
  6.       sleep(1)
  7.     end
  8.   end
复制代码

切换装备的
  1.   def on_item_change
  2.     if [email protected]
  3.       @actor.switch_open
  4.     elsif @actor.switch
  5.       @actor.switch_closs
  6.     end
  7.     @slot_window.refresh
  8.     sleep(1)
  9.   end
复制代码

替换掉就行

作者: 魔法丶小肉包    时间: 2025-2-26 16:17
强制按两次才能触发切换
RUBY 代码复制
  1. def process_change
  2.     if Time.now - (@last_ctrl_time || Time.at(0)) < 1
  3.       Audio.se_play("Audio/SE/Equip1", 90, 100)
  4.       Input.update
  5.       activate
  6.       call_handler(:change)
  7.       @last_ctrl_time = nil
  8.     else
  9.       @last_ctrl_time = Time.now
  10.     end
  11.   end

作者: chen12311    时间: 2025-2-26 16:24
可能是因为sleep,把sleep删除再试试
作者: 间桐樱    时间: 2025-2-26 16:54
本帖最后由 间桐樱 于 2025-2-26 17:50 编辑
魔法丶小肉包 发表于 2025-2-26 16:17
强制按两次才能触发切换
def process_change
    if Time.now - (@last_ctrl_time || Time.at(0)) < 1


肉包大佬,我想给道具丢弃也加个强制两次,统一一下,而且这个我按两次CTRL的时候第一次总是Sound.play_buzzer音
  #--------------------------------------------------------------------------
  # ● アイテム[捨てる]
  #--------------------------------------------------------------------------
  def on_item_dump
    if item_dumpable?
      Sound.play_ok
      if Time.now - (@last_ctrl_time || Time.at(0)) < 1
        Sound.play_ok
        @number_window.set(item, max_item)
        @number_window.show.activate
        @item_window.deactivate
        @last_ctrl_time = nil
      else
        @last_ctrl_time = Time.now
      end
    end
  end




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