大概三個月前,我在試著用幾款2D遊戲引擎。
第一款是SDL,這是同事推薦給我的一款跨平台的2D遊戲引擎。這款引擎評價很高,總的來說是因為它夠底層,實現的功能非常基本,又提供了一套平台無關的介面。所以開發人員在此之上可以天馬行空的開發。不過我不是那麼熱衷底層……於是我在寫了幾個實驗性的程式之後放棄了他。呵呵,當時研究它主要是因為自己也在做嵌入式,對跨平台高度興趣。但是當時看一個老外,好像叫lazyfoo,寫的開發教程讓我學到了很多遊戲開發方面基本的知識。
然後第二款是HGE,它是基於driectX的一款開源2D遊戲引擎,也是提供較底層的功能。最核心的大概是它提供基於幀的邏輯和渲染回調,開發人員來實現每幀進行的操作。HGE還提供了一套我覺得非常不好的教程,對於新手是絕對的誤導——它的教程裡的代碼都亂七八糟,感覺就像個C++新手寫的代碼一樣,各種全域變數,各種魔數,各種亂命名,可讀性和架構性都較差。(可能也是HGE的開發人員為了求簡,不過我覺得這個教程可以做的更好。)
這時,我自己做的一套簡單的遊戲,已經簡單的設計好UI介面。於是我用HGE來實現這套介面。
我覺得HGE很噁心的地方就是它基於每幀的回調(當然你可以修改HGE核心來去除這一點,不過將帶來更多麻煩,因為HGE很多函數就是基於幀回調機制的。)所以你不能像使用一個Canvas一樣來進行即時繪製。於是我在遊戲裡自己實現了一套訊息機制,把整個HGE架構跑在另一個線程中,遊戲資料核心線程通過發訊息的方式去通知介面更新,或者擷取玩家操作。
這是當時自己弄的設計,DirectX or Ddraw改成HGE,後來自己也實現了。
剛開始的時候感覺還好,後來代碼稍微上規模的話,就覺得很吃力了。因為我是基於具體遊戲功能來封裝HGE的介面。在之後又重構了幾次,整體架構還算清晰,但是介面和代碼之間的耦合度實在太大。最後可以實現一定的介面功能,但是還是太不爽了,所以決定放棄使用HGE。在此總結一下自己的想法,如果要用HGE真正開發一款稍微上規模的遊戲,應該怎麼做,可能也有很多不正確的地方,歡迎指正。
1. 實現頁面棧、控制項樹
我也不知道該怎麼定義這個名稱,姑且叫它頁面棧和控制項樹吧,其實就類似於WINDOWS的視窗系統,建立起樹狀結構的控制項系統。對於每一個頁面記錄各種狀態如焦點控制項等。並通過棧維護各頁面的層次關係。可以從設定檔或者頁面指令碼載入頁面。比如遊戲中的主角屬性頁面、裝備頁面等,架構都是一定的,使用的一些圖片資源什麼的也是一定的,應該寫成設定檔,直接從檔案讀入。
2. 在頁面樹的基礎上實現訊息路由
訊息的路由機制必須實現。
3. 建立資源管理員及組態管理員
專門的資源管理員用來載入和卸載各種圖片、特效、音樂資源。同理組態管理員,管理整個HGE的配置。
4. 定義介面檔案格式並使用介面檔案產生具體畫面,同時配套開發介面編輯器
如使用XML來定義具體介面,介面編輯器產生XML。
在1,2,3,4條滿足的情況下,再進行具體遊戲功能性的介面開發。甚至應該把1,2,3,4這部分抽成 引擎無關、平台無關的中介層,向下提供移植介面,用HGE來port。—— 那麼整個遊戲介面部分以上應該是高度可移植的。
HGE 的 gui 工具是個好東西,特別是裡面的 hgeGUIObject,要多用。說個要注意的點,官網上面貌似都沒給詳細說明……
hgeGUIObject 的 rect 成員是該控制項的操作響應範圍——不是顯示的。讓一個控制項disable只要rect.Set(0,0,0,0)就行了。注意有時控制項莫名其妙的不響應滑鼠操作了,也可能是這個衝突導致的。這問題曾經讓我崩潰的調了半天。。。
總結一下。
HGE完全開源、基於directX,功能較為基礎。我覺得很適合個人學習和開發小型遊戲,但是如果要做稍微大型的遊戲的話,必須將整個UI的調度機制設計、封裝好(我覺得這個工作量挺大),然後整以相關的開發工具。
OK,HGE就告一段落。