高級弟子 五級 |
转载自: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行就不详细说了, 好了,今天要学的就到这里了~
|