扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 115|回复: 0

[转载发布] 【中阶教程】你真的懂了吗?(一)

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    2024-11-27 10:08
  • 签到天数: 108 天

    连续签到: 4 天

    [LV.6]常住居民II

    2219

    主题

    376

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    9661
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    12284

    灌水之王

    发表于 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是关键字并且具有高优先级。


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


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

    2
    1. class A  def pass(para)    p para  endendclass B < A  def pass(para)    super       # 注意,super没有参数也没有括号,                # 应用规则 3(1),参数列直接传给基类                    super(para) # 用规则 2 传递参数    super()     # 用规则 3(2) 传递参数,引发ArgumentError,                # 因为提供了 0 个参数给A的pass方法    # 综上呢……我们还可以说明,一个方法内可以写多个super= =  endend  b = B.newb.pass("Hello World")复制代码
    复制代码
    应用:规则2、3
    是不是很难理解呢那么我们来拿Window_Base做例子吧。(注:下面的脚本必须加在Window_Base定义之后)
    3
    1. class Window_A < Window_Base  def 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_Base  def 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_Base  def update(a)    self.contents.draw_text(self.contents.rect,a,1)    super  endend# 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】
    1. class Scene_Base  def start    p "Scene start..."  endend复制代码
    复制代码
    应用:规则4(2)
    1. class A  def initialize    p "call A init..."  end  def super    p "call A super..."  endendclass B < A  def initialize    super    self.super  endendb = B.new复制代码
    复制代码
    应用:规则6

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


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

    本帖子中包含更多资源

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

    x
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2025-1-16 17:55 , Processed in 0.066625 second(s), 54 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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