知易遊戲開發教程cocos2d-x移植版007

原文: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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章