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

[转载发布] 教程-脚本入门-何为对象-长篇大论(慎入)

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    昨天 18:01
  • 签到天数: 114 天

    连续签到: 4 天

    [LV.6]常住居民II

    2338

    主题

    403

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    10622
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    13391

    灌水之王

    发表于 2024-4-19 16:52:58 | 显示全部楼层 |阅读模式
    关于[对象,类,方法的调用]的讲解
    前言:
    嗯,其实这类的教程已经不是少数了
    有很多前辈写过这样的教程,不知道我再来写是不是多此一举了.
    目的只有一个,帮助初学脚本的人认识[对象]
    Ruby是一个面向对象的语言
    如果不把这个弄明白,脚本永远也只是停留小白阶段

    只要你能明白何为对象,那么我就能说你的RGSS学会50%了.
    当你明白了何为对象,再加上F1-脚本入门-基础篇 里的最基本的语法
    再去看RGSS,你会恍然大悟觉得这脚本也就不过如此而已.
    只是一些逻辑关系需要自己头脑清晰罢了!

    这是个写给新学者和对 对象 还不够明白的人的教程
    所以讲得不会太深奥,想看深奥的教程去看看秀秀的走火入魔教程吧!

    正文:


    1.先在F1里学习学习一下

    我们先来看看 基础篇里 对象 部分的叙述

    Ruby 所使用的一切数据就称为对象。
    3               # 整数对象
    1.5             # 浮点数对象
    "Ruby"          # 字符串对象
    1..10           # 范围对象
    而对象的种类就称为类。比如字符串对象是属于 String 类,范围对象是属于 Range 类
    要强调特定类所属的对象,有时使用实例这种说法。所谓类可以说是其所属对象的描述。
    大的设计方案都有很多类,决定对象的动作。
    对象必定是属于哪个类的。因此,「属于这个类的对象」也可以说成是「这个类的实例」。


    最后这一句说:
    “对象必定是属于哪个类的。因此,「属于这个类的对象」也可以说成是「这个类的实例」”
    那我们就在调用方法的过程中来体会什么叫对象,什么叫类!
    那么请你先记住一点
    在正常情况下,属于这个类的对象,可以使用这个类里定义的方法

    看看上面的例子
    3               # 整数对象
    3是整数对象,他是整数类的实例,那么他就可以使用整数类里定义的方法
    整数类里有些什么方法?
    我们先来获取一下整数类的类名是什么,然后才好方便我们查找
    打开脚本编辑器在最顶部输入
    p 3.class
    然后运行,得到的结果是 Fixnum
    打开F1,左上方有一个[搜索]的选项卡,
    在里面搜索刚才得到的结果 Fixnum
    然后在搜索结果中点中他进入,先看看最上面的第一句话

    机器指针可处理的定长整数。大部分机器是 31bit。若运算结果超出 Fixnum 范围的话,自动将其变换为 Bignum。

    这句话是什么意思?我也不知道这句话在说什么.......
    但是这并不影响我们调用他的方法
    看到下面的介绍,里面列举出来了2个方法
    调用这2个方法试试?
    p 3.id2name
    p 3.to_sym
    结果显示了2次 nil,为什么会是nil现在不用去理会,
    只需要知道这显示nil和报告错误不是一回事就可以了
    当然你也可以执行一下这一行
    p 3.id3name
    得到的结果是 跑出来了一个错误提示,说Fixnum这个类没有定义 id3name

    然后接下来的一个只是点就是:
    一个对象(实例)可以调用他的类的父类中定义的方法。

    就看Fixnum这个类,在介绍里有说明,他的父类是 Integer
    然后点击那个 Integer 来到 Integer 类的介绍页面
    在这里我们能看到列举出来了大量的方法
    包括平时我们最常用的+ - * / % 等等 都是在这个类里定义的
    这个 Integer 类还有父类 我们点进去看看 Numeric
    在这里也列举了一些方法,那么 作为 Fixnum实例的 3
    能否调用他的父类的父类中定义的方法呢?
    试试就知道了.Numeric类中有个方法叫 abs
    介绍说是取得绝对值
    那么运行一下吧
    p -3.abs
    正如介绍所说,得到了绝对值 3.

    然后我们发现这个 Numeric 类还有个父类 Object
    关于这个Object我就不做过多解释了,还有那个我们前面调用的  3.class
    这个class是哪来的?等你有了一定的基础后去看秀秀的走火入魔教程吧!

    下面你自己去尝试一下调用浮点数类和字符串类的方法?
    1.5             # 浮点数对象
    "Ruby"          # 字符串对象



    2.我们来看看游戏中的对象,游戏中的类

    先看看非常简单的一个窗口类吧 -- 在菜单中显示 步数的窗口
    #==============================================================================
    # ■ Window_Steps
    #==============================================================================
    # 在这里我们定义了一个类,这个类叫 Window_Steps
    # 并且给他指定了一个父类 Window_Base
    class Window_Steps < Window_Base
      #--------------------------------------------------------------------------
      # ● 初始化对像
      #--------------------------------------------------------------------------
    # 我们要在程序运行的时候生成这个Window_Steps类的对象,就要用到new这个方法
    # 当这个new方法被调用的时候就会自动执行这个 initialize 方法
      def initialize
    # 这个 super 的意思是调用这个类的父类里的同名方法
    # 说得再具体一点就是调用 Window_Base 类中的 initialize 方法,
    # 括号里的东西是给父类中的initialize传递参数
        super(0, 0, 160, 96)
    # 这个 self 要注意一下,self出现在方法的定义当中
    # 他指代的就是这个类所生成的对象,
    # 但是现在并没有生成这个类的对象,
    # 所以用这个self来提前代指以后要生成的这个类的对象
    # 不知道这样说是否有误- -
    # 这个 contents 是Window 类的一个属性,就是实例变量
    # 这一行的意思就是 给 这个类生成的对象的实例变量contents赋值
    # 赋的值的内容是一个 Bitmap 类的对象
        self.contents = Bitmap.new(width - 32, height - 32)
    # 这个refresh是这个Window_Steps类中定义的一个方法
        refresh
      end
      #--------------------------------------------------------------------------
      # ● 刷新
      #--------------------------------------------------------------------------
      def refresh
    # 上面我们说了 这个contents被赋值为了Bitmap对象
    # 这个clear方法就是Bitmap类中的一个方法
        self.contents.clear
    # 然后看这个.font(文字).这个.font是在Bitmap对象后的
    # 所以我们先去Bitmap 类里找相关资料 在最下面看到
    # 这个font是个属性
    # 文字也是有类的 Font 类
    # 然后顺藤摸瓜来到 Font 类的介绍页面
    # 发现在属性里有一个 color 这就解释了 font.color
    # self.contents.font.color 这一句最后获取的是字体的颜色
    # 后面的system_color又是什么...这个Window_Step类里没有定义这个
    # 嗯,是的,这个system_color是在父类Window_Base里定义的
    # 全局搜索 def system_color来到Window_Base类里
    # 这个方法最后返回的是一个 Color 类的对象(颜色的类)
        self.contents.font.color = system_color
    # self.contents是一个Bitmap类的对象 这个对象调用Bitmap类的一个方法 draw_text
    # 括号里的东西是这个draw_text方法需要用到的参数
        self.contents.draw_text(4, 0, 120, 32, "步数")
    # 更改这个Bitmap对象的字体的颜色
        self.contents.font.color = normal_color
    # 这里再次调用Bitmap类的描绘文字的方法
    # 要说的是这个 $game_party.steps.to_s
    # 先看 $game_party 这个前面是 $ 他是一个全局变量
    # 他是 Game_Party 类的对象
    # 然后看 $game_party.steps 这个steps是什么
    # 他是获取$game_party这个对象里的一个实例变量的值
    # Game_Party一开始可以看见这样的一段  attr_reader   :steps
    # 这一行的意思就是可以获取实例变量@steps的值 这个值是一个整数
    # 那么 $game_party.steps得到的结果就是一个整数
    # 后面跟着的.to_s就是在对这个整数进行操作,功能就是把这个整数转变成字符串
        self.contents.draw_text(4, 32, 120, 32, $game_party.steps.to_s, 2)
      end
    end

    类定义完了,现在我们要生成这个类的对象
    $step_window = Window_Steps.new
    这个$step_window是一个变量 而 Window_Steps.new是生成一个Window_Steps类的对象
    我们可以不止生成这一个对象 还可以生成多个
    $step_window2 = Window_Steps.new
    $step_w = Window_Steps.new
    $step_w2 = Window_Steps.new
    生成了4个Window_Steps类的对象并分别赋值给了不同的全局变量
    这4个对象可以调用在Window_Steps类里定义的方法refresh
    也可以调用在Window_Base里定义的方法
    然而Window_Base类还有父类 Window 类
    所以他们还可以调用Window类的相关内容
    Window类的介绍可以在F1里查找到
    我们来稍微的改变一下这4个对象吧
    改变其中一个对象的x坐标
    $step_window.x = 320
    改变另外一个对象的y坐标
    $step_window2.y = 240
    改变另外一个对象的宽度
    $step_w.width = 320
    改变另外一个对象的高度
    $step_w.height = 160
    改变x坐标
    $step_w.x = 320
    改变皮肤文件名
    $step_w2.windowskin = nil

    在地图上面新开一个事件,然后在 事件第三页的脚本指令中输入以下几行
    然后运行触发这个事件看看
    1. $step_window = Window_Steps.new$step_window2 = Window_Steps.new$step_w = Window_Steps.new$step_w2 = Window_Steps.new$step_window.x = 320$step_window.y = 240$step_window2.y = 240$step_w.width = 320$step_w.height = 160$step_w.x = 320$step_w2.windowskin = nil复制代码
    复制代码
    可以看见地图上多了4个窗口,这4个窗口就是Window_Steps类的4个对象
    但是让主角4处移动 4个窗口里显示的步数都没有发生改变
    这是因为 4个对象在主角移动以后都没有被调用refresh这个方法
    这个方法的功能前面我们说过了,是对窗口的内容进行描绘
    没有调用这个方法自然也就不会描绘了~
    现在再回过头去看方法中的 self.contents 的这个self
    应该就不难理解了吧?
    当$step_window调用方法的时候 这个self你就可以把他看成是$step_window
    当$step_w调用方法的时候 你就可以把self看成是$step_w



    3.引用
    现在我再来说说我以前学习的时候看到的别人教程里写的一个例子
    如果我们把一个类看成是一个工厂
    然后我们把类中定义的各种各样的方法看成是这个工厂里的各个零件的生产机器
    又或者是各个部门
    那么对象就是这个工厂通过这些机器(部门)生产出来的产品
    这些产品都是独立的,他们随时随地都可以再拿回工厂里去
    用那些机器再次进行加工,从而得到具有自己特色的属性
    如果把父类看成是一个总的技术部门
    那么工厂也可以使用技术部门提供的技术(父类中定义的方法)
    但是这些工厂也可以有自己的技术部门(本类中定义的方法)
    生产出来的产品(对象)既可以用工厂自己的技术,又可以用总技术部门提供的技术




    4.累了....到此为止吧~
      感觉应该够了,如果还有什么不明白的可以回帖.
      but我不保证我能100%回答正确- -
                 本帖来自P1论坛作者后知后觉,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=131427  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

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

    本版积分规则

    关闭

    幸运抽奖

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

    立即查看

    聊天机器人
    Loading...

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

    GMT+8, 2025-3-15 00:05 , Processed in 0.110546 second(s), 53 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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