大规模运动的物体通常有两种方法实现
1,使用帧动画来模拟
2,粒子效果
粒子系统有CCParticleSystem类实现,CCParticleSystem实现了对粒子的控制与调度,对粒子的操作包括:
1,产生粒子
2,更新粒子状态
3,回收无效粒子
粒子系统继承自CCNode ,可以添加到其他节点之中
cocos2d-x内置了一些粒子效果如:
- CCParticleSystem(所有粒子系统的父类)
-- CCParticleSystemPoint、CCParticleSystemQuad (点粒子和方形粒子系统,都继承了CCParticleSystem的所有属性)
-- CCParticleExplosion :爆炸粒子效果
-- CCParticleFireworks :烟花粒子效果
-- CCParticleFire :火焰粒子效果
-- CCParticleFlower :花束粒子效果
-- CCParticleGalaxy :星系粒子效果
-- CCParticleMeteor :流星粒子效果
-- CCParticleSpiral :漩涡粒子效果
-- CCParticleSnow :雪粒子效果)
-- CCParticleSmoke :烟粒子效果
-- CCParticleSun :太阳粒子效果
-- CCParticleRain :雨粒子效果
例子:
ParticleSystem *particle = ParticleSnow::create();
particle->setTexture(CCTextureCache::sharedTextureCache()->addImage("snow.png"));
this->addChild(particle);
上面这段代码添加到init里面就可以看到雪花的粒子效果
首先需要知道的是粒子的发射器模式,不同发射器模式下有不同的可用参数,也因此会产生不同的效果,这个就有点像是模具,用什么模具就生成出什么样的模型产品,如果随便引用参数那是有可能会报错的:
1.重力模式->setEmitterMode(kCCParticleModeGravity)
重力模式下可以按照设定的重力点setGravity,根据附加参数如速度、径向加速度、切向加速度……来获得对应的粒子效果。
2.半径模式->->setEmitterMode(kCCParticleModeRadius)
这个模式下,粒子的活动范围、动作是按圆形、半径来划分的,像上面的爆炸中心效果我就设定粒子初始产生的活动半径范围和粒子生命周期结束时活动的半径范围。
粒子还有三种关于运动位置坐标的影响模式->setPositionType(),这里引用一段解释:
假设粒子发射器A被加入了SpriteB, ( B->addChild(A) )
1.kCCPositionTypeFree
当B运动时,若设置Free,A发出的粒子则会出现拖尾现象。若设置其他的,则不会出现拖尾。
2.kCCPositionTypeRelative
当A相对B中坐标变动的时,若设置Relative,A发出的粒子则会出现拖尾现象。
3.kCCPositionTypeGrouped
而设置Grouped,不管什么坐标改变都不会发生拖尾现象。
总结,Free是相对于世界,Relative相对于父节点,Grouped是相对于发射器坐标。
@1——根据 plist 文件创建粒子系统:
- CCParticleSystemQuad *emitter1 = CCParticleSystemQuad::create("Particle/BurstPipe.plist");
- emitter1->setPosition(ccp( size.width/2, size.height/2)); // 设置发射粒子的位置
- emitter1->setAutoRemoveOnFinish(true); // 完成后制动移除
- emitter1->setDuration(10); // 设置粒子系统的持续时间秒
- this->addChild(emitter1, 0, 1);
不使用plist文件创建粒子效果
auto size = Director::getInstance()->getWinSize();
auto m_emitter = ParticleSystemQuad::createWithTotalParticles(900);
m_emitter->setTexture(Director::getInstance()->getTextureCache()->addImage("snow.png"));
//The code below we can use both in 2.x and 3.x
m_emitter->setDuration(-1);
m_emitter->setGravity(Point(0, -240)); // in Cocos2d-x-2.x CCPoint(0, -240) is used
m_emitter->setAngle(90);
m_emitter->setAngleVar(360);
m_emitter->setRadialAccel(50);
m_emitter->setRadialAccelVar(0);
m_emitter->setTangentialAccel(30);
m_emitter->setTangentialAccelVar(0);
m_emitter->setPosition(Point(size.width / 2, size.height));
m_emitter->setPosVar(Point(400, 0));
m_emitter->setLife(4);
m_emitter->setLifeVar(2);
m_emitter->setStartSpin(30);
m_emitter->setStartSpinVar(60);
m_emitter->setEndSpin(60);
m_emitter->setEndSpinVar(60);
m_emitter->setStartColor(Color4F(255,255,255,1));
m_emitter->setStartColorVar(Color4F(0,0,0,0));
m_emitter->setEndColor(Color4F(255, 255, 255, 1));
m_emitter->setEndColorVar(Color4F(0, 0, 0, 0));
m_emitter->setStartSize(30);
m_emitter->setStartSizeVar(0);
m_emitter->setEndSize(20.0f);
m_emitter->setEndSizeVar(0);
m_emitter->setEmissionRate(100);
addChild(m_emitter,10);
在重力模式中,以下属性是合法的:
gravity (Point)。粒子系统的重力。
speed (float)。粒子们射出的速度。
speedVar(float)速度变量
tangencialAccel(float)粒子们的正切加速度
tangencialAccelVar(float)粒子们正切加速度的变量
radialAccel(float)粒子们的半径加速度。
radialAccelVar(float)粒子们半径加速度的变量
半径模式有下列合法的属性:
startRadius (a float).粒子的开始半径
startRadiusVar (a float). 开始半径变量
endRadius (a float). 粒子的结束半径
endRadiusVar (a float).结束半径变量
rotatePerSecond (a float).围绕一个来源点的每秒旋转角度
rotatePerSecondVar (a float).每秒旋转角度变量
粒子们的常规属性:
startSize:粒子的初始尺寸(像素值)
startSizeVar
endSize:粒子的结束尺寸(如果你想让粒子的开始大小同结束大笑相同,就用一下kCCParticleStartSizeEqualToEndSize
endSizeVar
startColor :粒子开始颜色(ccColor4F)
startColorVar
endColor :粒子结束颜色
endColorVar
startSpin:仅用在CCParticleSystemQuad中,起始螺旋度
startSpinVar
endSpin:仅用在CCParticleSystemQuad中,结束螺旋度
endSpinVar
life粒子的生命生存时间,单位是秒
lifeVar
angle:粒子开始角度,float
angleVar
positon:CCPoint粒子位置
positonVar
centerOfGravity :CGPoint
系统通用属性:
emissionRate duration (a float):每秒有多少粒子被发射
duration (a float):粒子系统生存时间
blendFunc (a ccBlendFunc):用于系统渲染的OpenGL的渲染函数
positionType (a tCCPositionType).:使用kCCPositionTypeFree (默认值)属性可以自由的移动粒子们。或者使用kCCPositionTypeGrouped 让粒子们一组一组的移动。
texture (a CCTexture2D).粒子的纹理