正在開發2D遊戲,我希望將遊戲引擎從圖形中分離出來。我決定用以下方式使用模型視圖模式:遊戲引擎擁有實現接口(敵人,子彈,爆炸)的遊戲實體(EnemyModel,BulletModel,ExplosionModel)。基於混合組件的設計和模型視圖( - 控制器)模式
視圖在創建實體時接收事件,獲取指向界面的指針:以這種方式,View只能使用界面方法(即詢問信息來執行繪圖),並且不能更改對象狀態。視圖有它的onw類(EnemyView,BulletView,ExplosionView),它擁有指向接口的指針。 (還有一個涉及事件的模式,以便模型可以通知視圖關於實體的變化,因爲純粹的查詢方法是不穩定的,但我不會在這裏討論它)。 *模型類使用編譯時組件方法:它們使用boost :: fusion庫來存儲不同的狀態組件,如PositionComponent,HealthComponent等等。
目前,視圖並不知道基於組件的設計,而只知道模型視圖部分:爲了獲得敵人的位置,它調用Enemy :: get_xy()方法。實現接口的EnemyModel將此調用轉發給PositionComponent並返回結果。
由於子彈也有位置,我也必須將get_xy方法添加到Bullet中。 BulletModel然後使用與EnemyModel類相同的實現(即它轉發呼叫)。
這種認識會導致有很多重複的代碼:接口有很多類似的方法和*模型類充滿了前向方法。
所以我基本上有兩種選擇:
1)暴露的成分,它爲基礎的設計,使每個組件都有一個接口,以及:查看可以使用此接口直接查詢組件。它保持視圖和模型分離,只在組件級別而不是實體級別。
2)放棄模型視圖部分,進行純基於組件的設計:View只是一個組件(RenderableComponent部分),它基本上完全訪問遊戲引擎。
根據你的經驗,哪種方法最好?
HMVC實際上只是一些想要使用繼承來分享大量代碼而不必重寫或複製粘貼的人組成的廢話。否則,我同意你對基於實體的系統非常適合遊戲的評論。遊戲需要處理中斷,例如UnRealScript中提供的功能,它允許程序員說出「每隔2個真實世界秒鐘做這個」類中斷。對於中斷的正式處理,請閱讀Graham Hutton's所有這些中斷的含義是什麼? (對於Haskell)。 – user429921 2010-11-10 20:12:06
如果HMVC只能減少重複的代碼,它已經很好了。以我的觀點來看,只有組件(或者可以在沒有進一步工作的情況下可以在UI中放置的組件)表現出色。嚴格的HMVC(僅通過控制器傳遞)與擁有多個MVC項目非常相似。 – Wernight 2010-11-12 16:15:59
我認爲這只是一個代表你的技術誤解的問題。原始HMVC描述不使用僅通過控制器傳遞。 HMVC和PAC之間的主要區別在於,您只能通過控制器傳遞PAC,並且視圖和模型不能直接相互交談。我還認爲,在說HMVC「就像擁有多個MVC項目」一樣,這在概念上是錯誤的,因爲重複使用領域知識不能免費。真實世界的系統不能免費組合,並且可能存在死鎖,活鎖,服務中斷干擾實時規格等。 – user429921 2010-11-12 18:06:21