cocos2d-x 学习——我的2048

来源:互联网 发布:万国数据成都数据中心 编辑:程序博客网 时间:2024/06/04 00:49

上周在一个游戏群看到大家在讨论 2048 这个游戏,貌似很火的样子。下下来玩了一把,觉得有点意思。正好在学cocos2d-x ,因此决定自己动手写一个来玩玩。顺便记下开发过程。通常我解决问题的方式是这样的,先把能考虑到的有难点的细节想清楚如何实现,有了几分把握再开始,期间再碰到难点在想办法解决。

  • 问题:

1、以怎样的数据结构保存数字并展现;

2、带数字显示的,同时根据数字大小调整颜色的色块如何展现,原谅我是cocos2d-x 初学;

3、怎么判断滑动的方向;

4、怎么处理每次滑动数字相加与否以及移动。

  • 解决思路:

1、数据结构:很简单的 4*4 二维数组,每次滑动更新数组,根据该数组显示色块。这样做有其灵活性

2、带数字的色块:新建一个Block类来表示带数字显示的色块。该类继承自 cocos2d::CCNode,并重写draw(),同时以cocos2d::CCLabelTTF作为成员变量来展现数字。并且加入 背景色(色块的颜色)、前景色(数字颜色)成员变量,通过他们来动态改变颜色值。

3、滑动方向判断:对于滑动方向的判断,我采用 斜率+x/y坐标 来处理,根据直线的数学知识,在直线与x轴夹角为45度时,斜率为 1, 135度时为-1,因此如果0 <= |k| <= 1 (k为两点计算出的斜率绝对值)时,为左-->右或右-->左方向滑动,再加上两点的x值判断即可判断出具体方向。同理如果 |k| > 1 则为上-->下/下-->上,加上两点的y值判断则可判断出具体方向。

4、检测合并以及移动:每次滑动我采用最笨的方法,比如滑动方向从左-->右,则扫描每行,对每一行从右至左做列扫描,首先判断当前数字是否为0,不为0则为空闲可填充位置保存下标列的值,为0则循环往前找不为0的数字,如果找到则判断是否跟当前值相同,相同则加入当前值,退出当前循环,如果空闲可填充位置有值,则填充到该位置。直到每一行都扫表完成。算法很笨,时间复杂度为(n^3),虽然这里只有4*4的数据,还是 求高手解救。

  • 补充:这里有四个方向上的滑动,如果对每个方向滑动单独使用第四步方式解决,那么要实现四个版本的函数。于是考虑其它三个(右-->左、上-->下、下-->上)方向都统一使用左-->右的处理,这样一来,每次滑动都将数据转到 左--> 右的方向,再处理,然后转回来。具体看下面:

  • 左-->右:直接处理
  • 右-->左:数组按列对换-->处理(左-->右)-->数据按列兑换回来
  • 上-->下:数组顺时针旋转90度(先对角线兑换,再按列对换)-->处理(左-->右)-->结果数据数组逆时针旋转90度
  • 下-->上:数组逆时针旋转90度(先对角线兑换,再按行对换)-->处理(左-->右)-->结果数据数组顺时针旋转90度
  • 待提升:
第四步算法效率待提高
未加入效果(cocos2d-x初学者)

适应分辨率处理简单,有拉伸不好看(cocos2d-x初学者)


附图一张:


0 0
原创粉丝点击