Cocos2d-x 小试牛刀五子连珠游戏

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版本

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值