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

Project1

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

[已经解决] 求问Window类一个实例变量问题

[复制链接]

Lv3.寻梦者

梦石
0
星屑
4169
在线时间
258 小时
注册时间
2013-10-13
帖子
815
跳转到指定楼层
1
发表于 2014-10-26 12:15:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 kvkv97 于 2014-10-26 12:16 编辑

class Window_Base < Window
  def initialize(x, y, width, height)
    super()
    @windowskin_name = $game_system.windowskin_name
    self.windowskin = RPG::Cache.windowskin(@windowskin_name)
    self.x = x
    self.y = y
    self.width = width
    self.height = height
    self.z = 100
  end
end
1,@windowskin_name = $game_system.windowskin_name的意思是把$game_system调用Game_System类中的windowskin_name方法,代入 Window_Base 类的@windowskin_name 实例变量中,
模块方法RPG::Cache.windowskin再以这个实例变量@windowskin_name为参数,代入到 self.windowskin中,self是指Window_Base 类的方法initialize的执行对象,那么这个执行对象是Window_Base
还是windowskin?
2,$game_system调用Game_System类中的windowskin_name方法:
#----------------------------------------------------------------------
  # ● 获取窗口外观的文件名
  #----------------------------------------------------------------------
  def windowskin_name
    if @windowskin_name == nil
      return $data_system.windowskin_name
    else
      return @windowskin_name
    end
  end
  #----------------------------------------------------------------------
  # ● 设置窗口外观的文件名
  #     windowskin_name : 新的窗口外观文件名
  #----------------------------------------------------------------------
  def windowskin_name=(windowskin_name)
    @windowskin_name = windowskin_name
  end
那么,Game_System类中的实例变量@windowskin_name是无意义的吗?它怎么可以起到作为 指示 标题文件名的功能的?

Lv2.观梦者

故九江太守

梦石
0
星屑
618
在线时间
2166 小时
注册时间
2012-12-5
帖子
4464
2
发表于 2014-10-26 12:33:46 | 只看该作者
本帖最后由 你最珍贵 于 2014-10-26 12:35 编辑

1.我猜是Window
RUBY 代码复制
  1. @windowskin_name = $game_system.windowskin_name
  2.     self.windowskin = RPG::Cache.windowskin(@windowskin_name)


这里不是有用吗,这里的@windowskin_name应该是应该代码太长了才代入了,用于初始化吧

点评

我终于知道SELF是SUPER()了  发表于 2014-11-7 17:41
如果真的是简化标识符长度的话,不必用实变量  发表于 2014-10-26 19:16
Windouskin是 方法啊,不是方法的执行对象;如果是方法是=的话,那么说Windouskin还是可以的。我不知道这样说的对否,我是按手册定义说的  发表于 2014-10-26 13:17
回复 支持 反对

使用道具 举报

Lv4.逐梦者

「Pemercyia」


Urhurrenna

梦石
0
星屑
9397
在线时间
2748 小时
注册时间
2008-9-5
帖子
3543

开拓者短篇八RM组冠军短篇九导演组亚军白银编剧

3
发表于 2014-10-26 12:35:42 | 只看该作者
问题1:
基本上,每个class里面的self都是指该class本身,
就Window_Base而言,self.x = x, self.windowskin = x 这种句式,
对应的是有 def x=(x), def windowskin=(x)
的函数的,只是这些函数是父类Window或者再往上继承来的,所以Window_Base里没有,
这种有赋值号“=”的函数在class内部就需要用self来调用,其他的没有“=”的可以不用self,比如refresh,update之类,
外部调用是用变量@xxx = Window_Base.new,@xxx.windowskin = x,
对比起来,可以把self与@xxx理解为同个意思,但一个是内部用,一个是外部用。

问题2:
@windowskin_name并不是无意义的,也不是提示标题文件名的功能,
它只是设定窗口皮肤文件名字的变量,从
  1.   #----------------------------------------------------------------------
  2.   # ● 获取窗口外观的文件名
  3.   #----------------------------------------------------------------------
  4.   def windowskin_name
  5.     if @windowskin_name == nil
  6.       return $data_system.windowskin_name
  7.     else
  8.       return @windowskin_name
  9.     end
  10.   end
复制代码
中可以看出,如果这个变量为空,则读取数据库设定的窗口皮肤,否则就返回它本身,
在Window_Base里也用到了这个变量“@windowskin_name = $game_system.windowskin_name”,
如此,在Window_Base引用的时候,就获得了窗口皮肤的文件名字。
至于下面一段
  1.   #----------------------------------------------------------------------
  2.   # ● 设置窗口外观的文件名
  3.   #     windowskin_name : 新的窗口外观文件名
  4.   #----------------------------------------------------------------------
  5.   def windowskin_name=(windowskin_name)
  6.     @windowskin_name = windowskin_name
  7.   end
复制代码
这个是用来修改皮肤名用的,
外部使用的话就是“$game_system.windowskin_name = x”
如果没有“def xxxxxx=(x)”
这个函数,那么外部是无法改写本类中的相对应的变量的。

妈呀……不知道能不能看懂……

点评

问题2没有解释到点上啊,不过还是很认真,辛苦!  发表于 2014-10-26 19:17

评分

参与人数 1星屑 +200 收起 理由
RyanBern + 200 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

4
发表于 2014-10-26 19:27:52 | 只看该作者
问题1,参考LS,self指代的永远是当前层面上的对象,这里指的就是Window_Base这个类的你正操作的对象。如果要更深层次理解self,可以看Taroxd的这个帖子:https://rpg.blue/forum.php?mod=v ... p;page=2#pid2516757
问题2,$game_system的@windowskin_name的作用是实时监测窗口皮肤的改变,如果窗口在显示的过程中皮肤被改变,RGSS能够做出相应。
RUBY 代码复制
  1. class Window_Base < Window
  2.    #--------------------------------------------------------------------------
  3.   # ● 刷新画面
  4.   #--------------------------------------------------------------------------
  5.   def update
  6.     super
  7.     # 如果窗口的外观被变更了、再设置
  8.     if $game_system.windowskin_name != @windowskin_name
  9.       @windowskin_name = $game_system.windowskin_name
  10.       self.windowskin = RPG::Cache.windowskin(@windowskin_name)
  11.     end
  12.   end
  13. end

这是Window_Base类的update方法,很少有人关注这个方法。它的作用就是把$game_system的windowskin_name和它自身的@windowskin_name比较,如果不一样了就更改。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
218 小时
注册时间
2013-12-17
帖子
386
5
发表于 2014-10-27 20:06:19 | 只看该作者
简单总结一下:
1-self是指当前这个窗口的实例。
2-windowskin_name变量是一个可空可有的变量。
如果你指定了他,那么就用他来当做窗口的皮肤。
如果你没有指定他,那么就用默认的窗口皮肤。
RM脚本定制/修改/整合 群:143356012(入群注明来意)
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-11 07:53

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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