本帖最后由 RyanBern 于 2016-4-9 08:37 编辑
在RGSS1中,refresh和update是两个常用的方法名称,它们出现在各个脚本当中。从字面含义上来看,refresh有“刷新”的含义,update则翻译成“更新”。似乎不是很好区分。但是,从他们所代表的方法上来看,二者表示的方法的本质是截然不同的,所以有必要做区分。很多脚本新手将需要写在update里的东西写在refresh,或者是反过来,这都是不熟悉RGSS1脚本约定导致的。
一般说来,update里面定义的方法,都是需要每一帧执行的方法。例如输入响应判断,窗口的光标闪烁,图片的位置等等。我们注意到这些语句都必须在每一帧执行,一个游戏必须时刻判断你的输入才能及时作出响应,必须连续更新窗口的光标才会有“闪烁”的效果。道理很简单,我们打开每一个Scene的脚本,都会看到如下的类似结构
loop do Graphics.update Input.update update # .... end
loop do
Graphics.update
Input.update
update
# ....
end
如果转到update的定义,我们仍然看到的是对众多对象调用update方法。虽然会出现极个别的refresh方法,但是这些特殊情况我们放在后面说。
而在refresh中的语句,一般不需要每帧都执行,他们只是在需要执行的时候才执行。换句话说,refresh的调用不是实时的,一般只有在需要它的时候才会调用一次。如果将一些refresh放在update下,那么游戏会出现明显的卡顿。
各个窗口的定义中,都会有一个refresh方法,这个方法用于描绘窗口的内容。描绘操作需要消耗大量的时间,所以refresh一般只在窗口生成的时候调用一次,在其他时刻一般不调用。
通俗地讲,update是时刻都在调用,refresh是需要才会调用。
因此,这样的一个问题就出现了:如果我想在地图界面上显示一个窗口,窗口的里面描绘某变量的数值。描绘语句应属于refresh,而根据原则,refresh不能实时调用。那么,如果这个变量突然变化,那么这个窗口岂不是无法更新了吗?如果不能直接将refresh放在update中去,那么应该如何设置才能有实时更新的效果,而又不用实时调用refresh呢?
这是一个很好的问题,很多脚本新手应当先学会它。
我们可以给窗口设计一个变量,来表示当前所显示的数字,然后在update方法中,将这个变量不断和游戏全局变量比对,如果发现不等就调用refresh更新窗口。这样,我们不用时刻调用refresh,只要在需要更新的时候调用就行了。总之一句话,update里面不要放置计算量大或者消耗资源的操作,而像这种变量比较之类的,放在update里面一点问题也没有。
下面就是一个简单的例子,请体会update和refresh结合的效果。
def update if @gold != $game_party.gold @gold = $game_party.gold refresh end end def refresh self.contents.clear self.contents.draw_text(4, 0, 64, 32, @gold.to_s) end
def update
if @gold != $game_party.gold
@gold = $game_party.gold
refresh
end
end
def refresh
self.contents.clear
self.contents.draw_text(4, 0, 64, 32, @gold.to_s)
end
|