2012-07-14 82 views
7

我正在使用MVC模式在Java中製作2D遊戲,並且在閱讀和搜索我的屁股後,我還沒有找到令人滿意的answear來處理對象的圖形表示。如何處理MVC 2D遊戲中對象的圖形表示?

我是否應該將每個對象(例如Player)分成PlayerModel(存儲在模型中)和PlayerView(存儲在視圖中)?

這似乎有點亂,因此我將不得不跟蹤哪個圖形表示對象,即「ScaryMonsterEnemyView」連接到哪個邏輯表示對象,「ScaryMonsterEnemyModel」。根據MVC,這真的是我應該怎麼做的嗎?如果是這樣,該連接應該存儲在哪裏?在視圖中?

我知道這可能是一個愚蠢的問題卡住,但我想從一開始就儘可能多地獲得。感謝您的幫助:)

+1

也許你會發現[這篇文章](http://www.gamasutra.com/view/feature/130693/the_guerrilla_guide_to_game_code.php)有幫助..如果你還沒有讀過它。 – 2012-07-14 15:04:37

+0

@tereško所以基本上ScaryMonsterEnemyView將持有ScaryMonsterEnemyModel?這可能是有道理的,我猜... MVC中的 – tobes 2012-07-14 15:23:08

+0

視圖不支持模型。該視圖僅接收來自模型圖層的數據。它要麼從模型層(經典MVC)發送,要麼通過視圖(Model2 MVC)請求。 – 2012-07-14 17:25:25

回答

4

如果我沒有弄錯,你基本上是問如何將遊戲分成模型 - 視圖 - 控制器範例。

簡而言之,模型就是您遊戲的狀態。在O-O術語中,您可以將模型看作遊戲中的所有對象。

控制器是在每個更新週期中應用於遊戲狀態(在本例中爲所有遊戲對象)的一組規則。這可以在所有對象中實現爲一個名爲update()的方法,也可以是在您的遊戲循環中調用的函數,系統地遍歷所有需要更新的對象,並更新它們。你也可以把Controller當作遊戲循環本身。它會調用一切來更新,然後在屏幕上繪製並重復,除非滿足一些條件,否則它會告訴程序執行其他操作。這樣,你幾乎有兩個嵌套的MVC結構。一個通過菜單等來控制程序的流動,另一個專用於遊戲本身。

視圖只是您的遊戲的圖形表示。這可以像屏幕上的文本一樣簡單,但在您的情況下,它是2D圖形。爲了實現這一點,你可以讓每個對象都直接包含圖形狀態,或者封裝。視圖只會查詢所有對象的圖形狀態,然後將其分流到屏幕上。再次,這可以在每個對象的基礎上實現,比如稱爲draw()的方法,或者直接從遊戲循環中調用的另一個系統函數。通常的做法是創建一個名爲'Sptite'或類似的東西來保存圖形信息,並且讓每個繪製的遊戲對象都有一個個人實例。還要注意,視圖本身不需要是一個對象。儘管有時需要存儲直接影響視圖操作的信息(如窗口大小),但在這種情況下,視圖可以是一個對象,僅僅在遊戲循環中調用的函數就足夠了。控制器也是如此。

另外請記住,這些分割可以進一步分割,使生活更簡單。例如:控制器可以分爲AI處理,動作更新和碰撞檢查。視圖可以分爲遊戲對象顯示和HUD,而模型可以是所有對象+獨立於遊戲對象的所有狀態(如分辨率,窗口大小,按鍵配置等遊戲設置)。

我知道這可能有點矯枉過正,它可能有額外的信息,但希望它能回答你的問題,並給你從何處開始的想法。

1

模型和視圖是對象的兩個集合/類別/域。

控制器提供了一組接口來對模型對象執行一些功能。如果需要,視圖可以直接與模型對象討論有關其狀態信息。

傳統上,視圖域對應於圖形用戶界面,其中包含按鈕,窗體,Windows等概念。在桌面環境中。

您的視圖域(或其中之一)將對應於您將構建的3D環境。 (樹木,房屋,人等)。 這包括碰撞細節和你的物理。這兩者都需要與您的3D環境有關的幾何圖形。

在遊戲中,這些對象中的任何一個都必須與另一個域中的對象進行協作可能非常罕見。但舉個例子,考慮一下電話。該對象將存在於您的3D環境中,但也將與描述「半通話」,「頻道」,「開關」等的另一個域進行協作。這些對象不屬於您的視圖域,而是屬於單獨的模型域。

一個更相關的例子可能是某種類型的評分系統,例如屬於模型域的RPG統計。