设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3829|回复: 7
打印 上一主题 下一主题

兩段脚本的上下排序BUG

[复制链接]

Lv5.捕梦者

梦石
0
星屑
24292
在线时间
5047 小时
注册时间
2016-3-8
帖子
1618
跳转到指定楼层
1
发表于 2020-9-12 17:17:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

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

Lv6.析梦学徒

老鹰

梦石
40
星屑
33412
在线时间
6552 小时
注册时间
2012-5-26
帖子
3178

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

2
发表于 2020-9-12 20:30:12 | 只看该作者
类的继承?
Game_Actor 是 Game_Battler 的子类

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
24292
在线时间
5047 小时
注册时间
2016-3-8
帖子
1618
3
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
20950
在线时间
9333 小时
注册时间
2012-6-19
帖子
7106

开拓者短篇九导演组冠军

4
发表于 2020-9-12 21:23:47 | 只看该作者

点评

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

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4881
在线时间
425 小时
注册时间
2019-10-22
帖子
666
5
发表于 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 够熟悉 做游戏开坑的时候就规划好了需要的功能 知道自己要在哪里加什么
















回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
20950
在线时间
9333 小时
注册时间
2012-6-19
帖子
7106

开拓者短篇九导演组冠军

6
发表于 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 我很赞同

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-27 10:23

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表