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

Project1

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

[已经解决] 关于refresh的用法…

[复制链接]

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21626
在线时间
9413 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

跳转到指定楼层
1
发表于 2013-9-23 22:12:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 喵呜喵5 于 2013-9-25 09:28 编辑

看到脚本教程中说refresh要调用大量资源所以原则上是需要时才refresh,那么这个refresh方法和其他方法相比有特殊的地方吗?我用其他方法而不用refresh会有区别吗?
另外,哪些命令应该由refresh处理呢?还是直接无脑的把只需执行一次的命令全扔refresh里就好了?

Lv1.梦旅人

梦石
0
星屑
80
在线时间
40 小时
注册时间
2012-7-3
帖子
98
2
发表于 2013-9-23 23:12:05 | 只看该作者
refresh无非就是一个方法,你调用它或者不调用它,它都在那里。
教程中说的是一个需要调用大量资源的方法并不是特指名字叫做refresh的。
refresh一般用来处理图像,可以理解为重画。这也是和update的区别。
举个栗子{:2_257:}
  1. #encoding:utf-8
  2. #==============================================================================
  3. # ■ Window_Help
  4. #------------------------------------------------------------------------------
  5. #  显示特技和物品等的说明、以及角色状态的窗口
  6. #==============================================================================

  7. class Window_Help < Window_Base
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对象
  10.   #--------------------------------------------------------------------------
  11.   def initialize(line_number = 2)
  12.     super(0, 0, Graphics.width, fitting_height(line_number))
  13.   end
  14.   #--------------------------------------------------------------------------
  15.   # ● 设置内容
  16.   #--------------------------------------------------------------------------
  17.   def set_text(text)
  18.     if text != @text
  19.       @text = text
  20.       refresh
  21.     end
  22.   end
  23.   #--------------------------------------------------------------------------
  24.   # ● 清除
  25.   #--------------------------------------------------------------------------
  26.   def clear
  27.     set_text("")
  28.   end
  29.   #--------------------------------------------------------------------------
  30.   # ● 设置物品
  31.   #     item : 技能、物品等
  32.   #--------------------------------------------------------------------------
  33.   def set_item(item)
  34.     set_text(item ? item.description : "")
  35.   end
  36.   #--------------------------------------------------------------------------
  37.   # ● 刷新
  38.   #--------------------------------------------------------------------------
  39.   def refresh
  40.     contents.clear
  41.     draw_text_ex(4, 0, @text)
  42.   end
  43. end
复制代码
这个是VA的Window_Help
来看看他是怎么使用 refresh的

{:2_253:}首先看 refresh里到底有什么
  1. def refresh                                 
  2.     contents.clear                       #内容清空
  3.     draw_text_ex(4, 0, @text)   #写字
  4.   end
复制代码
啊,很简单的两句,写的是重绘这个Help窗口。先清空,然后画上文字。
在这里可以看出refresh 的常规用法:重绘窗口内容

{:2_253:}其次来看 哪里调用了refresh这个方法
  1.   #--------------------------------------------------------------------------
  2.   # ● 设置内容
  3.   #--------------------------------------------------------------------------
  4.   def set_text(text)
  5.     if text != @text
  6.       @text = text
  7.       refresh
  8.     end
  9.   end
复制代码
在这,设置内容。如果内容和上一次的内容差异,那么调用 refresh来重画窗口=>更新一下文字内容。
例如物品窗口,每一次更改物品指针,都会调用帮助窗口的 set_text来更新一下内容。
由此可见,refresh不是窗口创建完了就没事了,当窗口需要更新重画的时候,还要调用它。

{:2_251:}废话完毕,现在开始逐条回答楼主问题:
Q:这个refresh方法和其他方法相比有特殊的地方吗?我用其他方法而不用refresh会有区别吗?
A:无,至少我认为没有区别,他们都是方法,无非就是名字问题,可能大部分人都习惯遵循使用refresh方法而不是再去定义一个莫名其妙的方法
     虽然他们的功能或许一样。
Q:哪些命令应该由refresh处理呢?
A:重绘窗口内容

免责声明:这个帖子是本人稀里糊涂路过时所留,本人脚本为自学,没有接受过系统培训,如果有纰漏或错误之处还望各位大神大触及时指出纠正,以免误人子弟。


点评

感谢帮助,就是说Refresh完全是个可以用其他方法替换的方法对吧  发表于 2013-9-25 09:29

评分

参与人数 2星屑 +52 收起 理由
DeathKing + 28 我确实应该说清楚一点。
喵呜喵5 + 24 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21626
在线时间
9413 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

3
 楼主| 发表于 2013-9-23 23:50:29 | 只看该作者
a774741359 发表于 2013-9-23 23:12
refresh无非就是一个方法,你调用它或者不调用它,它都在那里。
教程中说的是一个需要调用大量资源的方法并 ...

就是说refresh只是个普通的独立的方法名,不像update那样在scene_base中有专门的一句负责把scene中所有窗口都update一遍的语句在调用对吧?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

唯一的信徒

梦石
0
星屑
1665
在线时间
1357 小时
注册时间
2013-1-29
帖子
1637
4
发表于 2013-9-24 06:44:29 | 只看该作者
一般来讲refresh就是那种需要绘制图像绘制文字用的方法
放在update里面效率太伤
所以当需要绘制的文字或者图片有变化时才会重新调用

点评

感谢帮助,就是说Refresh完全是个可以用其他方法替换的方法对吧  发表于 2013-9-25 09:30

评分

参与人数 1星屑 +24 收起 理由
喵呜喵5 + 24 认可答案

查看全部评分

『我只是一个正在潜心修炼的渣乐师罢了』
Dear Time\(^o^)/~


假如上面的图片挂了的话麻烦各位去发个帖 @ 一下 orzFly 让他修复 deartime
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
79 小时
注册时间
2007-6-23
帖子
154
5
发表于 2013-9-24 09:44:26 | 只看该作者
refresh等于把窗口内的所有内容都重新绘制一把,所以每帧都调用肯定会增加负荷
一般情况下也并不需要每帧都去重绘

点评

对,refresh可以用其他方法替换,refresh也像update之类一样,只是一个约定好的名字,内部实现完全可以自己来写  发表于 2013-9-25 10:07
感谢帮助,就是说Refresh完全是个可以用其他方法替换的方法对吧  发表于 2013-9-25 09:30

评分

参与人数 1星屑 +24 收起 理由
喵呜喵5 + 24 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

八宝粥的基叔

梦石
0
星屑
4684
在线时间
5240 小时
注册时间
2009-4-29
帖子
14318

贵宾

6
发表于 2013-9-24 13:04:35 | 只看该作者
你执行商店场景,有个金钱窗口。当你购物之后,金钱会变化,但是如果不执行金钱窗口的refresh,金钱窗口的内容是不变的,纵使你的金钱已经变化了。这时你就是在需要重绘金钱窗口时执行了refresh。
当然,你在update里执行refresh也没错,这就会时时刻刻都重绘金钱,但是这样会很耗资源,不推荐这样做。
总之,我们只需要在窗口内容变化时执行refresh。

点评

感谢帮助,就是说Refresh完全是个可以用其他方法替换的方法对吧  发表于 2013-9-25 09:31

评分

参与人数 1星屑 +24 收起 理由
喵呜喵5 + 24 认可答案

查看全部评分

《逝去的回忆3:四叶草之梦》真情发布,欢迎点击图片下载试玩喵。

《逝去的回忆3》的讨论群:
一群:192885514
二群:200460747
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
275
在线时间
1373 小时
注册时间
2005-10-16
帖子
5113

贵宾

7
发表于 2013-9-24 18:15:12 | 只看该作者
[ 本帖最后由 亿万星辰 于 2013-9-24 18:17 编辑 ]\n\n[ 本帖最后由 亿万星辰 于 2013-9-24 18:17 编辑 ]\n\n一般情况下是这样,update里的算法决定是否来refresh

另外update对于有选择项的窗口还会有更新选择项光标移动的作用
比如一个窗口里面有3个选项,分别为选项1、选项2、选项3,当你用方向键移动光标时,需要用update来更新光标,但当你要把“选项3”改为“选项4”时,就需要refresh

另外,还是说金钱窗口,比如@gold_window是金钱窗口的一个实例,你可以一直执行@gold_window.update,但在update方法里,你可以写出诸如判断是否有必要进行刷新这样的操作。
当然,这不是必须的要求,只是举例而已。
super
if $game_party.gold != @gold
  @gold= $game_party.gold
  refresh
end  

点评

感谢帮助,就是说Refresh完全是个可以用其他方法替换的方法对吧  发表于 2013-9-25 09:32

评分

参与人数 1星屑 +24 收起 理由
喵呜喵5 + 24 认可答案

查看全部评分

我只个搬答案的
叔叔我已经当爹了~
婚后闪人了……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
65 小时
注册时间
2012-10-18
帖子
22
8
发表于 2013-9-24 23:54:51 | 只看该作者
喵呜喵5 发表于 2013-9-23 23:50
就是说refresh只是个普通的独立的方法名,不像update那样在scene_base中有专门的一句负责把scene中所有窗 ...

尾随喵呜而来,涨了不少姿势{:2_259:}
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
80
在线时间
40 小时
注册时间
2012-7-3
帖子
98
9
发表于 2013-9-25 13:38:13 | 只看该作者
fangyc 发表于 2013-9-24 09:44
refresh等于把窗口内的所有内容都重新绘制一把,所以每帧都调用肯定会增加负荷
一般情况下也并不需要每帧都 ...

VA的Scene_Base里是这么定义的
场景Update时,调用该场景内的所有窗口的Update函数。
由此可见,一般Update是不应该更换其他名字的。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
79 小时
注册时间
2007-6-23
帖子
154
10
发表于 2013-9-25 15:50:19 | 只看该作者
a774741359 发表于 2013-9-25 13:38
VA的Scene_Base里是这么定义的
场景Update时,调用该场景内的所有窗口的Update函数。
由此可见,一般Upda ...

嗯,不过自定义的类非要改也可以改,但用约定好的名字风格比较统一,也更容易理解。
因为RGSS内建类(Sprite,Window等)也有定义update这样的方法,所以自定义的类也跟它统一比较好吧。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-15 16:01

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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