首页 > 代码库 > 【cocos2dx粒子系统】总结学习

【cocos2dx粒子系统】总结学习

参考文章:

http://www.cnblogs.com/shangdahao/archive/2012/04/14/2447571.html

http://blog.csdn.net/ganpengjin1/article/details/18554225

http://blog.csdn.net/aa4790139/article/details/8124781

一、什么是粒子系统

粒子系统最早出现在80年代,主要用于解决由大量按一定规则运动(变化)的微小物质在计算机上的生成和显示问题。Particle System的应用非常广泛,大的可以模拟原子弹爆炸,星云变化,小的可以模拟水波、火焰、烟火、云雾等,而这些自然现象用常规的图形算法是很难逼真再现的。
Particle System可以说是一种基于物理模型来解决问题的方法,它的核心不在于如何显示,而在用于对微小物质模型的规则提取。粒子运动(变化)的规则可以很简单也可以很复杂,这取决你所模拟的对象。
你会发现,Particle System中的粒子与C++中类的概念有些类似,实际上你完全可以将它当成类来处理,一个粒子就是一个类的实例对象,只不过有时在涉及程序优化的具体细节上,你需要放弃使用类,而使用简单而快速的紧凑代码。
Particle System虽然在处理大量单独粒子的运动(变化)上很有用处,但是一涉及到需要考虑粒子间相互作用的场合,因为这时的计算量呈粒子数量的指数级增长,它就显得有些力不从心了。比如在模拟有相互引力作用下的大量星体的运动,大量粒子的相互碰撞等。

二、Particle Editor的使用

网络上有很多教程讲解怎么下载使用Particle Editor。这里就不多说了。

三、Cocos2d-x对对粒子系统的实现

其实对于cocos2dx中的粒子系统而言,一切都已经模板化了。照猫画虎就行了。主要是对粒子系统中参数的配置调整。下面说说cocos2dx中对粒子系统的支持实现

(1)利用cocos2dx已经打包好的粒子系统参数效果:

CCParticleExplosion爆炸
CCParticleFire 火
CCParticleFireworks烟火
CCParticleFlower花
CCParticleGalaxy 银河
CCParticleMeteor 流行
CCParticleRain 下雨
CCParticleSmoke 下雪
CCParticleSnow 炊烟
CCParticleSpiral 螺旋
CCParticleSun 太阳焰

例如:

 CCParticleSystem* m_emitter;
 m_emitter = CCParticleFireworks::node();
 m_emitter->retain();
 this->addChild(m_emitter, 10);
 m_emitter->setTexture( CCTextureCache::sharedTextureCache()->addImage(“image.png”) );
 m_emitter->setPosition(ccp(489,320));

(2)利用Particle Editor编辑参数

通过这种方法我们会用到下面两个方法,导入生成的(*.plist)文件

 bool initWithFile(const char *plistFile)
 static CCParticleSystem* create(const char *plistFile)

例如:

  CCParticleSystemQuad *system = new CCParticleSystemQuad();
  system->initWithFile("Images/SpinningPeas.plist");//plist文件可以通过例子编辑器获得
  system->setTextureWithRect(CCTextureCache::sharedTextureCache()->addImage("Images/particles.png")
       ,      CCRectMake(0,0,32,32));
  addChild(system, 10);
system->setPosition 

(3)利用代码配置粒子系统参数

CCParticleSystem* m_emitter;
m_emitter = new CCParticleSystemQuad();
 m_emitter->initWithTotalParticles(50);
 this->addChild(m_emitter, 10);
 m_emitter->setTexture( CCTextureCache::sharedTextureCache()->addImage(s_stars1) );
 m_emitter->setDuration(-1);
   
   // gravity
 m_emitter->setGravity(CCPointZero);
   
   // angle
 m_emitter->setAngle(90);
 m_emitter->setAngleVar(360);
   
   // speed of particles
 m_emitter->setSpeed(160);
 m_emitter->setSpeedVar(20);
   
   // radial
 m_emitter->setRadialAccel(-120);
 m_emitter->setRadialAccelVar(0);
   
   // tagential
 m_emitter->setTangentialAccel(30);
 m_emitter->setTangentialAccelVar(0);
   
   // emitter position
 m_emitter->setPosition( CCPointMake(160,240) );
 m_emitter->setPosVar(CCPointZero);
   
   // life of particles
 m_emitter->setLife(4);
 m_emitter->setLifeVar(1);
   
   // spin of particles
 m_emitter->setStartSpin(0);
 m_emitter->setStartSizeVar(0);
 m_emitter->setEndSpin(0);
 m_emitter->setEndSpinVar(0);
   
   // color of particles
 ccColor4F startColor = {0.5f, 0.5f, 0.5f, 1.0f};
 m_emitter->setStartColor(startColor);
   
 ccColor4F startColorVar = {0.5f, 0.5f, 0.5f, 1.0f};
 m_emitter->setStartColorVar(startColorVar);
   
 ccColor4F endColor = {0.1f, 0.1f, 0.1f, 0.2f};
 m_emitter->setEndColor(endColor);
   
 ccColor4F endColorVar = {0.1f, 0.1f, 0.1f, 0.2f}; 
 m_emitter->setEndColorVar(endColorVar);
   
   // size, in pixels
 m_emitter->setStartSize(80.0f);
 m_emitter->setStartSizeVar(40.0f);
 m_emitter->setEndSize(kParticleStartSizeEqualToEndSize);
   
   // emits per second
 m_emitter->setEmissionRate(m_emitter->getTotalParticles()/m_emitter->getLife());
   
   // additive
 m_emitter->setIsBlendAdditive(true);

【cocos2dx粒子系统】总结学习