利用cocos2dx 3.2开发消灭星星(九)为游戏添加一些特效

其实整个消灭星星开发也差不多了,为了使游戏好看些,不如为游戏添加一些特效
1.星星消除
有没有人发现,如果仅仅用简单的removeFromParentAndCleanUp方法来消除星星,会一下子消失,如果我们想一颗颗星星挨个地消失,不妨可以采用一下方法
在StarMatrix的update函数里面加入一个参数delta,这与cocos2dx的update函数的一样表示上一帧到这一帧的间隔时间,当间隔时间达到一定时间后,消除星星。

void StarMatrix::updateStar(float delta){
    
    for(int i = 0;i < ROW_NUM;i++){
        for(int j = 0;j< COL_NUM;j++){
            if(stars!=nullptr){
                stars->updatePosition();
            }
        }
    }
    if(needClear){
        clearSumTime += delta;
        if(clearSumTime > ONE_CLEAR_TIME){
            clearMatrixOneByOne();
            clearSumTime = 0;
        }
    }
    
}

```

needClear是一个flag,当游戏判断不能再继续后(看上一节),这个flag变为true,开始消除剩下的星星
clearSumTime是一个累加器
ONE_CLEAR_TIME就是每颗星星消除的时间

2.连击加分信息
一般消除一次星星都会有连击信息和加多少分的信息。我是采用一个固定在GameLayer的Label,通过设置其内容以及是否可见(visible)来实现

3.连击combo效果

![](http://img.blog.csdn.net/20141001195958764?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGV6aWppYW4yMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)

当达到5连击,7连击,10连击或以上的时候,会弹出一个combo效果。

其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。
源码
ComboEffect.h
#ifndef _COMBO_EFFECT_H_
#define _COMBO_EFFECT_H_
#include "cocos2d.h"
using namespace cocos2d;

void showComboEffect(int size,Node* node);
#endif

ComboEffect.cpp
#include "ComboEffect.h"
void showComboEffect(int size,Node* node){
    if(size<5)
        return;
    Size visibleSize = Director::getInstance()->getVisibleSize();
    Sprite* comboSprite;
    if(size>=10){
        comboSprite = Sprite::create("combo_3.png");
    }else if(size>=7){
        comboSprite = Sprite::create("combo_2.png");
    }else{
        comboSprite = Sprite::create("combo_1.png");
    }

    comboSprite->setPosition(Point(visibleSize.width/2,visibleSize.height/2));
    node->addChild(comboSprite);

    Blink* blink = Blink::create(1.0f,5);
    CallFunc* remove = CallFunc::create(=](){comboSprite->removeFromParentAndCleanup(true);});
    Sequence* action = Sequence::create(blink,remove,nullptr);
    comboSprite->runAction(action);
}

```


4.消除星星粒子效果

![](http://img.blog.csdn.net/20141001200835750?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGV6aWppYW4yMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)

消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎
对于粒子特效不了解得可以先去cocos2dx中文社区里面找几篇文章看看。这里直接贴出代码。
StarParticle.h
#ifndef _STAR_PARTICLE_H_
#define _STAR_PARTICLE_H_
#include "cocos2d.h"
using namespace cocos2d;
void showStarParticleEffect(int color,Point position,Node* node);
Color4F getColor4F(int color);
#endif

StarParticle.cpp
#include "StarParticle.h"
#include "Star.h"
void showStarParticleEffect(int color,Point position,Node* node){
    ParticleExplosion* effect = ParticleExplosion::create();
    effect->setTexture(Director::getInstance()->getTextureCache()->addImage("star.png"));
    effect->setTotalParticles(15);
    effect->setStartColor(getColor4F(color));
    effect->setStartColorVar(Color4F(0,0,0,1));
    effect->setEndColor(getColor4F(color));
    effect->setEndColorVar(Color4F(0,0,0,1));
    effect->setStartSize(25.0f);
    effect->setGravity(Point(0,-300));
    effect->setLife(1.0f);
    effect->setSpeed(200);
    effect->setSpeedVar(10);
    effect->setPosition(position);
    node->addChild(effect);
}

Color4F getColor4F(int color){
    switch(color){
    case Star::color::PURPLE:
        return Color4F(0.74,0.30,0.99,1);
        //return Color4F(189,78,253,1);
    case Star::color::BLUE:
        return Color4F(84/255.0f,203/255.0f,254/255.0f,1);
    case Star::color::RED:
        return Color4F(253/255.0f,80/255.0f,126/255.0f,1);
    case Star::color::YELLOW:
        return Color4F(253/255.0f,234/255.0f,84/255.0f,1);
    case Star::color::GREEN:
        return Color4F(132/255.0f,226/255.0f,111/255.0f,1);
    }
    return Color4F(1,1,1,0);
}

```

只要在每次消除星星后(即removeFromParentAndCleanUp后),调用这个showStarParticleEffect方法,就可以给人一种好像是星星碎成小星星散落的效果。

谢谢楼主分享。

赞!:2::2:

谢谢,但是连击不是消除的数量,概念错了