1.首先,數據驅動是什麼? html
這個問題,我不敢回答,由於我也是剛剛從《遊戲編程精粹1》這本書上了解到的,我並不徹底瞭解它。關於數據驅動的介紹,能夠參考《遊戲編程精粹1》的第一章第一節(我不是來賣廣告的...),或者參考如下地址: 編程
http://www.cnblogs.com/tadi314/archive/2010/03/11/1683795.html 編輯器
不過,從它的介紹中能夠看出,它至少能夠減小使用硬編碼,必定程度上分離邏輯與數據。 函數
2.而後,Stop GMO是啥玩意? 學習
若是不嫌棄,能夠參考一下個人上一篇博文,裏面有Stop GMO的介紹和代碼地址等。簡單來講,Stop GMO就是本菜鳥學習cocos2d-x時嘗試編寫的一個橫版遊戲(應該說,是山寨原版Stop GMO的一份劣質品)。 動畫
3.那麼,數據驅動與Stop GMO有什麼關係? 編碼
說實話,它們之間原本沒有半毛錢關係。我如今時想將數據驅動的設計思想應用到Stop GMO,讓它們有一點關係,好讓我山寨的Stop GMO沾沾光... spa
-----------------------------------------------我是分割線----------------------------------------------- .net
若是有哪位好心人能夠忍住噁心讀一讀我那份寫得很爛的Stop GMO的代碼,就能夠發現,遊戲場景中的Enemy類是全部怪物類的父類,它將派生出Carrot,Corn等怪物類型。而其實Carrot類與它的兄弟類Corn能夠說是徹底同樣的,它們的行爲,數據類型上徹底一致,只是數據的具體值不同而已(例如攻擊力、生命值或者動畫貼圖不同)。這樣,咱們能夠嘗試應用數據驅動的思想,將這些數據的具體值編寫到一個外部的文件裏(如xml文件),那麼Enemy再也不派生出Carrot,Corn等類,而是Enemy本身就做爲一個可實例化的類,可是在實例化以前接受來自外部文件所定義的具體數據值,影響自身的初始化,從而模擬「派生」Carrot,Corn等類。 設計
應用數據驅動,讀取外部文件,從而模擬出派生的行爲,究竟有什麼好處呢?看回原來的設計,Enemy是不能實例化的,而是派生出Carrot等子類,Carrot在構造函數中定義了自身的屬性數值,如生命值、攻擊動畫等。但實際上,Carrot並無對Enemy進行任何的擴展,它只是具體定義了一些數據而已。這彷佛有點「類冗餘」(這個詞是我瞎編的...)。咱們每次想要添加一種新的怪物的時候,都要修改原來的代碼,派生出一個新類型。可是,若是咱們將怪物的具體數值放到外部文件,將Enemy設計爲可實例化的,Enemy接受外部分文件數據進行初始化,則通過必定的設計後,能夠作到添加新怪物類型的時候,不須要修改原代碼,只是修改一下外部的數據文件而已。
-----------------------------------------------我是分割線-----------------------------------------------
(好吧,或許一部分人還不清楚我上面一段話想要表達什麼。不要緊,是個人表達能力有問題,不關你事的~~~)那麼,選擇什麼文件類型來存儲這些具體數據好呢?我選用的是xml文件。那麼,咱們如今考慮解析xml文件的問題。對於我這樣的懶人和菜鳥,第一個想到的不是本身寫一個解析程序,而是上網看有沒有相應的函數庫。通過谷歌+百度後,我發現cocos2d-x裏面有個CCSAXParser支持XML的解析;同時,也有個開源的C++ XML解析器tinyxml。不知道爲何,我更傾向於用tinyxml。多是我想到我正在作的畢業設計也須要xml文件保存數據,tinyxml做爲一個獨立的庫比較方便吧。
當我想下載tinyxml庫的時候,我又發現了tinyxml2,因此我就下載了tinyxml2,因此,我就嘗試用一下tinyxml2了。下面給出一個簡單的例子代碼,是我嘗試設計的用做Stop GMO中保存的Enemy具體數據的格式,以及一個簡單解析嘗試:
http://www.oschina.net/code/snippet_115087_17336
咱們將數據保存到外部文件,再解析到程序中應用,則能夠在添加新的單位(怪物)類型不須要修改程序代碼,使得程序變得更有擴展性。這種方法,在RTS遊戲中應該比較經常使用吧(魔獸爭霸的世界編輯器裏頭的數據編輯器?)?