Cocos2D的設計模式不同於iOS一般應用開發所使用的MVC模式。我們知道,在MVC模式中,模型(Model)和視圖(View)是完全分開的,通過ViewControllers來串連兩部分。而Cocos2D一般不使用MVC模式,根本原因在於Cocos2D的運行方式和結構是完全不同的。以下都是個人觀點。
Cocos2D 2.x是基於OpenGl ES 2來開發的,那麼程式啟動並執行過程是update frame的過程,就是不斷的更新頁面幀來實現程式的運行。因此,所以的邏輯判斷或者說遊戲AI都必須在update中進行運算。因此,View和Model因為都需要納入Update使兩者更加緊密。這是原因之一。
另一方面,一般的遊戲都會有很多的對象,比如各種遊戲中的人物,每個對象的顯示,動畫,AI都不一樣,而且可能都很複雜,如果將顯示和AI分開,那麼在update要通過AI判斷來確定顯示,而顯示的狀態比如位置又反過來影響AI的判斷流程,那麼這種交聯將變得極其麻煩,估計得用無數個Protocol來實現。因此,把一個對象的顯示,AI封裝在一個類裡面是更好的選擇。這是原因之二。
然後就是Cocos2D的軟體架構了。可以說,做Cocos2D遊戲就像製作一部電影,甚至Cocos2D裡面的對象也參照了電影拍攝中的專有名詞。的Cocos2D node的層次關係圖:
這個圖摘自Learning Cocos2D這本書。
可以看到,和iOS一般的架構不同,先回顧一下iOS通常的情況。程式啟動,生產一個Window,然後window裡面有各種Views,View通過ViewController控制。
那麼Cocos2D是怎樣的呢?
程式啟動產生一個CCDirector(導演),然後Director下面有很多Scene(情境),Director(導演)就負責切換各種Scene(情境)。然後一個Scene下面有不同的Layer(圖層),就類似電影中的情境有背景,有人物,有道具,這些東西在不同的層次。然後每個Layer中可以有不同的Sprite,這才是具體要控制的對象。比如人物層可以有很多人,每個人就是一個Sprite,專業翻譯叫子圖形,我覺得可以叫角色或者道具。那麼對於Sprite,比如一個人,它既有思考,內在(Model),又有表現(View),只要將一個完整的Sprite(Class)添加在Layer中,那麼之後的事情就是隨著Update(時間的流逝)讓這個Sprite自己表現了。
因此,在遊戲開發中,更通常的方式是把Sprite完全看成一個個體,通過一個Class把它的Model和View都封裝在一起,感覺像是在遊戲的虛擬世界中創造的一個生物(Creature),然後你就像遊戲中的上帝,把“生物”按自己的意願添加進遊戲世界,然後“生物”怎樣活動就完全看它自己了,當然作為”上帝“的你掌握了遊戲裡面的所有資訊。說著感覺越來越像駭客帝國了。不過哪天AI水平足夠高了,那你真的可以成為虛擬世界的”上帝“去創造一個虛擬宇宙。
通過上面的分析,我想我們就比較清楚在使用Cocos2D開發遊戲要怎麼做了,那就是
像上帝一樣去創造遊戲世界!像導演一樣去執導遊戲過程!
我想這大概也是製作遊戲的一大樂趣所在!
Question:如何創造遊戲世界?
上帝是怎麼創造世界的呢?
先創造基本粒子,然後粒子組成各種物質,物質再組成各種更負責的物質,然後有些物質組成了生物,生物中從植物進化到動物,最後到最負責的人類。
遊戲也一樣。為了使程式結構清晰,那麼在編寫Class的時候,也應該是類似上面的結構,先編寫一些基本的類,然後繼承來編寫更具體的子類。比如遊戲中,有會動的,有不會動的,然後可以先做一個基類比如叫做GameObject,把共同的屬性放進去,然後子類再分情況編寫,這樣就會比較清楚了。
先說到這吧!下一篇筆記再來說說具體的程式結構!解剖一下!
[註:本文為原創文章,如需轉載,請註明出處!謝謝合作!]