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