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

Project1

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

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

 关闭 [复制链接]

Lv4.逐梦者

梦石
0
星屑
6645
在线时间
1666 小时
注册时间
2008-10-29
帖子
6710

贵宾

跳转到指定楼层
1
发表于 2009-8-14 02:09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 后知后觉 于 2009-8-14 02:56 编辑

关于[对象,类,方法的调用]的讲解
前言:
嗯,其实这类的教程已经不是少数了
有很多前辈写过这样的教程,不知道我再来写是不是多此一举了.
目的只有一个,帮助初学脚本的人认识[对象]
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
  2. $step_window2 = Window_Steps.new
  3. $step_w = Window_Steps.new
  4. $step_w2 = Window_Steps.new
  5. $step_window.x = 320
  6. $step_window.y = 240
  7. $step_window2.y = 240
  8. $step_w.width = 320
  9. $step_w.height = 160
  10. $step_w.x = 320
  11. $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%回答正确- -











你知道得太多了

Lv1.梦旅人

B

梦石
0
星屑
50
在线时间
26 小时
注册时间
2007-8-26
帖子
3693
2
发表于 2009-8-14 12:15:18 | 只看该作者
沙发~
于是便跑去找头晕药吃~
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6645
在线时间
1666 小时
注册时间
2008-10-29
帖子
6710

贵宾

3
 楼主| 发表于 2009-8-14 13:27:05 | 只看该作者
本帖最后由 后知后觉 于 2009-8-14 13:32 编辑

我还记得以前我看这类的教程的时候
那才叫头晕- -
一会扔个东东的英文名词出来,一会又扔一个什么东东的英文名词出来
这对于一个没有编程基础而英文也不怎么样的人来说,反而还增加了他的疑惑
对象 这个东西只能意会,不能言传- -
要列举大量的例子才能更有效的助人理解- -

秀秀的走火入魔教程,禾西的战斗系统讲解,秀秀的Win32API基础篇
柳柳的自制任务系统教学,柳之一的用点描绘线段和才发不久的AVG教程
这些都比我写的长很多,但我都从头看到尾- -











你知道得太多了

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
215 小时
注册时间
2007-9-5
帖子
370
4
发表于 2009-8-14 15:37:42 | 只看该作者
学习一下
回复 支持 反对

使用道具 举报

Lv1.梦旅人

清纯红

梦石
0
星屑
61
在线时间
65 小时
注册时间
2009-7-23
帖子
995

贵宾

5
发表于 2009-8-15 00:59:04 | 只看该作者
本帖最后由 赤点 于 2009-8-15 01:00 编辑

还是支持一下,打字很累的。。。
辛苦了。。
不过我就是爱看教程,写脚本
一个游戏还没做= =a
我小时候也不太理解
有一天就突然
就明白了
这就叫。。。
就算痛也要做,宅必备宅人的必备网站
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6645
在线时间
1666 小时
注册时间
2008-10-29
帖子
6710

贵宾

6
 楼主| 发表于 2009-8-15 13:27:20 | 只看该作者
5# 赤点
我也不记得我是怎么样明白这个的

反正就是只能意会不能言传

看过大量的例子后从中找出相同的东西.....











你知道得太多了

回复 支持 反对

使用道具 举报

Lv1.梦旅人

清纯红

梦石
0
星屑
61
在线时间
65 小时
注册时间
2009-7-23
帖子
995

贵宾

7
发表于 2009-8-15 13:55:12 | 只看该作者
这就叫茅塞顿开
我也是看了
跟我从头学脚本后才明白的
就算痛也要做,宅必备宅人的必备网站
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
9 小时
注册时间
2008-7-21
帖子
174
8
发表于 2009-8-26 20:00:05 | 只看该作者
好长看得头都大了.........
回复 支持 反对

使用道具 举报

Lv1.梦旅人

~琉璃の雪~<

梦石
0
星屑
49
在线时间
36 小时
注册时间
2008-11-6
帖子
3678
9
发表于 2009-8-26 21:13:15 | 只看该作者
看来又得把"从头学Ruby"看一遍再去学亿万老师的东西了.
~现在开始自绘头像~
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6645
在线时间
1666 小时
注册时间
2008-10-29
帖子
6710

贵宾

10
 楼主| 发表于 2009-8-26 22:21:21 | 只看该作者
《跟我从头学脚本》这教程我也就只看了一点点而已,当时才学的时候看得云里雾里
【对象】这东西我是在自己的实践中领会出来的= =











你知道得太多了

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-15 00:03

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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