天天看點

cocos2dx之lua項目開發中MVC架構的簡單應用

****************************************************************************

時間:2015-03-31

作者:Sharing_Li

       近期的遊戲項目中使用了lua腳本來開發,項目中用到了MVC架構,近期有朋友問我怎麼弄。在這裡簡單分享一下思路和一些開發中的技巧。 

       先簡單說說MVC,即Model View Controller。Model(模型),一般負責資料的處理。View(視圖)。一般負責界面的顯示。Controller(控制器),一般負責前端的邏輯處理。拿一款手機遊戲來說,界面UI的顯示、布局等就是View負責;點選了button,手勢的滑動等操作由Controller來處理;遊戲中須要的資料資源就交給Model。 

       接下來,看看在遊戲開發中怎麼用,這裡用Lua(環境使用cocos code ide)給大家說說。

       先來看看項目的檔案夾結構:

cocos2dx之lua項目開發中MVC架構的簡單應用

        當中cocos、Controller、Model、View這個不用多說,Event裡面儲存的全局消息類型,Managers是用于管理遊戲中的東東的。比方管理資源,管理各種場景切換。層的切換等等。Utilities提供一些工具類,比方字元串的處理等。大家也能夠依據自己的需求來定制目錄,比方定義一個NetCenter目錄,專門用于處理網絡的。

本樣例中沒實用到資料操作和工具類。是以這兩個目錄為空。

        我們以遊戲的執行流程為線索來展開說明。

        執行項目。進入到main.lua檔案,來看看main函數:

        我們最後調用了GameScene類中的startGame函數,來看看GameScene這個類:

       在startGame函數中,我們建立了一個空場景。然後調用SceneManager場景管理器來初始化場景。最後調用enterGame函數正式進入遊戲主界面,當中enterGame函數中又有一個LayerManager層管理器。

我們來看看這兩個管理器是怎樣工作的。先看看SceneManager:

       非常easy,按順序初始化了三個空Layer。再來看看LayerManager管理器:

        看看gotoLayerByType這個函數,首先切換層的時候。看看目前層是否為空。不為空就删掉。然後依據傳遞過來的參數來推斷要切換到哪個層。這裡出現MVC中的Controller部分,看看是什麼情況。這裡調用了類MainLayerController中的create函數:

       這裡我們又發現了MVC中的View,在createUI函數中,我們調用了類MainLayerView的createUI函數,并将其加入到場景的遊戲層中。我們來看看MainLayerView這個類。

        能夠看到,我們在主界面中加入了一張背景圖和三個button。我們是通過資料總管ResManager來管理遊戲中的素材的。ResManager檔案非常easy:

       這樣做的優點是,假設圖檔改了名字或者換了路徑等。僅僅須要在這裡改一次就能夠了。

       能夠看到我們給三個button注冊了響應函數menuCallback,在這個函數中。就是MVC中的V和C之間的“溝通”了。

我們定義了一個自己定義事件EVENT_CLICK_MENU_MAIN,并給這個事件加入了一個附帶參數_usedata,這個參數儲存的是三個button的tag。然後将這個事件發送給他的監聽者。這裡大家應該明确了,我們在相應的Controller中注冊了EVENT_CLICK_MENU_MAIN的監聽,但有這個事件發過來時。我們就響應。依據事件攜帶的參數_usedata,我們就知道了在View中。玩家點選了哪個button。這樣做的優點是,保證了每一個界面僅僅有一個消息。我們僅僅須要依據這個消息攜帶的附加參數來推斷詳細的事件,進而降低了消息個數,這樣有助于遊戲的效率。另外,我們在響應這個消息的時候,也會做一定的優化,來看看類MainLayerController的響應函數:

        能夠看到實際情況,我們并不須要對傳遞過來的參數進行推斷,而是定義了一個函數數組。直接依據下标來調用相應的消息響應。之後繼續通過各種管理器來對遊戲内容進行變化,方式和MainLayerController和MainLayerView差點兒相同。

本文轉自mfrbuaa部落格園部落格,原文連結:http://www.cnblogs.com/mfrbuaa/p/5125274.html,如需轉載請自行聯系原作者