Cocos2d-x 小試牛刀五子連珠遊戲

KyleWlk發表於2017-03-26

Cocos2d-x小試牛刀五子連珠遊戲

宣告:本文遊戲使用的是cocos2d-x-3.13的程式碼

 

遊戲介紹

本文將介紹有Cocos編寫經典遊戲,五子連珠。遊戲規則,有一個10*10的棋盤,裡面有六種顏色的珠子,點選棋盤的珠子可以移動到任意有開放路徑的位置,如果橫、豎、斜、反斜可以連線相同顏色珠子數大於等於5個,就可以消除。如果移動珠子後沒有消除珠子,則會增3個珠子,如果棋盤被所有珠子填滿則遊戲結束。

 

遊戲介面如下:

 

 

遊戲程式碼

遊戲程式碼下載地址:https://pan.baidu.com/s/1gf9mlzH

為減少程式碼大小,程式碼只保留了,VS2015 win32的編譯環境和資源,並刪除了Cocos中沒有使用的部分功能。

 

去除Cocos中部分不用的功能

Cocos中的ccConfig.h標頭檔案中包含一些巨集,可以控制一些功能的開啟於關閉

例如

是否使用粒子特效

/**Use physics integration API. */

#ifndefCC_USE_PHYSICS

#defineCC_USE_PHYSICS 0

#endif

是否開啟 NavMesh

/**Use 3D navigation API */

#ifndefCC_USE_NAVMESH

#defineCC_USE_NAVMESH 0

#endif

這兩個功能都在本遊戲中都沒有使用,所以都關閉。

 

 

遊戲實現

遊戲場景樹:


遊戲中有兩個場景,主選單場景(MainScene)和遊戲場景(GameScene)

 

 

ball

ball類主要封裝了珠子類,繼承至Sprite類,程式碼如下:

class Ball :public cocos2d::Sprite{
public:
    Ball();
    ~Ball();
    virtual bool init() override;
    CREATE_FUNC(Ball)
    void SetColor(int n);
    int GetColor() { return icolor;  }
    void SetXY(int x, int y) {  this->x = x; this->y = y;   }
    int GetX(){ return x; }
    int GetY(){ return y; }
    void SetClickFun(std::function<void(Ball*)> callback);
    bool touchBegin(cocos2d::Touch *t, cocos2d::Event *e);
    void touchEnd(cocos2d::Touch *t, cocos2d::Event *e);
private:
    int x, y;//在棋盤中的位置
    int icolor;//棋子顏色。
    std::function<void(Ball*)> callback;
    static char *color[6];//棋盤的六種顏色
    static cocos2d::SizeBallSize;
    static bool StaticInit;
};

紋理

ball的六種顏色珠子紋理,採用TexturePacker打包成一個大圖,這樣可以讓所有的珠子在一個Draw Call中渲染,提高渲染速度。

 

點選事件

每個Ball都可以呼叫SetClickFun註冊監聽事件,如果被點選了可以以呼叫回掉函式物件callback

點選事件會在touchBegin事件中判斷是否點選到了該節點,在touchEnd事件中判斷是否要對事件進行處理,如要要則會呼叫callback

 

 

Board棋盤類

遊戲主要功能實現在Board棋盤類中,程式碼如下:

class Board:public cocos2d::Layer
{
public:
    typedef std::vector< std::pair<int,int>> Path;
 
    Board();
    virtual ~Board();
 
    virtual bool init() override;
 
    CREATE_FUNC(Board)
 
    void OnSelect(Ball* b);//處理珠子的點選事件
    bool AddBall();//新增新的珠子,並生成下一次使用的珠子
    int ClearBall(intx, inty);//判讀在X, Y 處新增了珠子後是否需要消除, 返回消除的個數
    void MoveBall(Ball *b,constPath &path);//根據CalPath的結果生成移動動畫
    void MoveBallEnd(Ball *b);//移動完成後消除珠子,或新增珠子。
    bool CalPath(Ball *b,int x,int y,Path& p); //計算ball到x,y的路徑,存在路徑則返回true,否則返回false
private:
    cocos2d::Sprite*_select;
    ints  x, sy;
    Ball*bs[10][10];
    static constintnextCount= 3;
    Ball *bNext[nextCount];
    cocos2d::Label*lNext;
    int mpoint;
    cocos2d::Label*lPoint;
 
    cocos2d::Label*lOver;
    bool IsOver;
    bool IsMoving;
    Ball*ballMove;//用於移動動畫,播放移動動畫時,會先隱藏原始位置的ball,然後在移動這個ball。
};


具體實現程式碼中有註釋,大家可以下載程式碼檢視,這裡不一一講解。

 

OnSelect函式時珠子點選的回掉函式,函式會判斷是否要選擇珠子還是移動珠子。

 

CalPath函式會計算出珠子到x,y的最短路徑。

這是一個“電路圖佈線”演算法,如果看不懂,可以百度這個演算法。

“電路圖佈線”演算法,是一個分支限界的演算法,演算法每次會選取一個最優節點進行,直到得到結果。為了每次選取最優節點可以使用std::priority_queue優先佇列。

 

 

擴充套件

遊戲程式碼下載地址http://pan.baidu.com/s/1gf9mlzH

程式碼只保留了VS2015 win32版本

 

相關文章