cocos2d-x:粒子系统详解 (Particle System)

cocos2d-x:粒子系统详解 (Particle System),第1张

概述一、粒子系统简介: 粒子系统最早出现在80年代,主要用于解决由大量按一定规则运动(变化)的微小物质在计算机上的生成和显示问题。Particle System的应用非常广泛,大的可以模拟原子d爆炸,星云变化,小的可以模拟水波、火焰、烟火、云雾等,而这些自然现象用常规的图形算法是很难逼真再现的。 Particle System可以说是一种基于物理模型来解决问题的方法,它的核心不在于如何显示,而在用于对 @H_301_1@ 一、粒子系统简介:

粒子系统最早出现在80年代,主要用于解决由大量按一定规则运动(变化)的微小物质在计算机上的生成和显示问题。Particle System的应用非常广泛,大的可以模拟原子d爆炸,星云变化,小的可以模拟水波、火焰、烟火、云雾等,而这些自然现象用常规的图形算法是很难逼真再现的。 Particle System可以说是一种基于物理模型来解决问题的方法,它的核心不在于如何显示,而在用于对微小物质模型的规则提取。 粒子运动(变化)的规则可以很简单也可以很复杂,这取决你所模拟的对象。举例来说,在对FireWorks(烟火)的模拟中,我们可以让烟火由上百个小的粒子组成,每个粒子都具有以下一些属性及其规则(对各个属性施加不同的规则,就可以获得不同形态的烟火): Coordinate(坐标) 在烟火爆炸的时刻,每个粒子都有一个相同的初始坐标,随着时间的推移,粒子的新坐标将由它的旧坐标和加速度来求得 VeLocity(速度) 每个粒子都有一个随机产生的初始速度,粒子的新速度由加速度和空气阻尼来求得 acceleration(加速度) 在烟火中,每个粒子的加速度都等于重力加速度 color(颜色) 粒子颜色取决于粒子的速度或生命值的大小 life(生命值) 每个粒子都有一个初始的随机生命值,这个值将随着时间的推移而逐渐减小,直到等于0 你会发现,Particle System中的粒子与C++中类的概念有些类似,实际上你完全可以将它当成类来处理,一个粒子就是一个类的实例对象,只不过有时在涉及程序优化的具体细节上,你需要放弃使用类,而使用简单而快速的紧凑代码。 Particle System虽然在处理大量单独粒子的运动(变化)上很有用处,但是一涉及到需要考虑粒子间相互作用的场合,因为这时的计算量呈粒子数量的指数级增长,它就显得有些力不从心了。比如在模拟有相互引力作用下的大量星体的运动,大量粒子的相互碰撞等。 二、粒子系统的生命周期

首先,从粒子池中获取一个粒子, 然后计算赋予初始属性后,发射他。 在粒子飞行过程中,不断的刷新来修正他的属性。 粒子死亡后,回归粒子池。 三、例子相关属性 Variance 浮动值:表示随机上下浮动的修正值,实际值由原始值+浮动值组成,例如lifespan=5,lifespan Variance=1 那么随机出来的结果就是4~6

四、发射器相关属性 发射器有两种,一种是重力发射器(用于实现在重力条件下的粒子运动),另一种是放射发射器(用于实现在无重力下的粒子运动)。 五、纹理Texture 如果没有贴图的话,所有粒子将会是单调的色块。粒子的贴图没有具体限制,可以是灰度图,也可以是一张具体的图片。但要小于64x64pixel 六、cocos2d-x实现Particle System

第一种方法: 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,128);">320)); 第二种方法: CCParticleSystem*m_emitter;
m_emitter= newCCParticleSystemQuad();
m_emitter->initWithTotalParticles( 50);
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);

speedofparticles
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( emitterposition
m_emitter->setposition(CCPointMake( 160,128);">240));
m_emitter->setPosVar(CCPointZero);

lifeofparticles
m_emitter->setlife( 4);
m_emitter->setlifeVar( spinofparticles
m_emitter->setStartSpin( 0);
m_emitter->setStartSizeVar( 0);
m_emitter->setEndSpin( 0);
m_emitter->setEndSpinVar( colorofparticles
cccolor4Fstartcolor={ 0.5f,128);">1.0f};
m_emitter->setStartcolor(startcolor);

cccolor4FstartcolorVar={ 1.0f};
m_emitter->setStartcolorVar(startcolorVar);

cccolor4Fendcolor={ 0.1f,128);">0.2f};
m_emitter->setEndcolor(endcolor);

cccolor4FendcolorVar={ 0.2f};
m_emitter->setEndcolorVar(endcolorVar);

size,inpixels
m_emitter->setStartSize( 80.0f);
m_emitter->setStartSizeVar( 40.0f);
m_emitter->setEndSize(kParticleStartSizeEqualToEndSize);

emitspersecond
m_emitter->setEmissionRate(m_emitter->getTotalParticles()/m_emitter->getlife());

additive
m_emitter->setIsBlendAdditive( true); 第三种方法: CCParticleSystemQuad*system= newCCParticleSystemQuad();
system->initWithfile( " Images/SpinningPeas.pList "); pList文件可以通过例子编辑器获得
system->setTextureWithRect(CCTextureCache::sharedTextureCache()->addImage( Images/particles.png ")
,CCRectMake( 0,128);">32,128);">32));
addChild(system,128);">10);
system->setposition 总结

以上是内存溢出为你收集整理的cocos2d-x:粒子系统详解 (Particle System)全部内容,希望文章能够帮你解决cocos2d-x:粒子系统详解 (Particle System)所遇到的程序开发问题。

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

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

原文地址: https://outofmemory.cn/web/1082114.html

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

发表评论

登录后才能评论

评论列表(0条)

保存