Project1
标题: 我又跳出来了,关于双持【已解决】 [打印本页]
作者: 间桐樱 时间: 2025-2-19 17:15
标题: 我又跳出来了,关于双持【已解决】
本帖最后由 间桐樱 于 2025-3-3 22:35 编辑
已知双持武器和盾不可共存,准备将武器和盾替换成【主手】和【副手】,如何能在双持情况下既能双持武器,又能持有剑盾(不把盾放在武器类别里的情况下),而不是定死只能选一
又或者干脆按键切换,像扔道具或删技能那样,在装备栏里按个CTRL就能切换是否双持
已拿到三种方法,超出预期,感谢各位大佬
作者: yyzq1432 时间: 2025-2-19 20:15
我觉得吧,既然你都能接受用按键切换,不如更直接点。
开局给玩家一个物品,物品绑一个公共事件,设置俩个职业,一个双持一个剑盾(可以加个后缀便于玩家分辨),公共事件用来切换职业。
笨是笨了点。(反正都要说明,把这点麻烦推给玩家,作者就不需要多费心思了)
作者: yyzq1432 时间: 2025-2-19 21:06
有没有一种可能,我不知道你这是自娱自乐,你也用不着来阴阳怪气我。
如果你想说明这是自娱自乐的,请不要在话前面加上有没有可能,来让我恶心。
作者: 间桐樱 时间: 2025-2-19 22:47
我主观上并没有阴阳你的意思,但你这么一说我更恶心
作者: soulsaga 时间: 2025-2-19 23:41
本帖最后由 soulsaga 于 2025-2-25 19:27 编辑
我又跳出来了,关于双持
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● 获取装备栏的数组
#--------------------------------------------------------------------------
def equip_slots
if armors[0]
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# 双持武器兼剑盾
end
return [0,0,2,3,4] if dual_wield? and weapons.size>0 or weapons[1] # 双持武器
return [0,1,2,3,4] # 普通
end
end
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● 获取装备栏的数组
#--------------------------------------------------------------------------
def equip_slots
if armors[0]
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# 双持武器兼剑盾
end
return [0,0,2,3,4] if dual_wield? and weapons.size>0 or weapons[1] # 双持武器
return [0,1,2,3,4] # 普通
end
end
MAIN上面插入以上脚本
然后在主手副手都没有装备武器只装备盾的情況下可以同时装备剑盾
卸下盾后主手装备一把武器时则可以双持
没有深入测试..不排除有BUG..可留回复
atype_id>=5是用语设定的防具类型ID对应原版工程的小盾和大盾类型
作者: yyzq1432 时间: 2025-2-20 03: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 编辑
- class Game_BattlerBase
- attr_accessor :equip_switch
- def switch
- @equip_switch
- end
- def switch_open
- if dual_wield?
- change_equip(1, nil)
- @equip_switch=true
- end
- end
- def switch_closs
- if dual_wield?
- change_equip(1, nil)
- @equip_switch=false
- end
- end
- end
- class Game_Actor < Game_Battler
- #--------------------------------------------------------------------------
- # ● 获取装备栏的数组
- #--------------------------------------------------------------------------
- alias equip_slots_change equip_slots
- def equip_slots
- if switch
- return [0,1,2,3,4,4,4,4] if dual_wield?
- end
- equip_slots_change
- end
- end
- class Window_Selectable < Window_Base
- alias process_handling_change process_handling
- def process_handling
- process_handling_change
- return process_change if handle?(:change) && Input.trigger?(:CTRL)
- end
-
- def process_change
- Audio.se_play("Audio/SE/Equip1", 90, 100)
- Input.update
- activate
- call_handler(:change)
- end
- end
- class Scene_Equip < Scene_MenuBase
- alias create_slot_window_equip_change create_slot_window
- def create_slot_window
- create_slot_window_equip_change
- @slot_window.set_handler(:change, method(:on_item_change))
- end
- def on_item_change
- if [email protected]
- @actor.switch_open
- elsif @actor.switch
- @actor.switch_closs
- end
- @slot_window.refresh
- @item_window.refresh
- end
- end
复制代码
你可以试试这个,测试可以使用
如果有问题的话可以问我
按ctrl切换
#已更新,理解错意思了抱歉
作者: srwjrevenger 时间: 2025-2-24 21:58
怎么能放弃啊!?
我们掉进过的坑必须得把它埋了(滑稽)
- class Game_Actor < Game_Battler
- #--------------------------------------------------------------------------
- # ● 获取装备栏的数组
- #--------------------------------------------------------------------------
- def equip_slots
-
- if equips[1] #有副武器的情况
- return [0,1,2,3,4] if equips[1].name.include?("盾") #副武器名字有盾就是剑盾
- return [0,0,2,3,4] if dual_wield? #1 角色或者副武器有双持就是双持
- return [0,0,2,3,4] #2 有双持的主武器卸下时,那个没有双持的副武器也能保留
- end
- #没有副武器的情况
- return [0,0,2,3,4] if dual_wield?
- return [0,1,2,3,4]
- end
- end #
复制代码
作者: soulsaga 时间: 2025-2-24 23:14
大佬你埋吧
作者: chen12311 时间: 2025-2-25 20:10
本帖最后由 chen12311 于 2025-2-25 20:28 编辑
class Game_BattlerBase
attr_accessor :equip_switch
def switch
@equip_switch
end
def switch_open
if dual_wield?
change_equip(1, nil)
@equip_switch=true
end
end
def switch_closs
if dual_wield?
change_equip(1, nil)
@equip_switch=false
end
end
end
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● 获取装备栏的数组
#--------------------------------------------------------------------------
alias equip_slots_change equip_slots
def equip_slots
if switch
return [0,1,2,3,4,4,4,4] if dual_wield?
end
equip_slots_change
end
end
class Window_Selectable < Window_Base
alias process_handling_change process_handling
def process_handling
process_handling_change
return process_change if handle?(:change) && Input.trigger?(:CTRL)
end
def process_change
Audio.se_play("Audio/SE/Equip1", 90, 100)
Input.update
activate
call_handler(:change)
end
end
class Scene_Equip < Scene_MenuBase
alias create_slot_window_equip_change create_slot_window
def create_slot_window
create_slot_window_equip_change
@slot_window.set_handler(:change, method(:on_item_change))
end
def on_item_change
if !@actor.switch
@actor.switch_open
elsif @actor.switch
@actor.switch_closs
end
@slot_window.refresh
@item_window.refresh
end
end
class Game_BattlerBase
attr_accessor :equip_switch
def switch
@equip_switch
end
def switch_open
if dual_wield?
change_equip(1, nil)
@equip_switch=true
end
end
def switch_closs
if dual_wield?
change_equip(1, nil)
@equip_switch=false
end
end
end
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● 获取装备栏的数组
#--------------------------------------------------------------------------
alias equip_slots_change equip_slots
def equip_slots
if switch
return [0,1,2,3,4,4,4,4] if dual_wield?
end
equip_slots_change
end
end
class Window_Selectable < Window_Base
alias process_handling_change process_handling
def process_handling
process_handling_change
return process_change if handle?(:change) && Input.trigger?(:CTRL)
end
def process_change
Audio.se_play("Audio/SE/Equip1", 90, 100)
Input.update
activate
call_handler(:change)
end
end
class Scene_Equip < Scene_MenuBase
alias create_slot_window_equip_change create_slot_window
def create_slot_window
create_slot_window_equip_change
@slot_window.set_handler(:change, method(:on_item_change))
end
def on_item_change
if !@actor.switch
@actor.switch_open
elsif @actor.switch
@actor.switch_closs
end
@slot_window.refresh
@item_window.refresh
end
end
现已经更改
作者: 间桐樱 时间: 2025-2-25 21:21
大佬,有时间能帮我改一下连续按两次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 编辑
- def process_change
- if Time.now - (@last_ctrl_time || Time.at(0)) < 1
- Audio.se_play("Audio/SE/Equip1", 90, 100)
- Input.update
- activate
- call_handler(:change)
- end
- @last_ctrl_time = Time.now
- end
复制代码
#已更新
你那个道具丢出的插件我能看看吗
作者: 间桐樱 时间: 2025-2-26 09:36
本帖最后由 间桐樱 于 2025-2-26 09:40 编辑
还是只按一次就切换武器,不过我找到问题所在了,出在技能遗忘脚本,不知道冲突原因在哪儿,这两个都是按两次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
这个就是道具丢弃的脚本,和遗忘脚本一样都是两次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 编辑
因为所用到的地方不一样
一个是Scene_Equip
另一个是Scene_Item
#好吧,放错了,实际上还得看新手教程
放错了,我的问题
再根据游戏设置,这是所对应的,还有就是不要整与其产生冲突的键位,比如上下左右确认取消键
esc不行是因为他对应的键位为B,而b是取消
在Window_Selectable有写
- #--------------------------------------------------------------------------
- # ● “确定”和“取消”的处理
- #--------------------------------------------------------------------------
- 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)
- end
复制代码
-
1.png
(88.08 KB, 下载次数: 5)
-
2.png
(7.06 KB, 下载次数: 5)
作者: chen12311 时间: 2025-2-26 15:35
本帖最后由 chen12311 于 2025-2-26 16:22 编辑
这样子
这个是你的忘掉技能的插件
- def on_item_del
- if !item.nil?
- skill_id = item.id
- @actor.forget_skill(skill_id)
- @item_window.refresh
- sleep(1)
- end
- end
复制代码
切换装备的
- def on_item_change
- if [email protected]
- @actor.switch_open
- elsif @actor.switch
- @actor.switch_closs
- end
- @slot_window.refresh
- sleep(1)
- end
复制代码
替换掉就行
作者: 魔法丶小肉包 时间: 2025-2-26 16:17
强制按两次才能触发切换
def process_change
if Time.now - (@last_ctrl_time || Time.at(0)) < 1
Audio.se_play("Audio/SE/Equip1", 90, 100)
Input.update
activate
call_handler(:change)
@last_ctrl_time = nil
else
@last_ctrl_time = Time.now
end
end
def process_change
if Time.now - (@last_ctrl_time || Time.at(0)) < 1
Audio.se_play("Audio/SE/Equip1", 90, 100)
Input.update
activate
call_handler(:change)
@last_ctrl_time = nil
else
@last_ctrl_time = Time.now
end
end
作者: chen12311 时间: 2025-2-26 16:24
可能是因为sleep,把sleep删除再试试
作者: 间桐樱 时间: 2025-2-26 16:54
本帖最后由 间桐樱 于 2025-2-26 17:50 编辑
肉包大佬,我想给道具丢弃也加个强制两次,统一一下,而且这个我按两次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 |