【中阶教程】你真的懂了吗?(一)
为那些会用脚本但是“不知道怎么就出了个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]