2012年12月14日 星期五

自製小遊戲引擎

距離上次的踩大便Online後,也有一段時間了。這段時間因為工作的關係,大量接觸到JAVA的GUI開發,也就順便開始進行相關的研究跟學習。
這一個月左右的成果,大概就是這個陽春的"自製遊戲引擎"了吧。
DropBox
ShootingWorld.zip為包含原始檔的整個專案壓縮檔
ShootingWorldJar.zip則是只有包含一個可執行的範例遊戲與所需要用到的資源

↑很陽春的範例遊戲畫面

大概說明一下整個遊戲引擎的架構。



首先從流程上來說,跟之前提過的流程大致相同。遊戲基本上只有單一Thread(音樂除外),此Thread作的事情很單純,更新整個遊戲中所有物件"下一個時間切點"的狀態,然後繪製整個畫面,之後再運算所有物件下一個時間切點的狀態、繪圖、運算狀態、繪圖....如此不斷循環。
不過與之前不同的是,這邊的繪圖使用的是Java awt中的Canvas物件,所以整個遊戲引擎開發出來的東西會呈現在一個Component中,也就可以比較簡單的跟Java的GUI做結合。另外就是,套用從某個網站偷來的概念(原諒我忘了來源網站網址),整個流程從原本的"更新+繪圖",延伸成為"更新+繪圖+等待"。在這種三段式的過程中,先定義了整個遊戲的更新頻率,例如在這個陽春版引擎中預設為0.015秒更新一次,也就是每秒約更新66次(FPS)。在每次循環的一開始,先記錄目前的系統時間,然後先更新下一個時間切點的所有物件狀態,只是此時更新的時間區間固定為所定義的遊戲更新週期(也就是預設的0.015秒),更新後進行繪圖。這些手續都完成後,再一次取得系統時間,並配合此次循環開始時取的的系統時間運算出"更新"與"繪圖"所消耗的時間,然後再藉由已定義的遊戲週期運算出"可以等待的時間",根據這個時間讓Thread進行等待(sleep),休息結束後把剛剛繪製好的畫面顯示出來,就可以再進入下一個循環。
舉例來說,如果某次循環的更新與繪圖花費了0.003秒,則這個循環中就可以等待0.015-0.003=0.012秒。這樣的方式,可以減少一些不必要的運算,如果採用原本的方式,單次循環的更新與繪圖花費0.003秒時,Thread會馬上進入下一個循環,計算0.003秒後的遊戲世界,相對於現在固定每次時間切點間隔時間的做法來說,有點暴力過度了。以現實生活的殘忍例子來說的話,現在的方法就像一個有固定上班工作的上班族,每天準時上班,每天都有一定數量的工作,每天做完這些工作後就可以打混睡覺,每天固定時間下班,並交出今天預訂的工作成果。而舊有的方法則是沒日沒夜的工作,一份工作完成後就直接上繳,然後毫無時差的被賦予下一份工作,於情於理都不太想再繼續延用原本的方式了。

概念性的流程大概就是這樣,架構的設計留到下一篇再寫吧。

沒有留言 :

張貼留言