轉載自: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行就不詳細說了, 好了,今天要學的就到這裡了~