轉自:http://www.cnblogs.com/andyque/archive/2012/03/18/2390111.html
今天我們討論的主題是Model-View-Controller (MVC)設計模式,以及如何在cocos2d裏面實現它。來自波蘭的Bartek Wilczyński寫了一系列的文章來介紹這個模式,同時說明了爲什麼要使用mvc,以及如何在cocos2d裏面使用mvc。
這個波蘭人寫的文章已經被我全部翻譯過來了,請點擊傳送門查看。
當我在讀他寫的這些文章的時候,我記得Jeremy Flores在github上面有一個cocos2d裏面實現mvc的版本庫。他把它取名爲Cocos2D-MNC,全名是Model-Node-Controller。並且代碼是開源的,MIT許可。
這個MVC模式和遊戲實體組件系統差不多,我在這篇文章裏面就有介紹過了。對於這兩個系統來說,它的思想都是統一的,那就是不要繼承CCSprite並把遊戲logic全部塞到sprite裏面去。CCSprite應該只負責渲染顯示。而且有時候,你可能需要創建很多sprite,我們最好是創建一個CCNode類,然後裏面聚合許多sprites。這樣CCNode成爲了Controller,控制view。當view(比如sprite,effect,gL drawings等等)在屏幕上面移動的時候,controller結點會輪詢所有它包含的結點來查詢一些遊戲相關的狀態信息,並且做一些遊戲邏輯,然後反過來再更新view。
對於小遊戲來說,mvc模式確實可以運行地很好。它比起直接繼承CCSprite,並把一大堆處理邏輯放到CCSprite裏面要強多了。如果你發現,你還是不停地繼承ccsprite,然後把一大堆處理邏輯塞到一個ccsprite的子類裏面,那麼你就應該考慮一下mvc設計模式了。
當我們在cocos2d論壇裏面提到“是否繼承CCSprite還是使用一些model類來構建你的遊戲對象結構?”這樣的問題的時候,我還是要再強調一點,多用組合,少用繼承!如果一味地使用繼承,那麼當遊戲世界裏面的對象種類變多,功能變複雜以後,會導致整個繼承樹“頭重腳輕”,嚴重破壞了良好的面向對象設計原則---我們設計的類層次結構應該是扁平結構的,而不是一個頭很大的樹。
那麼,我們需要使用怎樣的架構來處理遊戲裏面的對象呢?答案就是使用組合。現在已經有一些非常好的引擎,比如TorqueX、PushButton Engine、Unity3D等,它們都是基於組合的實體組件系統。
你可以從PushButton的文檔裏面得到有關實體組件系統的介紹。同時,可以讀一讀《Components in TorqueX and what the differences are to XNA Game Components》這篇文章來加深對實體組件系統的理解。
你還可以從維基百科上獲得更多的信息。實際上,objc語言本身就是被設計爲一種可重用的軟件組件。
Scott Bilas在2002的GDC大會上提出了一種基於數據驅動的遊戲對象系統,同時Dungeon Siege使用了這個新理念,它指出了爲什麼繼承對於遊戲開發者來說非常不好,還說明了基於對象組合的組件系統的優點。事實上,在2002年,我開始與SpellForce一起工作的時候,我們已經有一個組件系統了,我們把它叫做Aspects、Abilities和Spells。它可以幫助我們把所有的遊戲數據都存儲到數據庫裏面,程序員只需要寫一些泛型代碼來統一處理這些數據就行了。
在2009年的GDC大會上面,Radical Entertainment’s Marcin Chady也做了一個類似的ppt,大家可以點此查看。
Mick West還寫了一篇文章,《重構遊戲實體爲遊戲組件》,在這篇文章裏面,它很好地描述了,爲什麼要更改以前的繼承模型,轉而投向組件系統的懷抱。
還有一些更高級的讀物,比如一些paper《Dynamic Game Object Component System for Mutable Behavior Characters》 ,它基於finite state machines討論了組件系統,而且引入了基於規則的NPC行爲系統。
在Game Architect 博客裏面把它稱之爲Anatomy of Despair,並且指出了基於繼承的類設計的一些缺點,同時展示了使用組合如何來解決這些問題。
後記:《如何在cocos2d裏面實現mvc》這一系統的文章到此就全部結束了,非常感謝大家的耐心閱讀。mvc在cocoa開發中被廣泛使用,幾乎沒有哪一個ios開發者不知道mvc。但是,mvc不是銀彈,沒有銀彈!我個人覺得基於組件的實體系統和fsm更適合現在遊戲架構。由於本人水平和經驗有限,故只能翻譯這麼多。這篇博文提到了其它許多沒有翻譯過的文章,建議大家都讀一讀。我也不打算翻譯了。有興趣的同學可以翻譯出來,爲開發者社區貢獻一點力量。
全劇終!
參考文獻:
Game Programming Patterns / Behaving Patterns / Component
How to implement MVC pattern in cocos2d game | XPerienced Blog
T=Machine » Entity System 1: Java/Android
T=Machine » Entity Systems are the future of MMOG development – Part 1
How to implement MVC pattern in cocos2d game–part 2 | XPerienced Blog
Games from Within| Indie iPhone game development
Game development |Mobile development |PODD
Cowboy Programming » Evolve Your Hierarchy
Object-Oriented Game Design| GBGames - Thoughts on Indie Game Development
Why Use MVC for Games? A Q&A Session | DeadPanic
C Coroutines for Game Entity State Management | Will's Blog
10 Reasons the Age of Finite State Machines is Over — AiGameDev.com
Subclass CCSprite vs Model Class. Best Practice? « cocos2d for iPhone
Animating a CCSprite using MVC design « cocos2d for iPhone
Animating a CCSprite using MVC design « cocos2d for iPhone
Subclassing CCNode and using CCSpriteBatchNode properly « cocos2d for iPhone
Component based entity systems « cocos2d for iPhone
How do you organize your code? « cocos2d for iPhone
Game Object Structure: Inheritance vs. Aggregation
Game Architecture Best Patterns and Practices - App Hub Forums
How to write solid Pure Aggregation (composition) Game Objects in Java? - Stack Overflow
Prefer Composition over Inheritance | Learn & Master Cocos2D Game Development
Components, Draw Calls and performance…. « Big Bad Robots Indie Game Studio
To Components with Cocos2D with love… « Big Bad Robots Indie Game Studio
Entity System FrameworkT=Machine » Entity System 1: Objective-C
architecture - Component based game engine design - Stack Overflow
Component Based Entity System Design Part 1 | Purple Pwny Games
Component-based game object systems in practice - Game Development - Stack Exchange
What is (functional) reactive programming? - Stack Overflow
Why I switched from component-based game engine architecture to functional reactive programming – Lambdor Devblog by Gerold MeisingerQuickstarting game development in Haskell and Ubuntu – Lambdor Devblog by Gerold Meisinger
Game Coding Complete - Component System Example Code (from GPG6)
objective c - Obj-C component-based game architecture and message forwarding - Stack Overflow
mikeash.com: Friday Q&A 2009-03-27: Objective-C Message Forwarding
Articles - Component Based Objects
Unseen-Academy - Component System
Componentbased entity systems - Game Development Lab Wiki
divotkey/cogaen3-java - GitHub
Open source component-based game or engines? - Game Development - Stack Exchange
Component Based Entity System Design Part 2 | Purple Pwny Games
一個基於組件的動態對象系統 - 遊戲創意和設計 - TechWeb-遊戲社區
遊戲對象的實現 (補)_thunder54007-ChinaUnix博客
thelinuxlich/artemis_CSharp - GitHub
thelinuxlich/starwarrior_CSharp - GitHub
Recommended Eclipse plugins to generate UML from Java code - Stack Overflow
Game Object Structure: Inheritance vs. Aggregation
Linkvent Calendar, Day 3: MVC with Cocos2D | Learn & Master Cocos2D Game Development
Artemis Entity Framework Ported to C# | Ploobs
C++ Port of Artemis Entity Component System Framework (In Progress) - GameDev.net