http://www.cocoachina.com/bbs/read.php?tid-297248.html见上回
先来谈谈精灵类的实现:
在setColor这个函数里面使用了spirte::setTexture这个函数来实现纹理的替换,记得以前使用2.0版本的时候根本不支持动态切换纹理,每一次的切换都需要把精灵删除掉再重新load非常麻烦,3.5版本的这点改变令我非常舒心,在实现精灵的时候我还需要用到一个功能,就是当我点击当前精灵的时候需要获得响应,从而让外部知道我点击的是哪一个精灵,这点3.5也做得非常好,
看代码
auto pTouchListener = cocos2d::EventListenerTouchOneByOne::create();//创建一个触摸监听
pTouchListener->setSwallowTouches(true); //设置是否想下传递触摸
pTouchListener->onTouchBegan = CC_CALLBACK_2(cStarSprite::onTouchBegin, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(pTouchListener, this);
```
监听后当点击屏幕就会回调到onTouchBegin,那么我们添加点代码,只让他响应点解到纹理区域才响应
bool cStarSprite::onTouchBegin(cocos2d::Touch* touch, cocos2d::Event* pEvent)
{
auto target = static_cast(pEvent->getCurrentTarget());
// 获取当前触控点相对与按钮的位置
cocos2d::Vec2 locationInNode = target->convertToNodeSpace(touch->getLocation());
cocos2d::Size s = target->getContentSize();
cocos2d::Rect rect = cocos2d::Rect(0, 0, s.width, s.height);
// 检测点击区域,精灵可见的情况下才可触发点击事件
if (rect.containsPoint(locationInNode) )
{
return true;
}
return false;
}
```
ok这样精灵的实现已经做好,当我创建精灵的时候使用ssetcolor初始化颜色,当我点击的时候在外部响应获得点击精灵的tag就能做下一步操作
再来谈谈关于程序的核心算法:
算法1:当我点击星星的时候寻找相同的方块使用的是广度优先遍历,看百度上面的关于算法的描述
所以看我代码里面StarDate的findSelList函数会有详细过程,当然你也可以使用递归去实现该算法
算法2:游戏里面方块往下掉的算法,由于我使用的是10*10的二维数组,当星星消失的时就检查下消失链表里寻找需要调整的j列把数组里面的空值交换,如图看星星的j列,一直交换到把0移到上面
1 1 0
1 1 0
1 1 1
0 0 1
1 ---> 1 .... 1
1 1 1
1 0 1
0 1 1
1 1 1
1 1 1
算法3:星星的合并,把下落的星星数据处理完后,会再一次寻找x方向上第0位索引的数据,若为空就会把后面的不是空值数据整行交换
ok,算法不是很复杂,只需要在调试的时候把星星的位置索引跟逻辑索引对应好就没问题,当然如果对程序还有什么疑问可以回帖问我!