cocos2d-x 如何添加粒子效果
在 cocos2d-x 中添加粒子效果是一个常见且实用的需求,下面将为大家详细分享实现代码及方法。
大规模运动物体的实现方法
大规模运动的物体通常有以下两种实现方法:
- 使用帧动画来模拟:通过一系列连续的图像帧来模拟物体的运动。
- 粒子效果:利用粒子系统来创建复杂的运动效果。
粒子系统概述
粒子系统由 CCParticleSystem 类实现,该类实现了对粒子的控制与调度,具体操作包括:
- 产生粒子:创建新的粒子实例。
- 更新粒子状态:根据时间和其他参数更新粒子的位置、速度、颜色等属性。
- 回收无效粒子:当粒子的生命周期结束或超出屏幕范围时,将其回收以释放资源。
粒子系统继承自 CCNode,因此可以添加到其他节点之中。
cocos2d-x 内置的粒子效果
cocos2d-x 内置了一些常见的粒子效果,具体如下:
CCParticleSystem:所有粒子系统的父类。CCParticleSystemPoint、CCParticleSystemQuad:点粒子和方形粒子系统,都继承了CCParticleSystem的所有属性。CCParticleExplosion:爆炸粒子效果。CCParticleFireworks:烟花粒子效果。CCParticleFire:火焰粒子效果。CCParticleFlower:花束粒子效果。CCParticleGalaxy:星系粒子效果。CCParticleMeteor:流星粒子效果。CCParticleSpiral:漩涡粒子效果。CCParticleSnow:雪粒子效果。CCParticleSmoke:烟粒子效果。CCParticleSun:太阳粒子效果。CCParticleRain:雨粒子效果。
示例代码
以下是一个添加雪花粒子效果的示例代码,将其添加到 init 函数中即可看到效果:
ParticleSystem *particle = ParticleSnow::create();
particle->setTexture(CCTextureCache::sharedTextureCache()->addImage("snow.png"));
this->addChild(particle);
粒子发射器模式
粒子的发射器模式决定了粒子的运动方式和可用参数,不同的模式会产生不同的效果。如果随意引用参数,可能会导致报错。常见的发射器模式有以下两种:
1. 重力模式
通过 setEmitterMode(kCCParticleModeGravity) 设置为重力模式。在重力模式下,可以通过 setGravity 设定重力点,并根据附加参数如速度、径向加速度、切向加速度等来获得对应的粒子效果。
2. 半径模式
通过 setEmitterMode(kCCParticleModeRadius) 设置为半径模式。在这个模式下,粒子的活动范围和动作是按圆形和半径来划分的。例如,对于爆炸中心效果,可以设定粒子初始产生的活动半径范围和粒子生命周期结束时活动的半径范围。
粒子运动位置坐标的影响模式
粒子还有三种关于运动位置坐标的影响模式,通过 setPositionType() 方法设置,具体解释如下:
假设粒子发射器 A 被加入了 SpriteB(B->addChild(A))。
kCCPositionTypeFree:当B运动时,若设置为Free,A发出的粒子会出现拖尾现象;若设置为其他模式,则不会出现拖尾。Free模式是相对于世界坐标的。kCCPositionTypeRelative:当A相对B中坐标变动时,若设置为Relative,A发出的粒子会出现拖尾现象。Relative模式是相对于父节点坐标的。kCCPositionTypeGrouped:设置为Grouped时,不管坐标如何改变,都不会发生拖尾现象。Grouped模式是相对于发射器坐标的。
总结来说,Free 是相对于世界,Relative 相对于父节点,Grouped 是相对于发射器坐标。
创建粒子系统的方法
根据 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"));
// 以下代码在 2.x 和 3.x 版本均可使用
m_emitter->setDuration(-1);
m_emitter->setGravity(Point(0, -240)); // 在 Cocos2d-x-2.x 中使用 CCPoint(0, -240)
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(float):粒子的开始半径。startRadiusVar(float):开始半径变量。endRadius(float):粒子的结束半径。endRadiusVar(float):结束半径变量。rotatePerSecond(float):围绕一个来源点的每秒旋转角度。rotatePerSecondVar(float):每秒旋转角度变量。
粒子的常规属性
startSize:粒子的初始尺寸(像素值)。startSizeVar:初始尺寸变量。endSize:粒子的结束尺寸(如果想让粒子的开始大小和结束大小相同,可以使用kCCParticleStartSizeEqualToEndSize)。endSizeVar:结束尺寸变量。startColor:粒子开始颜色(ccColor4F)。startColorVar:开始颜色变量。endColor:粒子结束颜色。endColorVar:结束颜色变量。startSpin:仅用在CCParticleSystemQuad中,起始螺旋度。startSpinVar:起始螺旋度变量。endSpin:仅用在CCParticleSystemQuad中,结束螺旋度。endSpinVar:结束螺旋度变量。life:粒子的生命生存时间,单位是秒。lifeVar:生命生存时间变量。angle:粒子开始角度(float)。angleVar:开始角度变量。position(CCPoint):粒子位置。positionVar:粒子位置变量。centerOfGravity(CGPoint)。
系统通用属性
emissionRate(float):每秒发射的粒子数量。duration(float):粒子系统生存时间。blendFunc(ccBlendFunc):用于系统渲染的 OpenGL 渲染函数。positionType(tCCPositionType):使用kCCPositionTypeFree(默认值)属性可以自由地移动粒子;使用kCCPositionTypeGrouped可以让粒子一组一组地移动。texture(CCTexture2D):粒子的纹理。