您的位置:首页 > 其它

消消乐中消除剩余元素时延时消除的功能

2015-06-08 11:35 465 查看
#pragma mark 消除标记了的精灵
void GameScene::removeSp()
{
m_isAnimationing = true;

for (int i = 0; i < m_height * m_width; i++)
{
AnimationSprite *sp = m_animalMatrix[i];

if (!sp) {
continue;
}

if (sp->getIsNeedRemove()) {
sp->setIsTouchEable(false);
m_isNeedFillVacancies = true;//需要掉落
//            if (sp) {
//                if(sp->getImgIndex() == 6){  // ---jn新增
//                    log("GameScene::removeSp() 结晶不会播放惊讶");
//                }
//                sp->playAnimation("jingya");
//            }

if (sp && sp->getImgIndex() != 6) {   // --jn新增
sp->playAnimation("jingya");
}

//检查类型,并播放一行消失的动画
//            if(sp->getDisplayMode() == DISPLAY_MODE_HORIZONTAL)
//            {
//                explodeSpecialH(sp->getPosition());
//            }
//            else if (sp->getDisplayMode() == DISPLAY_MODE_VERTICAL)
//            {
//                explodeSpecialV(sp->getPosition());
//            }
//            else if (sp->getDisplayMode() == DISPLAY_MODE_TL){
//                explodeSpecialTL(sp->getPosition());
//            }
//            else if (sp->getDisplayMode() == DISPLAY_MODE_OVERFIVE){
//                explodeSpecialOverFive(sp->getPosition());
//            }
//            else if (sp->getDisplayMode() == DISPLAY_MODE_CENTER){
//                explodeSpecialCenter(sp->getPosition());
//            }
//            else if (sp->getDisplayMode() == DISPLAY_MODE_FF){
//                explodeSpecialFF(sp->getPosition());
//            }
//            explodeSp(sp);

randomDelayTimeEliminate(sp);
}
}
}

void GameScene::randomDelayTimeEliminate(Node* node){

AnimationSprite *sp = (AnimationSprite*)node;

if(_bGameOver){

uniform_real_distribution<double> u(0, 2);
default_random_engine e(rand());

//产生的随机数字
float r = (float)u(e);

sp->runAction(Sequence::create(DelayTime::create(r), CallFuncN::create(CC_CALLBACK_1(GameScene::playEliminateEffect, this)), ScaleTo::create(0.3f, 0), CallFuncN::create(CC_CALLBACK_1(GameScene::actionEndCallback, this)),NULL)); // --jn新
}else{
sp->runAction(Sequence::create(CallFuncN::create(CC_CALLBACK_1(GameScene::playEliminateEffect, this)), ScaleTo::create(0.3f, 0), CallFuncN::create(CC_CALLBACK_1(GameScene::actionEndCallback, this)),NULL)); // --jn新
}

}

在randomDelayTimeEliminate函数中,如果游戏结束了,就直接消除,没有结束,则延迟一段时间,在随机一个延时,然后再进行消除。

总结:其实,发现游戏中,状态机的编程方式很实用,记录一个当前的游戏状态,这样非常方便扩展游戏状态,而且可以省去很多的变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: