Cocos2d x裡面如何實現MVC 三

2021-08-07 20:16:15 字數 2696 閱讀 8948

引子:前面兩篇文章介紹了一些關於在cocos2d-x裡面如何實現mvc的理論知識,接下來的這三篇教程,我將用乙個簡單的教程示例,給大家演示一下具體**實現細節。

情景我們將製作乙個簡單的面板解謎遊戲(board puzzle game),當然,我們不是簡單地開發乙個遊戲,而是要利用mvc開發出乙個簡單的「遊戲框架」,而且這個框架將會在我的新遊戲裡面使用到,它具有如下一些特性:

1 乙個n行n列的遊戲面板(game board),n可以隨著遊戲難度進行變化。 

2 這個遊戲面板裡面會包含一些「小方塊(game pieces)」,而且每乙個game board上都只能放乙個game piece。

3 這個遊戲面板可以初始化一些固定的小方塊,玩家在遊戲過程中,是不能移動這些小方塊的。

4 這裡還定義了乙個「工具箱(toolbox)」,它上面可以放置許多小工具(toolbox item),它們可以看作是「可放置可移動小方塊的槽子」。

5 小工具(或者叫槽子)上面可以放置許多同一型別的小工具。

6 這些小工具可以從工具箱上面移動,並且可以放置到game board 上面。

基本概念

來自 wikipedia:

model負責管理應用領域的資料和行為邏輯,同時負責響應對自己的狀態資料請求(這些請求通常是從view過來的),然後響應一些指令來更改自身的狀態(這些請求通常是來自controller的)。在乙個事件驅動的系統中,model會通知訂閱者(observers)(通常是views)它的狀態改變,這樣view就可以做相應的顯示更新。

view則根據model的狀態來合理地顯示,通常是一些ui元素。乙個model可以對應多個view,比如,同一資料的柱狀圖、餅狀條、曲線圖等。

controller負責接收多使用者輸入和呼叫model的一些方法。乙個controller通過從使用者那裡獲得輸入,然後操作model物件,最後,model通知view來更新顯示。

從維基百科的定義中,我們可以識別出以下幾個主要的類(我們會在後面把model給加上去):

7 gameboardview 代表應用程式的主檢視

8 gameboardcontroller 是gameboardview的乙個控制器。

請注意,這裡的實線代表一種直接的關聯關係(controller裡面包含乙個view的引用),而虛線則代表了一種間接的關聯(通過觀察者模式)。這裡的直接關聯後面會用來實現touch事件處理。

實現專案組織結構

在vs2008裡面基於cocos2d-x的預設模板建立乙個新的專案之後,我們又建立了下面這些組:

9 view – views & controller 組 (我們也可以把view和controller放在那個不同的group裡面,但是,由於我們兩個有直接的關聯關係,為了方便,我就把它們放在一起了)

10 model – 之後,我們會把model類放在這個group下面。

gameboardview 的實現

接下來,我們開始實現gameboardview。首先,我們把gameboardview繼承至ccnode。

class gameboardview : public cclayer
然後,實現它的init方法,然後簡單地顯示一串字元來驗證程式的正確性。(譯者:這就和我們有時候會在方法的第一句加乙個cclog一樣,只是為了驗證函式是否被呼叫了,確保每一步都是按照你的想法去走的,這樣比那種埋頭編寫2個小時**不編譯,而後花一晚上修改編譯錯誤和bug要好很多。有時候只是輸出還不夠,還必須要做單元測試,這樣才能提高效率)

virtual bool init() while (0);

return bret;

}

gameboardcontroller 實現

gameboardcontroller負責初始化view,所以它裡面包含了乙個gameboardview的引用,將來就可以非常方便地直接使用了。

class gameboardcontroller : public cclayer
因為我們的gameboardcontroller繼承到ccnode,所以,我們可以把gameboardview當作gameboardcontroller的孩子給新增進去。

virtual bool init()while(0)

beturn bret;}

static ccscene* scene()while(0);

return scene;

}

最後的修改

ccdirector::shareddirector()->runwithscene(gameboardcontroller::scene());
好了,現在編譯並執行。當程式跑起來的時候,這個結果和cocos2d自帶的模板執行效果差不多。但是,有個很重要的區別,那就是我們建立了乙個mvc的骨架,在接下來的遊戲邏輯中,我們可以在上面做很多文章。

接下來做什麼

11 處理touch事件.

12 引用model的概念.

cocos2d x如何檢測碰撞

我們的英雄現在可以發射子彈了,但僅僅只是裝飾而已,如何才能殺掉怪物呢?在這一章,我們將介紹碰撞檢測來實現這一效果。首先,跟蹤怪物和子彈是必需的。在遊戲中,我們為這兩種精靈加以不同的tag來區分它們。當tag 1時,表示這是怪物,而tag 2時,則表示這為子彈。由於在ccnode裡面有m ntag這個...

cocos2d x實現打字特效

原文請猛戳 這次分享乙個在cocos2d x中實現打字特效的小功能。首先,cocos2d x中label預設是utf8編碼,quickx提供了乙個string.utf8len介面,這裡再加乙個擷取子字串的函式 function utf8str str,start,num local function...

cocos2d x 實現中文輸出

下面我們來說說如何實現中文輸出吧!首先,個人覺得可以新建乙個tools.cpp 和 tools.h 檔案 首先在tools.h ifndef tools h 預定義塊 define tools h include cocos2d.h if cc target platform cc platform...