目前共有2篇帖子。 內容轉換:不轉換▼
 
點擊 回復
391 1
【教程】跟我从头学脚本(十二)
高級弟子 五級
1樓 發表于:2011-2-10 23:45

转载自: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行就不详细说了, 好了,今天要学的就到这里了~ 
高級弟子 五級
2樓 發表于:2011-2-10 23:45

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:391 回複數:1
評論數: ?
作者: 蓝晶の骑士
最後回復:蓝晶の骑士
最後回復時間:2011-2-10 23:45
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。