cocos2dx 粒子系统CCParticleSystem

cocos2dx 粒子系统CCParticleSystem,第1张

概述【唠叨】     粒子系统CCParticleSystem,第一次听到这名词,感觉好高级的样子啊。     其实在游戏中我们也经常能见到的,像燃烧的火焰、飘散的烟雾、爆炸、暴风雪、流星、雨水、闪电等等都是粒子特效。     给大家看一张甜美的粒子特效:     因为粒子系统的知识比较复杂,所以在这里,强烈建议大家下载一个粒子编辑器,通过编辑粒子特效,来学习粒子系统。     我就是借助了以下这个“

【唠叨】

粒子系统CCParticleSystem,第一次听到这名词,感觉好高级的样子啊。

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" alt="i_f32.gif" src="http://www.dexcoder.com/images/201507/DxFa3Ed70jy4TzdF.gif">

其实在游戏中我们也经常能见到的,像燃烧的火焰、飘散的烟雾、爆炸、暴风雪、流星、雨水、闪电等等都是粒子特效。

给大家看一张甜美的粒子特效:

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="1.gif" alt="wKiom1QDNBzj9IYzAAIDuD0EWgc443.gif" src="http://www.dexcoder.com/images/201507/eh3vDkjHBn0dfnXU.gif">

因为粒子系统的知识比较复杂,所以在这里,强烈建议大家下载一个粒子编辑器,通过编辑粒子特效,来学习粒子系统。

我就是借助了以下这个“红孩儿工具箱”,来学习粒子系统的。

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="honghaIEr.jpg" alt="wKiol1QEcDHCSmagAAOnZyku2N8610.jpg" src="http://www.dexcoder.com/images/201507/PNckLFkhwYbRU5d1.jpg">

【致谢】

http://blog.csdn.net/honghaier(提供了强大的“红孩儿工具箱”)

http://www.jb51.cc/article/p-kxbrzgaj-vm.html(提供了详细的原理)

【小知识】

浮动值Var:表示随机上下浮动的修正值。实际值 = 原始值 + 浮动值Var。

如:原始值为5,浮动值Var为2。那么实际值取值范围:3~7。

【Demo下载】

http://down.51cto.com/data/1869970

【3.x】

(1)去掉“CC”

(2)粒子位置模式tpositionType改为强枚举类型ParticleSystem::positionType::

//	ParticleSystem::positionType::FREE//自由模式:不与发射器联系,自己走自己的路线	ParticleSystem::positionType::relative//相对模式:粒子发射器随粒子节点的移动而移动	ParticleSystem::positionType::GROUPED//相对模式:粒子群随粒子发射器的移动而移动//

(3)发射器模式kCCParticleModeGravity /kCCParticleModeRadius

改为强枚举类型:ParticleSystem::Mode::

//	ParticleSystem::Mode::GraviTY//重力发射器	ParticleSystem::Mode::RADIUS//半径发射器//

(4)其他变化不大。

【CCParticleSystem】

CCParticleSystem为粒子系统的主要类,它的父类为CCNode和CCTextureProtocol。由此可见粒子系统包含了一张纹理图片用于显示。而它还有一个子类CCParticleSystemQuad,该类只是在父类的基础上,又加了一些属性。而我们主要关注的是CCParticleSystemQuad这个类的用法。

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="1.jpg" alt="wKiom1QDRL2ySa0RAAB3E8pel4U629.jpg" src="http://www.dexcoder.com/images/201507/3dc05qo4xYFQWcwK.jpg">

1、原理

首先来讲讲粒子系统的工作原理。

粒子系统主要由两部分组成:粒子粒子发射器

粒子的生命周期:出生、成长、死亡。

(1)在引擎中存在一个粒子池,存放了待激活的粒子。发射器每次从粒子池中获取一个粒子,然后计算赋予粒子初始的属性(速度、大小、方向、生存时间等)后,将粒子发射出去。

(2)粒子被发射出去后,会不断地刷新来修正它的属性。

(3)当粒子的生存时间结束后,粒子就会死亡,然后重新被粒子池回收,等待下一次的激活。

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="2.jpg" alt="wKiol1QECSSgjpeKAADb_BXNzm0765.jpg" src="http://www.dexcoder.com/images/201507/1ZfmpAeb6eqdfePM.jpg">

来个具体的粒子发射图:

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="3.jpg" alt="wKiol1QEDROhCtOaAAC1ZbM30x0928.jpg" src="http://www.dexcoder.com/images/201507/C9WJmkeNu4Cp3TFI.jpg">

2、粒子属性

粒子发射器每秒会发射许许多多的粒子,而每个粒子在发射时,都会被赋予粒子相关的属性。另外值得注意的是:粒子被赋予的属性并不是全部一样的,发射器会根据原始值与浮动值Var进行设置。这样就能保证每个粒子会有不同的展现效果。

浮动值Var:表示随机上下浮动的修正值。实际值 = 原始值 + 浮动值Var。

如:原始值为5,浮动值Var为2。那么实际值取值范围:3~7。

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="111.jpg" alt="wKiol1QEK8SQZSvjAATSneo4-cY762.jpg" src="http://www.dexcoder.com/images/201507/bIRh7jgoApMTGCXQ.jpg">

3、发射器属性

发射器有两种类型:重力发射器模式、半径发射器模式。

3.1、发射器共有属性

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="pp.jpg" alt="wKiol1QEbeLgkH8WAAXgZ7s00Y4897.jpg" src="http://www.dexcoder.com/images/201507/9Qoz4AokQ2CM34z3.jpg">

3.2、重力发射器

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="pg.jpg" alt="wKiol1QEbrrwKbW7AAOY4mNgRnM563.jpg" src="http://www.dexcoder.com/images/201507/0Mfeq3o4AcRDEluD.jpg">

3.3、半径发射器

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="pr.jpg" alt="wKiom1QEbtLSkUWHAAL2ODJMw3s396.jpg" src="http://www.dexcoder.com/images/201507/auO8cElxWl0IW1wl.jpg">

4、现成粒子特效

cocos2dx引擎中为我们提供了一些粒子效果的类,这些类是为了方便开发者直接用于表现某种粒子效果的。

如下列出11种粒子特效:

粒子特效类 中文名 特效图
CCParticleExplosion 爆炸特效

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="exp.gif" alt="wKiol1QElTnxsvynAAOhhjdFpnQ245.gif" src="http://www.dexcoder.com/images/201507/EMxNc0gSfybkawvc.gif">

CCParticleFire 火焰特效

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="fire.gif" alt="wKiol1QElXfxvPr4AAJ5EL27VA4957.gif" src="http://www.dexcoder.com/images/201507/gW41gsoVDWUg5iWp.gif">

CCParticleFlower 花束特效

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="flower.gif" alt="wKiol1QElpCBGs-fAAM5uk4Fkwo114.gif" src="http://www.dexcoder.com/images/201507/7hy6xrdNtCzbuocg.gif">

CCParticleFireworks 烟花特效

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="fireworks.gif" alt="wKiom1QElpDCz8dVAAHRRjeRu8U947.gif" src="http://www.dexcoder.com/images/201507/j3oMiYpy7RD7tdAO.gif">

CCParticlegalaxy 星系特效

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="galaxy.gif" alt="wKiom1QElpCTS1fBAAHGotw6_5g755.gif" src="http://www.dexcoder.com/images/201507/N9QiBocd0UZ1wZu5.gif">

CCParticleMeteor 流星特效

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="Meteor.gif" alt="wKiol1QElpGA-JsyAALJgHqUsUY422.gif" src="http://www.dexcoder.com/images/201507/IEP5vOqFUe2fCbSV.gif">

CCParticleRain 下雨特效

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="Rain.gif" alt="wKiom1QElpHic2uAAADWya6Jcl8519.gif" src="http://www.dexcoder.com/images/201507/GSWg2wofsH6CLliS.gif">

CCParticleSmoke 烟雾特效

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="Smoke.gif" alt="wKiol1QElxuBhfVlAAHNxnAtaDc841.gif" src="http://www.dexcoder.com/images/201507/WhPgIJi14vFpfldb.gif">

CCParticleSNow 下雪特效

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="SNow.gif" alt="wKiol1QElpHxVbpCAAcTynw2yOY759.gif" src="http://www.dexcoder.com/images/201507/v9xgMznhbr1OnDv2.gif">

CCParticleSpiral 漩涡特效

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="Spiral.gif" alt="wKiom1QElpKgVyqnAA-UOFdZTZ4915.gif" src="http://www.dexcoder.com/images/201507/7StZ8wdKVU5bxwkO.gif">

CCParticleSun 太阳特效

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="Sun.gif" alt="wKiol1QElplt2r3LAACvjfQFuCQ333.gif" src="http://www.dexcoder.com/images/201507/t3p1dFnBS3bTPox9.gif">

5、混合方式

参考:http://www.jb51.cc/article/p-fpnoljdp-wx.html

粒子发射器一般都会发射大量的粒子出来,必然会有许多的粒子重叠或者交叉在一起。

所以对于粒子纹理图片的混合方式,在很大程度上影响了视觉效果。

使用方法如下举例:

//	//{源因子,混合因子}	ccBlendFunccbl={GL_SRC_Alpha,GL_ONE_MINUS_SRC_Alpha};	emitter->setBlendFunc(cbl);//

6、粒子纹理

介绍粒子系统类的继承关系时,其中包含了CCTextureProtocol这个纹理协议类。如果没有纹理图片的话,所有粒子将会是单调的色块。如果想要精美的视觉效果,就要考虑在粒子效果中使用纹理了。

值得注意的是:不要因为粒子会很小而忽略它的纹理图片,如果没有设置纹理属性的具体值,那么引擎就会设定一个默认正方形的纹理,多数情况下,效果是非常差的。最好的方式是使用一个球形的图片,其透明度为半透明的。

还有重要的一点:就是图片的尺寸最好不要超过64像素*64像素。因为贴图尺寸越小,粒子效果就运行得越流畅,画面也更加细腻。同时,由于粒子效果就是依靠粒子相互叠加产生的画面效果。如果纹理过大的话,叠加太多就会变成了白色区域。

PS:粒子系统还可以在发生粒子的过程中,动态改变纹理贴图,使用setTexture()。

通过如下例子来设置纹理:

//	emitter->setTexture(CCTextureCache::sharedTextureCache()->addImage("HelloWorld.png"));//

【代码实战】

主要测试粒子特效的四种创建方式。

(1)使用代码,创建重力发射器模式

(2)使用代码,创建半径发射器模式

(3)创建现成粒子特效

(4)使用pList文件,创建自定义的粒子特效(使用“红孩儿工具箱”制作)

不建议使用:(1)、(2)。因为这两种方法太过繁琐,且不容易看出效果。

建议使用 :(3)、(4)。方便、且有现成的特效制作工具。

1、创建重力发射器模式

不建议使用。

//	voIDHelloWorld::testGravity()	{		CCPointmysize=CCDirector::sharedDirector()->getVisibleSize();		CCParticleSystemQuad*quad=CCParticleSystemQuad::create();		this->addChild(quad,1,1);	//纹理图片		quad->setTexture(CCTextureCache::sharedTextureCache()->addImage("HelloWorld.png"));	//混合模式		ccBlendFunccbl={GL_SRC_Alpha,GL_ONE};		quad->setBlendFunc(cbl);	/********************/	/*粒子属性*/	/********************/	//粒子生命,单位:秒		quad->setlife(3);		quad->setlifeVar(0.25);	//大小,-1表示和初始大小一致		quad->setStartSize(100);		quad->setStartSizeVar(0);		quad->setEndSize(-1);		quad->setEndSizeVar(0);	//颜色,ccc4f:取值0~1		quad->setStartcolor(ccc4f(192/255.0,63/255.0,63/255.0));		quad->setStartcolorVar(ccc4f(0,0));		quad->setEndcolor(ccc4f(0,0));		quad->setEndcolorVar(ccc4f(0,0));	//旋转角度		quad->setStartSpin(0);		quad->setStartSpinVar(60);		quad->setEndSpin(180);		quad->setEndSpinVar(30);	//发射角度		quad->setAngle(90);		quad->setAngleVar(10);	/********************/	/*发射器子属性*/	/********************/	//最大粒子个数		quad->setTotalParticles(1000);	//粒子发射器持续时间,-1为永久		quad->setDuration(-1);	//发射速率		quad->setEmissionRate(quad->getTotalParticles()/quad->getlife());	//发射器位置		quad->setposition(mysize/2);		quad->setPosVar(ccp(10,10));	//重力模式		quad->setEmitterMode(kCCParticleModeGravity);	//粒子位置模式		quad->setpositionType(kCCpositionTypeFree);	//粒子速度		quad->setSpeed(60);		quad->setSpeedVar(20);	//重力加速度		quad->setGravity(ccp(0,0));	//径向加速度		quad->seTradialAccel(0);		quad->seTradialAccelVar(0);	//切向加速度		quad->setTangentialAccel(0);		quad->setTangentialAccelVar(0);	}//

2、创建半径发射器模式

// voIDHelloWorld::tesTradius() { CCPointmysize=CCDirector::sharedDirector()->getVisibleSize(); CCParticleSystemQuad*quad=CCParticleSystemQuad::create(); this->addChild(quad,GL_ONE}; quad->setBlendFunc(cbl); /********************/ /*粒子属性*/ /********************/ //粒子生命,单位:秒 quad->setlife(3); quad->setlifeVar(0.25); //大小,-1表示和初始大小一致 quad->setStartSize(20); quad->setStartSizeVar(0); quad->setEndSize(-1); quad->setEndSizeVar(0); //颜色,ccc4f:取值0~1 quad->setStartcolor(ccc4f(192/255.0,10)); //环形模式 quad->setEmitterMode(kCCParticleModeRadius); //粒子位置模式 quad->setpositionType(kCCpositionTypeFree); //初始半径 quad->setStarTradius(20); quad->setStarTradiusVar(1); //结束半径,-1和初始大小一致 quad->setEndRadius(100); quad->setEndRadiusVar(1); //粒子围绕初始点,每秒旋转角度 quad->setRotatePerSecond(360); quad->setRotatePerSecondVar(1); }//

3、创建火焰粒子特效

无需添加纹理图片Texture,可直接使用。

//	voIDHelloWorld::testParticle()	{		CCParticleFire*quad=CCParticleFire::create();		this->addChild(quad,1);	}//

4、创建自定义pList的粒子特效

pList粒子特效,可以通过“红孩儿工具箱”进行制作。

//	voIDHelloWorld::testPList()	{		CCPointmysize=CCDirector::sharedDirector()->getVisibleSize();		CCParticleSystemQuad*quad=CCParticleSystemQuad::create("1.pList");		quad->setposition(mysize/2);		this->addChild(quad,255);">5、运行结果

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="11111.gif" alt="wKiom1QE1dGzrfN7AASA9ZQKHOY175.gif" src="http://www.dexcoder.com/images/201507/Xylibfpjeuo3MDzZ.gif">

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="22222.gif" alt="wKiol1QE1dLTxDDPAAXbM5kR9yg836.gif" src="http://www.dexcoder.com/images/201507/Kp7i0jq9Dbju0Mk3.gif">

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="33333.gif" alt="wKiom1QE1dKwp7AJAAhLNkpvsiI400.gif" src="http://www.dexcoder.com/images/201507/HBP97beloCkfiqHB.gif">

650) this.wIDth=650;" src="http://img.jb51.cc/vcimg/static/loading.png" title="44444.gif" alt="wKiol1QE1dODQ03FAALwqKCEi1k382.gif" src="http://www.dexcoder.com/images/201507/nnBriGpYxw2oei4F.gif">

6、分析与总结

(1)明显发现使用1、2方法创建粒子特效太过繁琐,并且属性值也不容易控制。

(2)推荐使用现有粒子特效,或者使用“红孩儿工具箱”制作粒子特效。

总结

以上是内存溢出为你收集整理的cocos2dx 粒子系统CCParticleSystem全部内容,希望文章能够帮你解决cocos2dx 粒子系统CCParticleSystem所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1059584.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存