じ☆ve冰风 发表于 2024-4-19 16:58:42

【中阶教程】你真的懂了吗?(一)


为那些会用脚本但是“不知道怎么就出了个Bug”的人而作。


(一) super
1 super的含义是,执行直接基类中的同名方法。
2 super的参数将被直接传递给基类中的同名方法。数量上不符合的,触发ArgumentError
3 如果直接写super,将会把这个方法的参数传递给基类中的同名方法,而不是什么都不传递。
如果写成“super()”,那么什么都不传递。
数量上不符合的,触发ArgumentError。
4 在子类中定义父类的方法,没有super的,父类方法被覆盖。有super的,于该位置执行父类的同名方法
空方法依然可以被super(如【VX】Scene_Base#update),用来进行统一化的基类计算。
5 super不能执行间接基类中的同名方法。如果想跳过直接基类,直接执行间接基类的方法,必须使用alias
6 super是关键字并且具有高优先级。

看不懂?没关系,本来就没希望你看懂= =下面的代码或许可以帮助你理解。如果您无法正常阅读这些代码,那么您还是去加强基本功吧。(喂)

1class Adef initialize    p "call A initialize..."   # 执行 4endendclass B < Adef initialize    p "call B initialize..."   # 执行 2    super                      # 执行 3   endendclass C < Bdef initialize    super                      # 执行 1    p "call C initialize..."   # 执行 5endendc = C.new                      # 执行 0 复制代码应用:规则1、4
这是一张说明脚本运行的流程图……= =

2class Adef pass(para)    p paraendendclass B < Adef pass(para)    super       # 注意,super没有参数也没有括号,                # 应用规则 3(1),参数列直接传给基类                  super(para) # 用规则 2 传递参数    super()   # 用规则 3(2) 传递参数,引发ArgumentError,                # 因为提供了 0 个参数给A的pass方法    # 综上呢……我们还可以说明,一个方法内可以写多个super= =endendb = B.newb.pass("Hello World")复制代码应用:规则2、3
是不是很难理解呢那么我们来拿Window_Base做例子吧。(注:下面的脚本必须加在Window_Base定义之后)
3class Window_A < Window_Basedef initialize(x,y,width,height)    super   # 直接传递出本方法的参数(x,y,width,height)    p "Window_A initialize succeed..."endenda = Window_A.new(0,0,100,100)class Window_B < Window_Basedef initialize(x,y)    super(x,y,200,200) # 传递自己的2个参数和2个常数    p "Window_B initialize succeed..."endendb = Window_B.new(0,0)# 啥?太简单了?看下面class Window_C < Window_Basedef update(a)    self.contents.draw_text(self.contents.rect,a,1)    superendend# c的initialize方法没有重写,也就是Window_Base的# 所以仍然有 4 个参数c = Window_C.new(0,0,100,100)c.update("hi")复制代码由于super直接传递了本参数列,所以给了Window_Base的update一个莫名的参数a,于是悲剧。改成super()即可成功刷新。
应用:规则2、3
4【VX】class Scene_Basedef start    p "Scene start..."endend复制代码应用:规则4(2)class Adef initialize    p "call A init..."enddef super    p "call A super..."endendclass B < Adef initialize    super    self.superendendb = B.new复制代码应用:规则6

特别强调说明:以下类的子类,在initialize,update,dispose中必须调用super:
Window/Window_Base
Sprite
Viewport
Plane
Bitmap

家庭作业:看下面代码,预计会出现什么问题或者是通过,并输入查看结果。如果有错误,修改直到无故障。class Sprite_Up < Spritedef initialize(string)    super()    @string = string    self.bitmap = Bitmap.new(640,480)enddef update(str)    if @string != str      @string = str      refresh(str)    endenddef disposeenddef refresh(str)    super    self.bitmap.draw_text(self.bitmap.rect,str)endenda = Sprite_Up.new("")for i in 1..300a.update("Hello World")Graphics.updateenda.flash(Color.new(255,0,0),40)for i in 1..40Graphics.updateenda.dispose复制代码如果您仍然无法理解,或者家庭作业无法完成,欢迎回帖讨论。
答案在14楼(孩子你寂寞了口胡)
             本帖来自P1论坛作者IamI,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=134877若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: 【中阶教程】你真的懂了吗?(一)