2015-03-14 25 views
3

我一直在閱讀MVC,並一直試圖按照我的能力盡力去做,但有一件事情不斷涌現。在MVC中,View允許查看但不與模型交談?

視圖能看到模型對象嗎?

我目前的遊戲結構如下。

對象(模型)< - >場景(控制器)< - >精靈(查看)

目前我做到以下幾點。

場景創建MapObject(模型)。場景然後創建一個MapSpriteNode(視圖),但用MapObject初始化它。 MapSpriteNode需要繪製和使用信息來佈置其視圖和子視圖。現在MapSpriteNode可以保存對該MapObject的引用,但不允許改變MapObject。這樣,當在MapSpriteNode上調用更新時,它可以看到MapObject上的髒圖索引等事情,並且可以更新其相應的TileNodes。

所以,現在出現這種情況

雪碧被觸摸,並通知控制器 - >控制器報告交互模式 - >模型相應地更新,標誌着髒指標

更新循環發生

場景需要更新到 - > MapObject的(需要發生隨着時間的推移任何其他更新) 場景需要更新 - > MapSpriteNode(查看是否有骯髒的索引和更新) 場景需要清理髒 - > MapObject的(骯髒的指標,因爲去除渲染是d一個)

這是否仍然遵循MVC?

回答

4

「可以在視圖看到模型對象?」

是的,只要您不通過視圖更改任何內容,View就可以看到「內部」模型。

「這仍然是以下MVC?」

肯定。

在MVC體系結構中,模型應該獨立於控制器和視圖,並且在「被動」實現(您的情況)的情況下,View應該輪詢模型以獲取控制器通知的數據,而不是模型通知這樣做(您可以假設在這個「被動」情況下Model甚至不知道Controller和View存在)。通過控制器被通知當

查看應從型號查詢數據和發生這種情況時,場景調用更新MapSpriteNode,並查看也應通知有關雪碧時,被觸摸後通知控制器類似事件控制器。

至於控制器去,它應該通知查看更新就像當場景需要更新MapSpriteNode,並應通知模型進行更新。

+1

謝謝你的回答。這是我第一次聽說「被動」的實施。你有沒有一個好的聯繫,你覺得做一個很好的工作來澄清「被動」和非被動之間的區別?我也有關於MVC和具體SpriteKit另一個問題,如果有關MVC感興趣http://gamedev.stackexchange.com/questions/96662/do-features-of-spritekit-follow-mvc – 2015-03-18 23:25:29

+0

維基百科的文章解釋了它。當您將多個視圖和控制器綁定到單個模型時,通常會使用活動MVC。在這種情況下,在其中一個控制器更新模型後,所有視圖也必須更新。爲了做到這一點,Model必須通過Observer模式的使用來通知他們。 – 2015-03-25 11:55:44