cocos2d-x (四)粒子特效相關說明

ufolr原創,轉載請註明:

轉載自ufolr的博客 原文連接:http://blog.csdn.net/ufolr/article/details/7470831


        在遊戲中很多特效需要我們去實現,以增加我們遊戲的視覺感和飽滿度,很多特效我們可以用動畫來實現,但是使用動畫來實現特效,畫面的自然程度很差,而且如果美工不給力的話,特效效果也會很不盡人意,同時調整一個動畫的細節也會相對的比較麻煩。所以我們使用粒子特效來實現一些需要自然感,帶有隨機性的特效。如火焰,爆炸,煙花等等都可以用粒子特效來實現。

粒子運行基本流程:

        粒子特效實質是很多的精靈,通過粒子系統賦給每個精靈初始屬性,然後由發射器發射出來,並在粒子發射的過程中不斷的刷新,更新他的屬性,讓粒子按照設定的方式變換。當粒子壽命到期後,粒子消亡,回到帶發射狀態,等待初始化發射。如下圖所示:




粒子屬性設定:

Variance 波動範圍:即實際值在原設定值上隨機波動的範圍(誤差),實際值 = 原設定值 + var(var爲波動範圍內任意值,可正可負),例如Lifespan=5Lifespan Variance=3 那麼隨機出來的結果就是5-3到5+3,即2~8的任意數。



控制例子相對類型:

       設置方法:my->setPositionType(kCCPositionTypeRelative);//設置爲不跟隨屏幕

                                                                      kCCPositionTypeFree//相對屏幕自由

                                                                      kCCPositionTypeRelative //相對被綁定精靈靜止

                                                                     kCCPositionTypeGrouped//相對發射點,可向上


發射器屬性設定:

        發射器分:重力模式和半徑模式(放射模式),重力模式下重力模式的粒子參數生效(半徑模式參數無效),半徑模式下半徑模式的參數生效(重力模式參數無效);




OpenGL混合相關說明:


#1神馬是混合?

      混合就是把兩種顏色混在一起。具體一點,就是把某一像素位置原來的顏色和將要畫上去的顏色,通過某種方式混在一起,從而實現特殊的效果。

      假設我們需要繪製這樣一個場景:透過紅色的玻璃去看綠色的物體,那麼可以先繪製綠色的物體,再繪製紅色玻璃。在繪製紅色玻璃的時候,利用“混合”功能,把將要繪製上去的紅色和原來的綠色進行混合,於是得到一種新的顏色,看上去就好像玻璃是半透明的。 

#2混合中的術語

      前面我們已經提到,混合需要把原來的顏色和將要畫上去的顏色找出來,經過某種方式處理後得到一種新的顏色。這裏把將要畫上去的顏色稱爲“源顏色”,如上例中的紅色;把原來的顏色稱爲“目標顏色”,如上例中的綠色。

      OpenGL會把源顏色和目標顏色各自取出,並乘以一個係數(源顏色乘以的係數稱爲“源因子”,目標顏色乘以的係數稱爲“目標因子”),然後相加,這樣就得到了新的顏色。(也可以不是相加,新版本的OpenGL可以設置運算方式,包括加、減、取兩者中較大的、取兩者中較小的、邏輯運算等,但我們這裏爲了簡單起見,不討論這個了) 

#3混合公式

      下面用數學公式來表達一下這個運算方式。假設源顏色的四個分量(指紅色,綠色,藍色,alpha值)是(Rs, Gs, Bs, As),目標顏色的四個分量是(Rd, Gd, Bd, Ad),又設源因子爲(Sr, Sg, Sb, Sa),目標因子爲(Dr, Dg, Db, Da)。則混合產生的新顏色可以表示爲:

(Rs*Sr+Rd*Dr, Gs*Sg+Gd*Dg, Bs*Sb+Bd*Db, As*Sa+Ad*Da)

當然了,如果顏色的某一分量超過了1.0,則它會被自動截取爲1.0,不需要考慮越界的問題。 

#4各種混合因子

      在OpenGL中,源因子和目標因子是可以通過glBlendFunc函數來進行設置的。glBlendFunc有兩個參數,前者表示源因子,後者表示目標因子。這兩個參數可以是多種值,下面介紹比較常用的幾種。

GL_ZERO:      表示使用0.0作爲因子,實際上相當於不使用這種顏色參與混合運算。

GL_ONE:       表示使用1.0作爲因子,實際上相當於完全的使用了這種顏色參與混合運算。

GL_SRC_ALPHA:表示使用源顏色的alpha值來作爲因子。

GL_DST_ALPHA:表示使用目標顏色的alpha值來作爲因子。

GL_ONE_MINUS_SRC_ALPHA:表示用1.0減去源顏色的alpha值來作爲因子。

GL_ONE_MINUS_DST_ALPHA:表示用1.0減去目標顏色的alpha值來作爲因子。

      除此以外,還有GL_SRC_COLOR(把源顏色的四個分量分別作爲因子的四個分量)、GL_ONE_MINUS_SRC_COLOR、GL_DST_COLOR、GL_ONE_MINUS_DST_COLOR等,前兩個在OpenGL舊版本中只能用於設置目標因子,後兩個在OpenGL舊版本中只能用於設置源因子。新版本的OpenGL則沒有這個限制,並且支持新的GL_CONST_COLOR(設定一種常數顏色,將其四個分量分別作爲因子的四個分量)、GL_ONE_MINUS_CONST_COLOR、GL_CONST_ALPHA、GL_ONE_MINUS_CONST_ALPHA。另外還有GL_SRC_ALPHA_SATURATE。新版本的OpenGL還允許顏色的alpha值和RGB值採用不同的混合因子。但這些都不是我們現在所需要了解的。畢竟這還是入門教材,不需要整得太複雜~

舉例來說:

      如果設置了glBlendFunc(GL_ONE, GL_ZERO);,則表示完全使用源顏色,完全不使用目標顏色,因此畫面效果和不使用混合的時候一致(當然效率可能會低一點點)。如果沒有設置源因子和目標因子,則默認情況就是這樣的設置。

      如果設置了glBlendFunc(GL_ZERO, GL_ONE);,則表示完全不使用源顏色,因此無論你想畫什麼,最後都不會被畫上去了。(但這並不是說這樣設置就沒有用,有些時候可能有特殊用途)

      如果設置了glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);,則表示源顏色乘以自身的alpha值,目標顏色乘以1.0減去源顏色的alpha值,這樣一來,源顏色的alpha值越大,則產生的新顏色中源顏色所佔比例就越大,而目標顏色所佔比例則減小。這種情況下,我們可以簡單的將源顏色的alpha值理解爲“不透明度”。這也是混合時最常用的方式。

      如果設置了glBlendFunc(GL_ONE, GL_ONE);,則表示完全使用源顏色和目標顏色,最終的顏色實際上就是兩種顏色的簡單相加。例如紅色(1, 0, 0)和綠色(0, 1, 0)相加得到(1, 1, 0),結果爲黃色。

注意:

      所謂源顏色和目標顏色,是跟繪製的順序有關的。假如先繪製了一個紅色的物體,再在其上繪製綠色的物體。則綠色是源顏色,紅色是目標顏色。如果順序反過來,則紅色就是源顏色,綠色纔是目標顏色。在繪製時,應該注意順序,使得繪製的源顏色與設置的源因子對應,目標顏色與設置的目標因子對應。不要被混亂的順序搞暈了。


#5混合舉例:

glBlendFunc(GL_ONE,GL_ZERO)



glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)



glBlendFunc(GL_ONE,GL_ONE)



紋理Texture:

      紋理Texture相當於是每一個粒子的原型,整個粒子特效就是由無數個這樣的粒子組成。粒子的貼圖沒有具體限制,可以是灰度圖,也可以是一張具體的圖片。但要小於64x64pixel(大小限制帶驗證,貌似我覺得沒有大小限制)。

添加粒子:

       只要通過編輯器製作好了粒子特效的plist文件,我們只需把plist和它對應的Textrue原圖放到資源文件夾下,然後兩句代碼就搞定了:

      

  1. CCParticleSystem *test=CCParticleSystemQuad::particleWithFile("test.plist");   
  2.    
  3. test->setPosition(ccp(size.width/2,size.height/2));   
  4.    
  5. this->addChild(test);   

      原圖的加載信息是包含在plist文件中的,我們直接加載plist就可以了。

            這就是基本的粒子特效的說明了,粒子特效配合重力模式、半徑模式的參數調教,可以得到很多意想不到的效果,建議大家多嘗試,會有意外收貨~。粒子特效博大精深,後面還有什麼心得體會我會直接寫進來

發佈了37 篇原創文章 · 獲贊 19 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章