文章目录
  1. 1. cocos2dx中的粒子系统
    1. 1.1. 内置的几种粒子效果
    2. 1.2. 添加一个雪花效果
  2. 2. 自定义粒子效果

在游戏中存在一些大规模运动的物体,例如下雨时的雨点、下雪时的雪花、爆炸时的火花等。为了实现这些效果,一般有两种方法:

  1. 使用帧动画来模拟:生成的动画体积庞大,也无法调整其运动参数,有失灵活性。
  2. 粒子效果。

在粒子效果中,存在一个对所有粒子进行统一调度的引擎,称作粒子系统。

cocos2dx中的粒子系统

由CCParticleSystem类实现。其对粒子的操作包括:

  1. 产生粒子:这部分也被称作粒子发射器(emitter)
  2. 更新粒子状态
  3. 回收无效粒子

通常创建一个全新的粒子系统较为繁琐,大多数情况下,我们乐意把粒子系统的参数保存在文件中,而cocos2dx就是使用Plist文件来保存这些参数的。可以调用CCParticleSystem的初始化方法直接从文件中导入一个粒子效果,相关代码如下:

bool initWithFile(const char *plistFile)
static CCParticleSystem* create(const char *plistFile)

Plist文件实质是一个XML文件,可以利用任何文本编辑器来创建或修改。

内置的几种粒子效果

-- CCParticleSystem(所有粒子系统的父类)
-- CCParticleSystemPointCCParticleSystemQuad (点粒子和方形粒子系统,都继承了CCParticleSystem的所有属性)
-- CCParticleExplosion (爆炸粒子效果)
-- CCParticleFireworks (烟花粒子效果)
-- CCParticleFire (火焰粒子效果)
-- CCParticleFlower (花束粒子效果)
-- CCParticleGalaxy (星系粒子效果)
-- CCParticleMeteor (流星粒子效果)
-- CCParticleSpiral (漩涡粒子效果)
-- CCParticleSnow (雪粒子效果)
-- CCParticleSmoke (烟粒子效果)
-- CCParticleSun (太阳粒子效果)
-- CCParticleRain (雨粒子效果)

添加一个雪花效果

CCParticleSystem *particle = CCParticleSnow::node();
particle = setTexture(CCTextureCache::sharedTextureCache()->addImage("snow.png"));
this->addChild(particle);

自定义粒子效果

创建一个全新的粒子效果需要设定的参数很繁杂,并且为了使呈现效果与预期相符,我们不得不反复修改参数。

bool ParticleBoma::initWithTotalParticles( unsigned int numberofParticles )
{
        if( CCParticleSystemQuad::initWithTotalParticles(numberofParticles) )
        {
                // duration   设置这个粒子效果的时间,如果设成kCCParticleDurationInfinity时表示着个粒子效果为永远,它的计时单位为秒
                m_fDuration =0.3f;
                // Gravity Mode
                m_nEmitterMode = kCCParticleModeGravity;
                // Gravity Mode: gravity
                modeA.gravity = ccp(0,0);
                // Gravity Mode: 定义粒子的发射速度
                modeA.speed = 80;
                modeA.speedVar = 0;
                // Gravity Mode: 设置径向加速度
                modeA.radialAccel = 0;
                modeA.radialAccelVar = 0;
                // Gravity Mode: 设置切向加速度
                modeA.tangentialAccel = 0;
                modeA.tangentialAccelVar = 0;
                // angle  
                m_fAngle = 180;
                m_fAngleVar = 360;
                // emitter position
                CCSize winSize = CCDirector::sharedDirector()->getWinSize();
                this->setPosition(ccp(winSize.width/2, winSize.height/2));
                m_tPosVar = CCPointZero;
                // life of particles 生命周期的长度
                m_fLife = 2;
                m_fLifeVar = 1;
                // size, in pixel下面面两句话的意思是粒子开始出现时的大小事在20.0f,到30.0f之间随机生成的
                m_fStartSize = 20.0f;
                m_fStartSizeVar = 10.0f;
                m_fEndSize = kCCParticleStartSizeEqualToEndSize;
                // emits per second
                m_fEmissionRate = m_uTotalParticles/m_fLife;
                // color of particles  设置粒子的初始颜色,到结束时的颜色演变过程
                m_tStartColor.r = 0.00f;
                m_tStartColor.g = 1.00f;
                m_tStartColor.b = 0.00f;
                m_tStartColor.a = 1.0f;
                m_tStartColorVar.r = 1.0f;
                m_tStartColorVar.g = 1.0f;
                m_tStartColorVar.b = 0.0f;
                m_tStartColorVar.a = 1.0f;
                m_tEndColor.r = 0.0f;
                m_tEndColor.g = 0.0f;
                m_tEndColor.b = 0.0f;
                m_tEndColor.a = 0.01f;
                m_tEndColorVar.r = 0.0f;
                m_tEndColorVar.g = 0.0f;
                m_tEndColorVar.b = 0.0f;
                m_tEndColorVar.a = 0.0f;
                // additive
                this->setBlendAdditive(true);
                return true;
        }
        return false;
}
文章目录
  1. 1. cocos2dx中的粒子系统
    1. 1.1. 内置的几种粒子效果
    2. 1.2. 添加一个雪花效果
  2. 2. 自定义粒子效果