Project1

标题: 有关脚本的最初级提问 [打印本页]

作者: 流着水的你の眼    时间: 2014-4-15 23:04
标题: 有关脚本的最初级提问
近来在学习脚本
在Window-Base中第196行,

RUBY 代码复制下载
  1. # ● 绘制内容
  2.   #     args : 与 Bitmap#draw_text 相同
  3.   #--------------------------------------------------------------------------
  4.   def draw_text(*args)
  5.     contents.draw_text(*args)
  6.   end


意思是定义了draw_text方法,然后这个方法的内部动作是对contents执行draw_text方法,结束。
我的理解是在调用draw_text方法时,会对contents执行draw_text方法,但执行draw_text方法的内部动作又是对contents执行draw_text方法,这不就是来回的循环了吗?

可能我还是没有说明白,我就是想说,我们定义一个方法就是想以后调用它,但怎么它自己的内部动作就是执行它自己啊?

不知道我有没有说明白。呵呵···

语文、数学、英语、政治老师都死的早,大家帮帮我这失学儿童吧
作者: 皮卡星    时间: 2014-4-16 03:21
因为contents用的draw_text属于Bitmap类的内容,
Bitmap里的draw_text是这样的:
draw_text(x, y, width, height, str[, align])
draw_text(rect, str[, align])

このビットマップの矩形 (x, y, width, height) または rect (Rect) に文字列 str を描画します。
str が文字列のオブジェクトでない場合には、to_s メソッドにより文字列に変換してから処理を行います。
テキストの長さが矩形の幅を超える場合は、幅を 60% まで自動的に縮小して描画します。
水平方向はデフォルトで左揃えですが、align に 1 を指定すると中央揃え、2 を指定すると右揃えになります。垂直方向は常に中央揃えです。
この処理には時間がかかるため、1 フレームごとに文字列を再描画するような使い方は推奨されません。


以上为复制F1帮助内容
作者: 流着水的你の眼    时间: 2014-4-16 09:02
本帖最后由 流着水的你の眼 于 2014-4-16 09:06 编辑

谢谢您的回答,意思是方法中调用了其他类中的draw_text方法。
但在harinlen 编辑的RGSS3 教程大家写(帖子链接)中的第58页有这样一段话:

子类化:方法覆盖 但是,仅仅是集成的话是不够的。子类有些功能从根本实现上就是和父类不同的。我们怎么办呢?譬如说吧,不同动物有着不同的发声器官,动物靠它发出叫声:
RUBY 代码复制下载
  1. lass Animal
  2.   def cry
  3.      get_cry_organ () . cry ()
  4.   end
  5.   def get_cry_organ
  6.       nil #抽象动物没有发声器官
  7.    end
  8.    protected : get_cry_organ
  9. end

其中定义方法 cry 然后它的内部动作又是对get_cry_organ ()执行cry ()方法,这里的cry ()方法,在别的地方应该没有定义过了吧,又回到了上面的问题了。

PS:我看到您回复的时间是在凌晨3点多,您要注意身体啊,写程序再忙也要注意休息啊。

作者: 喵呜喵5    时间: 2014-4-16 12:23
本帖最后由 喵呜喵5 于 2014-4-16 12:27 编辑

请看下面的代码
  1. class A
  2.   def hi
  3.     p "hi"
  4.   end
  5. end
  6. class B
  7.   def hi
  8.     p "hello"
  9.   end
  10. end
  11. a=A.new
  12. b=B.new
  13. a.hi
  14. b.hi
复制代码
你看,他们都执行hi方法,但是结果不同对吧?
然后再看这个
  1. class C
  2.   def hi
  3.     p "yes"
  4.   end
  5.   def do
  6.     a=A.new
  7.     a.hi
  8.   end
  9. end
复制代码
C类对象执行do方法后会得出什么结果你应该理解了吧?
作者: taroxd    时间: 2014-4-16 12:37
流着水的你の眼 发表于 2014-4-16 09:02
谢谢您的回答,意思是方法中调用了其他类中的draw_text方法。
但在harinlen 编辑的RGSS3 教程大家写(帖子 ...

搞清楚调用方法的对象,例子参见楼上

get_cry_organ应该返回一个可以调用cry方法的对象。在抽象类中这一点没有体现出来,这个方法交给子类来实现。
作者: 流着水的你の眼    时间: 2014-4-17 21:25
流着水的你の眼 发表于 2014-4-16 09:02
谢谢您的回答,意思是方法中调用了其他类中的draw_text方法。
但在harinlen 编辑的RGSS3 教程大家写(帖子 ...

感谢 皮卡星君 的回答 ,能否再回答一下我三楼的问题,谢谢了
作者: 流着水的你の眼    时间: 2014-4-17 21:26
本帖最后由 流着水的你の眼 于 2014-4-17 21:28 编辑

我次 点错了 连贴了{:7_303:}
作者: 喵呜喵5    时间: 2014-4-18 17:10
本帖最后由 喵呜喵5 于 2014-4-18 17:17 编辑

请把教程后面那半段看完…………= =
  1. #~ 定义一个动物类
  2. class Animal
  3.   #~ cry方法
  4.   def cry
  5.     get_cry_organ.cry
  6.   end
  7.   #~ 获取发声器官方法
  8.   def get_cry_organ
  9.     nil
  10.   end
  11. end
  12. #~ 定义动物类的子类喵呜喵5类
  13. class Mwm5 < Animal
  14.   #~ 定义实例变量属于猫类
  15.   def initialize
  16.     @mwm5 = Cat.new
  17.   end
  18.   #~ 覆盖父类的同名方法
  19.   def get_cry_organ
  20.     @mwm5
  21.   end
  22. end
  23. #~ 定义喵呜喵5类中的一个实例变量的类猫类,这个类包含一个名为cry的方法
  24. class Cat
  25.   #~ 执行cry方法的内容
  26.   def cry
  27.     p "miao~!"
  28.   end
  29. end

  30. object = Mwm5.new
  31. object.cry
复制代码
首先我们肯定不是直接在作为父类的动物类中执行get_cry_organ.cry,因为这个类中get_cry_organ获取的内容为nil,执行cry方法肯定出错,

所以这里就有了一个子类喵呜喵5类,通过get_cry_organ在子类中可以获取一个实例变量@mwm5

于是就变成了实例变量@mwm5执行cry方法,而这个实例变量@mwm5所属的猫类中的cry方法执行的内容是“p "miao~!"”,于是最终脚本的操作就是“p "miao~!"”

这样写你看的懂吗?
作者: 流着水的你の眼    时间: 2014-4-18 18:55
谢谢 喵呜喵5 的回答非常详细 看来我的学习之路还有很远啊




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1