Posted on 2008-11-08 23:52
劍孤寒 閱讀(572)
評論(0) 編輯 收藏 引用 所屬分類:
Galaxy2D 游戲引擎發(fā)布
最近依然很忙,項(xiàng)目太緊已經(jīng)很久沒寫東西了。今天難得得空,把以前寫的一個RPG代碼翻出來看了看,發(fā)現(xiàn)很多設(shè)計上的問題,所以準(zhǔn)備重寫了。這個游戲本來已接近完成,只要整合完各個系統(tǒng)就是一個完整的游戲了,現(xiàn)在推掉重寫老實(shí)說心里是很不愿意的,但我更不愿意把一個自己都不滿意的東西發(fā)出來,所以前思后想還是決定重寫了,還好自己的東西沒有項(xiàng)目壓力,有時間就弄弄
。
好了,閑話就不多說了,我在看代碼時首先注意到的一個問題是,Galaxy2D游戲引擎的GUI系統(tǒng)適用范圍太窄,以至于在這個RPG中又寫了一個GUI系統(tǒng),這是因?yàn)镚UI系統(tǒng)控件之間的聯(lián)系太“散”了,也沒有一個層的概念,所以在遇到比較復(fù)雜的需求時就沒法用了。Galaxy2D的GUI系統(tǒng)是參考HGE寫的,在HGE的GUI系統(tǒng)里,所有的控件都是平級的,所以當(dāng)要控制GUIManager里的所有控件的一個界面上的某些控件時就變得非常麻煩,雖然后來寫了一個Window控件來建立一個“層”的關(guān)系,但后來發(fā)現(xiàn)還是不好用,而且由于很多功能與GUIManager相似,導(dǎo)致產(chǎn)生了大量的冗余代碼。另外,由于以前的GUI沒有消息路由機(jī)制,所以當(dāng)一個消息傳到一個最末端的控件上時就“死”掉了,根本沒機(jī)會再通知其他可以處理它的控件,這也使一些像某個控件被點(diǎn)擊后將另一個控件高亮等操作要實(shí)行硬編碼了,如果那一天那個控件改了名字或ID,這邊的代碼也要跟著改。以上這兩點(diǎn)都違背了設(shè)計模式里的“開放-封閉”原則,這樣的代碼是非常不好維護(hù)的,所以準(zhǔn)備做如下修改:
首先,把GUIManager中控件List的管理移到Window控件里去,GUIManager只負(fù)責(zé)把各種事件消息傳到頂層Window控件,而不再管理和維護(hù)控件列表,Window控件上可掛其他控件或再掛個Window控件。這樣就把層的關(guān)系建立起來了,而且GUIManager和Window控件的職責(zé)也清楚了,不會再有代碼冗余,以后如果還要再添功能也只要改Window控件就行了,GUIManager不用做修改。
其次,給Window控件添加消息路由機(jī)制,該機(jī)制分兩種模式:Send和Post。Send為立即模式,Post為緩存模式,消息將在下一幀中處理。消息傳遞路徑為:自身子控件->同級控件的子控件->同級控件->父控件。這樣如果一個控件被點(diǎn)擊了,要高亮另一控件,只要發(fā)送一個消息即可,響應(yīng)控件在接到消息后把自己高亮起來就可以了。