转载自:www.66rpg.com
原作者:Dubealex
Near Fantastica(特别讲)
主讲人(翻译):frantice
电子书制作:小湖
第十二讲: Scene和Window 专题二
我们讲到哪了?嗯嗯,我们已经建立了一个空空的窗口,现在需要再加入三个新的窗口.
窗口1
第一个窗口应该是在顶端,显示游戏时间,金钱和地图ID.(见示意图)这个窗口是最简单的.我们在脚本编辑器里把三个显示的scene都放在一页便于修改.但是作为教程,我们还是各自建立一个窗口比较好.所以呢,我们先插入新的空脚本,名字就叫Window_1
(牢记: 我们必须在超级类的下面插入自己的脚本- 这就是为什么我们一直要把脚本插在紧贴MAIN前的原因.)
脚本:
class Window_1 < Window_Base
#BLOCK 1
def initialize
super(0, 0, 640,100)
self.contents = Bitmap.new(width-32, height-32)
self.contents.font.name = "黑体"
self.contents.font.size = 20
refresh
end
#BLOCK 2
def refresh
self.contents.clear
self.contents.font.color = text_color(6)
self.contents.draw_text(0, 0, 100, 32, "游戏时间:")
#显示游戏时间 (从 Window_PlayTime中Copy来)
@total_sec = Graphics.frame_count / Graphics.frame_rate
hour = @total_sec / 60 / 60
min = @total_sec / 60 % 60
sec = @total_sec % 60
text = sprintf("%02d:%02d:%02d", hour, min, sec)
self.contents.font.color = normal_color
self.contents.draw_text(100, 0, 120, 32, text)
# 结束显示游戏时间的编码
#BLOCK 3
self.contents.font.color = text_color(6)
self.contents.draw_text(250, 0, 50, 32, "金钱:")
self.contents.font.color = text_color(0)
self.contents.draw_text(305, 0, 100, 32, $game_party.gold.to_s)
#BLOCK 4
self.contents.font.color = text_color(6)
self.contents.draw_text(400, 0, 100, 32, "地图 ID:")
self.contents.font.color = text_color(0)
self.contents.draw_text(480, 0, 100, 32, $game_map.map_id.to_s)
end
#BLOCK 5
def update
if Graphics.frame_count / Graphics.frame_rate != @total_sec
refresh
end
end
end
为了便于教学,我分开了5个 blocks, 这样一行一行讲下来:^0^
BLOCK 1:
1 def initialize
2 super(0, 0, 640,100)
3 self.contents = Bitmap.new(width-32, height-32)
4 self.contents.font.name = "黑体"
5 self.contents.font.size =20
6 refresh
7 end
很熟悉吧,对,就是我们上一讲里学过的.不过多了一个refresh, 也就是刷新. 当然了, 单单一个refresh 是不行的, 还没定义过呢~!
BLOCK 2:
1 def refresh
2 self.contents.clear
3 self.contents.font.color = text_color(6)
4 self.contents.draw_text(0, 0, 100, 32, "游戏时间:")
5 #显示游戏时间 (从 Window_PlayTime里copy而来)
6 @total_sec = Graphics.frame_count / Graphics.frame_rate
7 hour = @total_sec / 60 / 60
8 min = @total_sec / 60 % 60
9 sec = @total_sec % 60
10 text = sprintf("%02d:%02d:%02d", hour, min, sec)
11 self.contents.font.color = normal_color
12 self.contents.draw_text(100, 0, 120, 32, text)
13 #结束编写显示游戏时间
1-2行 我们上面说了refresh还没定义过, 所以这里就给它定义了. 它都干些什么呢?我们看到,第一件事情就是把窗口的内容给清空了,那为什么我们要先把它给清空呢?..那是因为我们要在后面的scene里对这个的窗口的内容进行刷新来显示游戏时间, 我们不需要这个文章显示一遍又一遍,所以把它清理干净会比较清爽^0^ .
3-4行 他们是显示”游戏时间”这4个字的,上一课也讲过. 那么self.contents.font.color = text_color(6) 是干什么的?它是描绘文章的字体颜色的..括号里的数字6显示的颜色是在Window_Base (父类) 中定义的.
6行 这里创建了一个新变量叫@total_sec, 并让它的值等于游戏的时间.怎么计算的呢?我们应该知道FPS吧, 它是frame per seconds的缩写, 意思就是每秒的桢数.游戏时间就等于总共的桢数/每秒的桢数.比如说
- 游戏已运行了12450 桢
- 游戏的 FPS (每秒的桢数) 是 30.
- 那么12450/30=415 --> 415 秒就是游戏时间.
7行 知道总秒数了,可是总不能就那么当游戏时间让人看吧=.=, 还得转换为几小时几分几秒.这行就是计算小时的.RMXP是没有小数的,所以当不满1小时的时候就为0
8行 看到这里大家会不解了, “ % “是什么东西?? 为了方便起见,我们就把它理解为余数,比如说17%3, 答案应该是2, 60/60=1, 那么60%60=0. (415 / 60) % 60 = 6.916 --> 6 分 (RMXP中不显示小数)
10 行 又是一个难懂的表达, sprintf("%02d:%02d:%02d", hour, min, sec) .首先要解释什么是sprintf, Ruby 的 sprintf 格式与 C 语言的 sprintf(3) 基本相同. 但还是有些差别, 比如它没有如 short 或 long 等针对 C 特有类型的修饰符, 它包含 2 进制数的指示符, 它不支持 sprintf 的方言式的语法. 这是引用RMXP帮助的说法, 那里解释得比较详细. 我这里就用图来说明吧~如果不懂没关系的, 我们只要知道是什么东西就知道了^0^
11行和12行就不详细说了, 好了,今天要学的就到这里了~