Cocos2d-x 小试牛刀五子连珠游戏
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
是否开启3D 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版本
以上是关于Cocos2d-x 小试牛刀五子连珠游戏的主要内容,如果未能解决你的问题,请参考以下文章
2021-5-27WHUT mooc 7-3 TicTacToe游戏--胜负判定 个人题解
2021-5-27WHUT mooc 7-3 TicTacToe游戏--胜负判定 个人题解