Project1

标题: 如何判断物品或技能是否对目标有用? [打印本页]

作者: 文雅夕露    时间: 2018-1-23 22:57
标题: 如何判断物品或技能是否对目标有用?
本帖最后由 文雅夕露 于 2018-1-23 23:29 编辑

在写分歧时发现有这个问题...
如果这么写的话:

RUBY 代码复制
  1. if Input.trigger?(:C) && $game_party.usable?(item)
  2.       Audio.se_play("Audio/SE/Save",100,100)
  3.     end


RUBY 代码复制
  1. if Input.trigger?(:C) && @actor && @actor.usable?(item)
  2.       Audio.se_play("Audio/SE/Save",100,100)
  3.     end


会发现当物品或技能对目标有效时也会播放音效。
请问该怎么判断才会避免这个问题?

作者: chd114    时间: 2018-1-23 23:02
本帖最后由 chd114 于 2018-1-23 23:07 编辑

关于判断条件,参考GameBattlerBase中的
  1.   #--------------------------------------------------------------------------
  2.   # ● 判定技能/使用物品是否可用
  3.   #--------------------------------------------------------------------------
  4.   def usable?(item)
  5.     return skill_conditions_met?(item) if item.is_a?(RPG::Skill)
  6.     return item_conditions_met?(item)  if item.is_a?(RPG::Item)
  7.     return false
  8.   end
复制代码

这个和Game_Party中的usable?方法有一点区别,它可以针对一个具体的单位(角色/敌人)

你的条件分歧写的是按下按键&&使用者为角色&&可以使用时就播放音效

如果要改成不可使用才播放就需要在
  1. $game_party.usable?(item)
复制代码
前面加上否定!
变成
  1. !$game_party.usable?(item)
复制代码

角色的部分同理

在判断数值相等的时候也可以这样,比如

  1. a = 1
  2. b = 2
  3. p a!=b # => true
  4. p !(a==b) # => !(false) => true
复制代码

只不过有!=方法就不用那么干了
作者: 文雅夕露    时间: 2018-1-23 23:27
chd114 发表于 2018-1-23 23:02
关于判断条件,参考GameBattlerBase中的

这个和Game_Party中的usable?方法有一点区别,它可以针对一个具体 ...

不过好像对使用界面时不起效果...
就是菜单中恢复HP/MP时的界面。
但HP满了再恢复HP时。并没有效果。
是哪里设置错了呢?
作者: chd114    时间: 2018-1-23 23:39
文雅夕露 发表于 2018-1-23 23:27
不过好像对使用界面时不起效果...
就是菜单中恢复HP/MP时的界面。
但HP满了再恢复HP时。并没有效果。

本来就不能对满状态的人用恢复物品/技能
作者: chd114    时间: 2018-1-26 00:45
Game_Battler里有限制

  1.   #--------------------------------------------------------------------------
  2.   # ● 技能/物品的应用测试
  3.   #    如果使用目标的 HP 或者 MP 全满时,禁止使用恢复道具。
  4.   #--------------------------------------------------------------------------
  5.   def item_test(user, item)
  6.     return false if item.for_dead_friend? != dead?
  7.     return true if $game_party.in_battle
  8.     return true if item.for_opponent?
  9.     return true if item.damage.recover? && item.damage.to_hp? && hp < mhp
  10.     return true if item.damage.recover? && item.damage.to_mp? && mp < mmp
  11.     return true if item_has_any_valid_effects?(user, item)
  12.     return false
  13.   end
复制代码

恢复道具的情况,如果是回血的,并且血没满就能用,如果是回蓝的,并且蓝没满就能用




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