查看: 4490|回复: 7

兩段脚本的上下排序BUG

[复制链接]
梦石
0
星屑
29901
在线时间
5734 小时
注册时间
2016-3-8
回帖
1653
发表于 2020-9-12 17:17:28 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 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
这是为什么呢???

老鹰

梦石
40
星屑
37812
在线时间
7091 小时
注册时间
2012-5-26
回帖
3297

极短24评委极短23参与极短22参与极短21评委老司机慢点开短篇十吟唱者组别冠军开拓者剧作品鉴家

发表于 2020-9-12 20:30:12 | 显示全部楼层
类的继承?
Game_Actor 是 Game_Battler 的子类

评分

参与人数 1赞 +1 收起 理由
alexncf125 + 1 塞糖

查看全部评分

回复

使用道具 举报

梦石
0
星屑
29901
在线时间
5734 小时
注册时间
2016-3-8
回帖
1653
 楼主| 发表于 2020-9-12 20:52:08 | 显示全部楼层
本帖最后由 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
复制代码

点评

可能是因为 Game_Actor 里面只有继承下来的 use_item,而没有自己定义再super的,于是alias时对于旧版本ruby会有bug,你试试加个def use_item;super;end  发表于 2020-9-12 21:18
回复

使用道具 举报

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2020-9-12 21:23:47 | 显示全部楼层

点评

啊这。。这标题。。这版区。。怪不得我搜不到了。。  发表于 2020-9-12 21:44

评分

参与人数 1赞 +1 收起 理由
alexncf125 + 1 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
4881
在线时间
425 小时
注册时间
2019-10-22
回帖
647
发表于 2020-9-18 04:28:39 | 显示全部楼层
喵呜喵5 发表于 2020-9-12 21:23
https://rpg.blue/thread-383400-1-1.html

这个帖子无法回帖了

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

这样的做法 更适用于对rgss 够熟悉 做游戏开坑的时候就规划好了需要的功能 知道自己要在哪里加什么
















回复

使用道具 举报

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2020-9-18 15:05:57 | 显示全部楼层
坏数据 发表于 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

评分

参与人数 1赞 +1 收起 理由
坏数据 + 1 我很赞同

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部