粒子特效

1、使用plist文件创建一个粒子

    auto water = ParticleSystemQuad::create("water.plist");

    water->setPosition(visibleSize.width/2, visibleSize.height*0.8);

this->addChild(water);

2、自定义粒子系统

MyParticle.h

#include <iostream>

#include "cocos2d.h"

class MyParticle : public cocos2d::ParticleSystemQuad

{

public:

    // create函数

    static MyParticle* create();

    // 初始化粒子函数

    virtual bool initWithTotalParticles(int numberOfParticles);

};

MyParticle.cpp

#include "MyParticle.h"

 

USING_NS_CC;

 

MyParticle* MyParticle::create()

{

    MyParticle* ret = new MyParticle();

    // 初始化350个粒子

    if (ret && ret->initWithTotalParticles(350))

    {

        ret->autorelease();

        return ret;

    }

    else

    {

        CC_SAFE_DELETE(ret);

    }

    return nullptr;

}

 

bool MyParticle::initWithTotalParticles(int numberOfParticles)

{

    if( ParticleSystemQuad::initWithTotalParticles(numberOfParticles) )

    {

        // 粒子发射器的持续时间,kCCParticleDurationInfinity表示粒子效果永远持续下去

        setDuration(ParticleSystem::DURATION_INFINITY);

        // 发射器模式:重力模式(kCCParticleModeGravity)、半径模式(kCCParticleModeRadius

        setEmitterMode(ParticleSystem::Mode::GRAVITY);

//        setEmitterMode(ParticleSystem::Mode::RADIUS);

        if (getEmitterMode() == ParticleSystem::Mode::GRAVITY) {

            setSourcePosition(Vec2(-10, 0));

            // gravity:粒子在x轴和y轴的加速度

            setGravity(Vec2(0, -90));

            // radialAccel:粒子的径向加速度

            setRadialAccel(0);

            // 粒子间的径向加速度差异

            setRadialAccelVar(0);

            // tangentialAccel:粒子的切向加速度

            setTangentialAccel(100);

            // 粒子间的切向加速度差异

            setTangentialAccelVar(10);

            // speed:粒子的运动速度

            setSpeed(150);

            // 粒子的速度差异

            setSpeedVar(50);

        }else{

            // startRadius:所发射粒子和粒子效果节点位置间的距离

            setStartRadius(120);

            // 粒子间开始半径差异

            setStartRadiusVar(0);

            // endRadius:粒子要旋转到的位置和节点位置间的距离

            setEndRadius(10);

            // 粒子间结束半径差异

            setEndRadiusVar(0);

            // rotatePerSecond影响粒子移动的方向、速度

            setRotatePerSecond(-150);

            // 粒子间每秒的旋转角度差异

            setRotatePerSecondVar(0);

        }

        // 设置粒子发射器的位置和位置类型

        setPosVar(Point::ZERO);

        setPositionType(ParticleSystem::PositionType::FREE);

        // 粒子发射的方向

        setAngle(80);

        setAngleVar(20);

        // 粒子的生命周期

        setLife(2.0f);

        setLifeVar(1.0f);

        // 每一帧所发射的粒子数量

        setEmissionRate(getTotalParticles()/getLife());

        // 粒子的颜色

        setStartColor(Color4F(1.0f, 1.0f, 1.0f, 1.0f));

        setStartColorVar(Color4F(0.5f, 0.5f, 0.5f, 0.5f));

        setEndColor(Color4F(0.2f, 0.2f, 0.2f, 0.2f));

        setEndColorVar(Color4F(0.1f, 0.1f, 0.1f, 0.1f));

        // 设置粒子大小,单位是像素

        setStartSize(6.0f);

        setStartSizeVar(2.0f);

        // START_SIZE_EQUAL_TO_END_SIZE使粒子大小在其生命周期中不发生变化

        setEndSize(ParticleSystem::START_SIZE_EQUAL_TO_END_SIZE);

        setEndSizeVar(0);

        // 粒子的纹理fire.png

        setTexture(Director::getInstance()->getTextureCache()->addImage("fire.png"));

        // 粒子的混合模式

        setBlendFunc((BlendFunc){GL_SRC_ALPHA,GL_DST_ALPHA});

        setBlendAdditive(false);

        

        return true;

    }

    return false;

}

其他类调用自定义粒子系统

    // 测试自定义粒子系统

    auto particle = MyParticle::create();

    particle->setPosition(visibleSize.width/2, visibleSize.height/2);

this->addChild(particle);

3ParticleEffect的使用

    //    auto fire = ParticleFire::create(); // 火焰粒子系统

    //    auto fireworks = ParticleFireworks::create(); //烟花粒子系统

    //    auto flower = ParticleFlower::create(); //花朵粒子系统

    //    auto galaxy = ParticleGalaxy::create(); // 银河系粒子系统

    //    auto meteor = ParticleMeteor::create(); // 流星粒子系统

    //    auto rain = ParticleRain::create(); // 下雨粒子系统

    //    auto smoke = ParticleSmoke::create(); // 烟雾粒子系统

    //    auto snow = ParticleSnow::create(); // 下雪粒子系统

    //    auto spiral = ParticleSpiral::create(); // 螺旋粒子系统

    //    auto sun = ParticleSun::create(); // 太阳粒子系统

    

    // 创建爆炸粒子系统

    auto explosion = ParticleExplosion::create();

    // 设置爆炸粒子系统的位置

    explosion->setPosition(visibleSize.width/2, visibleSize.height/2);

    // 添加为当前层的子节点

this->addChild(explosion);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值