Project1

标题: 兩段脚本的上下排序BUG [打印本页]

作者: alexncf125    时间: 2020-9-12 17:17
标题: 兩段脚本的上下排序BUG
本帖最后由 alexncf125 于 2024-1-25 13:04 编辑
  1. class Game_Actor
  2.   alias use_item_adik_pp use_item
  3.   def use_item(item)
  4.     if (item.is_a?(RPG::Skill) and self.has_pp(item.id))
  5.       self.use_pp(item.id)
  6.       pay_skill_cost(item)
  7.       item.effects.each {|effect| item_global_effect_apply(effect) }
  8.     else
  9.       p "hello"
  10.       use_item_adik_pp(item)
  11.     end
  12.   end
  13. end
复制代码
  1. class Game_Battler
  2.   alias use_item_refund use_item
  3.   def use_item(item)
  4.     use_item_refund(item)
  5.     process_refund(self,item) if (item.is_a?(RPG::Item) && item.consumable)
  6.   end
  7. end
复制代码
如果刪了上方的脚本, 下方的脚本会執行process_refund
有上方的脚本时, 会 p "hello" 但不会執行process_refund
把上下兩个脚本的位置互換, 则会p "hellio"也会執行process_refund
这是为什么呢???
作者: 百里_飞柳    时间: 2020-9-12 20:30
类的继承?
Game_Actor 是 Game_Battler 的子类
作者: alexncf125    时间: 2020-9-12 20:52
本帖最后由 alexncf125 于 2020-9-12 20:54 编辑
百里_飞柳 发表于 2020-9-12 20:30
类的继承?
Game_Actor 是 Game_Battler 的子类


所以上方的脚本应该改成这样子么
还是把脚本的位置互換就对了??
  1. class Game_Battler
  2.   alias use_item_adik_pp use_item
  3.   def use_item(item)
  4.     if self.is_a?(Game_Actor)
  5.       if (item.is_a?(RPG::Skill) and self.has_pp(item.id))
  6.         self.use_pp(item.id)
  7.         pay_skill_cost(item)
  8.         item.effects.each {|effect| item_global_effect_apply(effect) }
  9.       end
  10.     else
  11.       p "hello"
  12.       use_item_adik_pp(item)
  13.     end
  14.   end
  15. end
复制代码

作者: 喵呜喵5    时间: 2020-9-12 21:23
https://rpg.blue/thread-383400-1-1.html
作者: 坏数据    时间: 2020-9-18 04:28
喵呜喵5 发表于 2020-9-12 21:23
https://rpg.blue/thread-383400-1-1.html

这个帖子无法回帖了

如果按里面说的重定义 有个问题就是 你必须管理好被改过的方法 不然
实用性可能还不如alias
举例 方法A 里面加了一段B 然后后面找到一个好用的脚本 你又把A 复制后添加C 但是你忘了B 于是A+B就不会执行了

这样的做法 更适用于对rgss 够熟悉 做游戏开坑的时候就规划好了需要的功能 知道自己要在哪里加什么
作者: 喵呜喵5    时间: 2020-9-18 15:05
坏数据 发表于 2020-9-18 04:28
这个帖子无法回帖了

如果按里面说的重定义 有个问题就是 你必须管理好被改过的方法 不然

简单点来看这里的问题在于 alias 一个子类未显示定义的方法是不安全的
所以对于脚本作者, alias 时手动定义一下就能避免类似的问题

  1. instance_methods(false).include?(:method_name) || (def method_name *args; super; end)
  2. alias new_name method_name
复制代码


https://github.com/miaowm5/RGSS3 ... 6%96%B9%E5%BC%8F.rb




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