1. 程式人生 > >COCOS學習筆記--粒子系統

COCOS學習筆記--粒子系統

一.粒子系統的簡介

粒子系統是指計算機圖形學中模擬特定現象的技術,它在模仿自然現象、物理現象及空間扭曲上具備得天獨厚的優勢,為我們實現一些真實自然而又帶有隨機性的特效(如爆炸、煙花、水流)提供了方便。Cocos2d-x引擎中就提供了強大的粒子系統。

二.粒子的種類介紹

下圖為粒子系統類關係圖:

 

ParticleSystem為粒子系統的父類,ParticleSystemQuad為方形粒子系統類,在cocos3.0版本之前還有ParticleSystemPoint即點形粒子系統,3.0版本後被去掉了。

ParticleSystemQuad有以下各種各樣的子類,我們可以直接用create()方法創建出以下各種粒子特效,addChild()後就可以播放特效了:

ParticleExplosion 爆炸粒子

ParticleFire 火焰粒子

ParticleFireworks 煙火粒子

ParticleFlower 花瓣粒子

ParticleGalaxy 銀河粒子

ParticleMeteor 流星粒子

ParticleRain 雨滴粒子

ParticleSmoke 煙霧粒子

ParticleSnow 雪粒子

ParticleSpiral 旋渦粒子

ParticleSun 陽光粒子

三.粒子的屬性設定

粒子發射器以及發射出來的粒子有好多屬性可以供我們設定:

_duration 發射器生存時間,即它可以發射粒子的時間,注意這個時間和粒子的生存時間不同。單位秒,-1表示永遠:粒子發射結束後可點選工具欄的播放按鈕再次發射;

_emissionRate 發射器每秒噴發的粒子數目;

_totalParticles 場景中存在的最大粒子數目,往往與_emissionRate配合起來使用;

isAutoRemoveOnFinish 粒子結束時是否自動刪除;

_emitterMode 噴發器模式,有重力模式(GRAVITY)和半徑模式(RADIUS,也叫放射模式)兩種;

重力模式(modeA):

顧名思義,重力模式是模擬重力,可讓粒子圍繞一箇中心點移近或移遠,它的優點是非常動態,而且移動有規則。下列各屬性只在重力模式下起作用:

gravity 重力X;

radiaAccel 粒子徑向加速度,即平行於重力方向的加速度;

radiaAccelVar

 粒子徑向加速度變化範圍;

speed 速度;

speed Var 速度變化範圍;

tangentialAccel 粒子切向加速度,即垂直於重力方向的加速度;

tangentialAccelVar 粒子切向加速度變化範圍

半徑模式(modeB):

半徑模式可以使粒子以圓周方式旋轉,它也可以創造螺旋效果讓粒子急速前進或後退。下列屬性只在半徑模式下起作用:

endRadius 結束半徑

endRadiusVar 結束半徑變化範圍,即結束半徑值的範圍在(endRadius-endRadiusVar)和(endRadius+endRadiusVar)之間,下面類似;

rotatePerSecond 粒子每秒圍繞起始點的旋轉角度;

rotatePerSecondVar 粒子每秒圍繞起始點的旋轉角度變化範圍;

startRadius 初始半徑;

startRadiusVar 初始半徑變化範圍;

生命屬性:

_life 粒子生命,即粒子的生存時間;

_lifeVar 粒子生命變化範圍;

大小屬性:

_endSize 粒子結束時的大小,-1表示和初始大小一致;

_endSizeVar 粒子結束大小的變化範圍;

角度屬性:

_angle 粒子角度;

_angleVar 粒子角度變化範圍;

顏色屬性:

_endColor 粒子結束顏色;

_endColorVar 粒子結束顏色變化範圍;

_startColor 粒子初始顏色;

_startColorVar 粒子初始顏色變化範圍;

如果你不想編輯出五顏六色的粒子效果,那應該把_endColorVar,_startColorVar儘量設定為(0,0,0,0)。

位置屬性:

_sourcePosition發射器原始座標位置;

_posVar 發射器位置的變化範圍(橫向和縱向);

_positionType 粒子位置型別,有自由模式(FREE)、相對模式(RELATIVE)、和打組模式(GROUPED)三種;

FREE自由模式,相對於螢幕自由,不會隨著粒子節點移動而移動(可產生火焰、蒸汽等效果);

RELATIVE相對模式,相對於被繫結的node靜止,粒子發射器會隨node移動而移動,可用於製作移動角色身上的特效等等;

GROUPED打組模式 是相對於發射點的,粒子隨發射器移動而移動;

自旋屬性:

_endSpin 粒子結束自旋角度;

_endSpinVar 粒子結束自旋角度變化範圍;

_startSpin 粒子開始自旋角度;

_startSpinVar 粒子開始自旋角度變化範圍;

四.編寫程式碼生成粒子

直接使用create()方法創建出特效,然後addChild(),比如:

建立爆炸效果粒子特效:

//引數:粒子數
auto _pe = ParticleExplosion::createWithTotalParticles(200);
addChild(_pe);

執行效果:

 

建立火焰效果粒子特效:

//引數:粒子數
auto _pf = ParticleFire::createWithTotalParticles(200);
addChild(_pf);

執行效果:


另外,基類ParticleSystemQuad設定屬性可調整效果:

</pre>/<pre name="code" class="cpp">/建立ParticleSystemQuad
ParticleSystemQuad * _emitter = ParticleSystemQuad::createWithTotalParticles(300);
_emitter->retain();
addChild(_emitter,10);

//設定粒子使用哪一張貼圖
_emitter->setTexture(Director::getInstance()->getTextureCache()->addImage("haha.jpg"));

//設定發射器持續時間
//-1為永遠存在
_emitter->setDuration(-1);

//設定重力
_emitter->setGravity(Vec2::ZERO);

//設定角度及其變化範圍
_emitter->setAngle(90);
_emitter->setAngleVar(360);

//設定速度及其變化範圍
_emitter->setSpeed(160);
_emitter->setSpeedVar(20);

//設定粒子半徑及其變化範圍
_emitter->setRadialAccel(-120);
_emitter->setRadialAccelVar(0);
//設定正切角度及其變化範圍
_emitter->setTangentialAccel(30);
_emitter->setTangentialAccelVar(0);

//設定發射器位置
_emitter->setPosition(Vec2(160,240));

//設定粒子生命週期及其變化範圍
_emitter->setLife(3);
_emitter->setLifeVar(1);

//設定粒子開始、結束旋轉角度
_emitter->setStartSpin(0);
_emitter->setStartSpinVar(0);
_emitter->setEndSpin(0);
_emitter->setEndSpinVar(2000);

//設定粒子顏色
Color4F startColor(0.5f,0.5f,0.5f,1.0f);
_emitter->setStartColor(startColor);
Color4F startColorVar(0.5f, 0.5f, 0.5f, 1.0f);
_emitter->setStartColor(startColorVar);
Color4F endColor(0.1f, 0.1f, 0.1f, 0.2f);
_emitter->setStartColor(endColor);
Color4F endColorVar(0.1f, 0.1f, 0.1f, 0.2f);
_emitter->setStartColor(endColorVar);

//設定粒子大小
_emitter->setStartSize(30.0f);
_emitter->setStartSizeVar(0.0f);
_emitter->setEndSize(ParticleSystem::START_SIZE_EQUAL_TO_END_SIZE);

//設定發射速率
_emitter->setEmissionRate(_emitter->getTotalParticles()/_emitter->getLife());

//設定閃現效果
_emitter->setBlendAdditive(false);

執行效果:

 

以上。