原文:http://www.cnblogs.com/cocos2d-x/archive/2012/06/10/2544260.html
在新的一章中,知易帶來了粒子系統的相關知識。如果你不清楚粒子系統到底是怎麼一回事,那就趕快來看一下吧。
爲什麼需要粒子系統
在示例6中,我們通過一組圖片實現了炮彈的爆炸效果,這是遊戲開發中常見的表現手法之一,它的理論基礎就是動畫。但是如果我們希望模擬更加真實的效果,比如煙霧、閃電、雨雪、火焰等,我們就需要使用另外一個工具——粒子系統。
粒子系統是計算機圖形學中模擬模糊現象的技術之一。一般來說,爲了表現某一現象,會有大量的微小粒子被創建出來。從宏觀上講,這些粒子是一個整體,它們是確定的可控的;從微觀上講,這些粒子各自爲戰,每一個個體都保持着自身的隨機性。
粒子系統能讓你的玩家眼前一亮,整個遊戲都靈動起來。
科普一下
1983年先驅William T. Reeves在《Computer Graphics》上發表了《Particle Systems: A Technique for Modeling a Class of Fuzzy Objects》一文。他向人們介紹了在《Star Trek II: The Wrath of Khan》中使用的粒子系統,被認爲是最早掌握此係統的人之一。
維基百科上寫的是William "Bill" Reeves,論文上署名的是William T. Reeves,我想應該是同一個人吧,盧卡斯影業的大牛,皮克斯的創始員工之一。
有興趣的朋友可以去拜讀一下大師的文章,十多頁,我水平有限,看得很慢,只看了個開頭。
使用粒子系統
額,這方面的知識還真是繁雜啊,爲了避免一知半解誤導大家,所以關於粒子系統的詳細介紹請參看知易原教程第7章
http://blog.sina.com.cn/s/blog_537cabb80100i0qu.html
或者老G的學習筆記14
http://4137613.blog.51cto.com/4127613/767801
讓我們跳過枯燥的原理和參數介紹,關注最基本的使用。
1)基本用法
像其他類一樣,cocos2d-x的粒子效果類也提供了靜態函數以方便我們創建其實例。
1 emitter2 = CCParticleSun::node(); 2 emitter2->retain(); 3 emitter2->setTexture(CCTextureCache::sharedTextureCache()->addImage(s_fire)); 4 emitter2->setPosVar(ccp(3, 3)); 5 emitter2->setStartSize(20.0f); 6 emitter2->setStartSizeVar(2.0f); 7 emitter2->setEndSize(0.0f); 8 emitter2->setEndSizeVar(0.0f); 9 ccColor4F endColor2 = { 0.0f, 0.0f, 0.0f, 0.1f }; 10 emitter2->setEndColor(endColor2); 11 emitter2->stopSystem(); 12 addChild(emitter2);
使用這種方法的缺點是我們不能指定粒子的數量,因爲它在init內固定了這個值。
1 class CC_DLL CCParticleSun : public ARCH_OPTIMAL_PARTICLE_SYSTEM 2 { 3 public: 4 CCParticleSun(){} 5 virtual ~CCParticleSun(){} 6 // 使用node方法創建的對象實例默認350個粒子 7 bool init(){ return initWithTotalParticles(350); } 8 virtual bool initWithTotalParticles(unsigned int numberOfParticles); 9 static CCParticleSun * node() 10 { 11 CCParticleSun *pRet = new CCParticleSun(); 12 if (pRet->init()) 13 { 14 pRet->autorelease(); 15 return pRet; 16 } 17 CC_SAFE_DELETE(pRet) 18 return NULL; 19 } 20 };
2)更靈活的應用
爲了定製粒子的數量,我們會使用另外一種方法:
1 emitter2 = new CCParticleSun(); 2 emitter2->initWithTotalParticles(250); 3 emitter2->setTexture(CCTextureCache::sharedTextureCache()->addImage(s_fire)); 4 emitter2->setPosVar(ccp(3, 3)); 5 emitter2->setStartSize(20.0f); 6 emitter2->setStartSizeVar(2.0f); 7 emitter2->setEndSize(0.0f); 8 emitter2->setEndSizeVar(0.0f); 9 ccColor4F endColor2 = { 0.0f, 0.0f, 0.0f, 0.1f }; 10 emitter2->setEndColor(endColor2); 11 emitter2->stopSystem();
3)第三種方式
還有一種方式,那就是使用粒子編輯器來創建粒子效果文件。我還沒有嘗試過這種方法,只能以後再補充啦。
注意事項
需要注意的是,無論使用哪種方式來創建粒子效果對象,請確保設置了紋理,否則渲染時會崩潰。
此外,這裏還涉及到cocos2d-x中對象生命週期的管理。
如果你使用方法一,並將創建的對象保存在成員變量中,那麼需要調用retain來避免其自動釋放掉,並記得在不用的時候調用release來釋放。
如果你使用的是方法二,你要時刻記住“誰申請誰就負責釋放”的原則。不過對於這些CCObject對象,請使用release來代替直接delete掉,因爲它可能不止一份引用。
小結
雖然繁雜的參數稍稍變動可能就有一個新的效果,但是不要有任何心裏負擔,你要堅定信心,常用的就那麼幾個,用的多了自然就會得心應手。粒子系統中不同效果的使用方法是相通的,即便是一個沒用過的新效果,只要稍微學習一下,也可以立馬上手的。
示例7
在上一個示例的基礎上,我們只做兩處更改,給敵方坦克的炮彈增加煙霧效果,給我方坦克的炮彈增加火焰效果。
都是非常簡單的調用,如果遇到問題,可以參考我上傳的代碼。
http://files.cnblogs.com/cocos2d-x/ZYG007.rar