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);
執行效果:
以上。