cocos2d-x:Particle System(粒子系統)


一、粒子系統簡介:

粒子系統最早出現在80年代,主要用於解決由大量按一定規則運動(變化)的微小物質在計算機上的生成和顯示問題。Particle System的應用非常廣泛,大的可以模擬原子彈爆炸,星雲變化,小的可以模擬水波、火焰、煙火、雲霧等,而這些自然現象用常規的圖形算法是很難逼真再現的。
Particle System可以說是一種基於物理模型來解決問題的方法,它的核心不在於如何顯示,而在用於對微小物質模型的規則提取。
粒子運動(變化)的規則可以很簡單也可以很復雜,這取決你所模擬的對象。舉例來說,在對FireWorks(煙火)的模擬中,我們可以讓煙火由上百個小的粒子組成,每個粒子都具有以下一些屬性及其規則(對各個屬性施加不同的規則,就可以獲得不同形態的煙火):
 
Coordinate(坐標)
在煙火爆炸的時刻,每個粒子都有一個相同的初始坐標,隨着時間的推移,粒子的新坐標將由它的舊坐標和加速度來求得
Velocity(速度)
每個粒子都有一個隨機產生的初始速度,粒子的新速度由加速度和空氣阻尼來求得
Acceleration(加速度)
在煙火中,每個粒子的加速度都等於重力加速度
Color(顏色)
粒子顏色取決於粒子的速度或生命值的大小
Life(生命值)
每個粒子都有一個初始的隨機生命值,這個值將隨着時間的推移而逐漸減小,直到等於0
 
你會發現,Particle System中的粒子與C++中類的概念有些類似,實際上你完全可以將它當成類來處理,一個粒子就是一個類的實例對象,只不過有時在涉及程序優化的具體細節上,你需要放棄使用類,而使用簡單而快速的緊湊代碼。
 
Particle System雖然在處理大量單獨粒子的運動(變化)上很有用處,但是一涉及到需要考慮粒子間相互作用的場合,因為這時的計算量呈粒子數量的指數級增長,它就顯得有些力不從心了。比如在模擬有相互引力作用下的大量星體的運動,大量粒子的相互碰撞等。
 
二、粒子系統的生命周期

首先,從粒子池中獲取一個粒子,
然后計算賦予初始屬性后,發射他。
在粒子飛行過程中,不斷的刷新來修正他的屬性。
粒子死亡后,回歸粒子池。
 1     function getEmitter(idx)
 2         local emitter = cc.ParticleSnow:create()      --創建一個雪花粒子發射器
 3         emitter:setDuration(-1)                       --設置發射粒子的持續時間-1表示一直發射,0沒有意義,其他值表示持續時間 
 4         emitter:setPosition(300, 1300)                --設置粒子發射器的位置  
 5         emitter:setLife(10)                           --設置粒子的生命值
 6         emitter:setLifeVar(1)                         --設置粒子生命值衰減變化率
 7 
 8         emitter:setGravity(cc.p(0, -10))              --設置粒子重力方向,這個點是相對發射點,x正方向為右,y正方向為上 
 9         emitter:setSpeed(130)                         --設置粒子速度
10         emitter:setSpeedVar(40)                       --設置速度變化率  
11 
12         local startColor = emitter:getStartColor()    --設置粒子開始的顏色  
13         startColor.r = 0.9
14         startColor.g = 0.9
15         startColor.b = 0.9
16         emitter:setStartColor(startColor)
17 
18         local startColorVar = emitter:getStartColorVar()
19         startColorVar.b = 0.1
20         emitter:setStartColorVar(startColorVar)       --設置粒子顏色變化率  
21         local size = cc.Sprite:create("commonUI/newres/snow/snow_" .. idx .. ".png"):getContentSize()
22         emitter:setStartSize(size.width)
23         emitter:setEndSize(size.width / 3)            --設置粒子開始的大小
24         emitter:setEndSizeVar(size.width / 3 / emitter:getLife())  ----設置粒子生命結束時的大小
25         if idx == 3 then
26             emitter:setEmissionRate(emitter:getTotalParticles() / emitter:getLife() / 2)  --設置發射器每秒鍾發射的粒子個數
27         else
28             emitter:setEmissionRate(emitter:getTotalParticles() / emitter:getLife() / 20)
29             emitter:setTotalParticles(8)              --設置總的粒子個數
30         end
31 
32         emitter:setTexture(cc.Director:getInstance():getTextureCache():addImage("commonUI/newres/snow/snow_" .. idx .. ".png")) --設置發射的粒子圖片
33         return emitter
34     end

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM