Cocos2d-x中自定义粒子系统

除了使用Cocos2d-x11种内置粒子系统外,我们还可以通过创建ParticleSystemQuad对象,并设置属性实现自定义粒子系统,通过这种方式完全可以实现我们说需要的各种效果的粒子系统。使用ParticleSystemQuad自定义粒子系统至少有两种方式可以实现:代码创建和plist文件创建。

代码创建

所谓代码创建就是完全通过代码方式实现,其中所有的属性全部是通过程序代码设置。这要求开发人员对于这些属性值非常熟悉,而且这种方式无法预览,只能通过程序运行看效果,调整,再运行看效果,再调整,因此比较麻烦。

要想实现如下图所示的下雪粒子系统,我们当然可以通过前面介绍的方式实现,但本节我们先介绍通过自定义粒子系统实现。

 Cocos2d-x中自定义粒子系统_第1张图片

代码创建的下雪粒子系统,主要代码如下:

bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false;
}
 
Size visibleSize = Director::getInstance()->getVisibleSize();
 
auto bg = Sprite::create("background-1.png");
 
bg->setPosition(Point(visibleSize.width/2, visibleSize.height /2));
this->addChild(bg);
 
auto particleSystem = ParticleSystemQuad::createWithTotalParticles(200);	①
 
//设置雪花粒子纹理图片
particleSystem->setTexture(TextureCache::getInstance()->addImage("snow.png"));	②
//设置发射粒子的持续时间-1表示永远持续
particleSystem->setDuration(-1);
//设置粒子的重力方向 
particleSystem->setGravity(Point(0,-240));
 
//设置角度以及偏差
particleSystem->setAngle(90); 
particleSystem->setAngleVar(360);
 
//设置径向加速度以及偏差
particleSystem->setRadialAccel(50);
particleSystem->setRadialAccelVar(0);
 
//设置粒子的切向加速度以及偏差
particleSystem->setTangentialAccel(30);
particleSystem->setTangentialAccelVar(0);
 
// 设置粒子初始化位置偏差
particleSystem->setPosVar(Point(400,0));
 
//设置粒子生命期以及偏差
particleSystem->setLife(4);
particleSystem->setLifeVar(2);
 
//设置粒子开始时候旋转角度以及偏差
particleSystem->setStartSpin(30);
particleSystem->setStartSpinVar(60);
 
//设置结束时候的旋转角度以及偏差
particleSystem->setEndSpin(60);
particleSystem->setEndSpinVar(60);
 
//设置开始时候的颜色以及偏差
particleSystem->setStartColor(Color4F(1,1,1,1));
//设置结束时候的颜色以及偏差
particleSystem->setEndColor(Color4F(1,1,1,1));
 
//设置开始时候粒子大小以及偏差
particleSystem->setStartSize(30);
particleSystem->setStartSizeVar(0);
 
//设置粒子结束时候大小以及偏差
particleSystem->setEndSize(20.0f);
particleSystem->setEndSizeVar(0);
 
//设置每秒钟产生粒子的数量
particleSystem->setEmissionRate(100);
 
particleSystem->setPosition(Point(visibleSize.width/2, visibleSize.height + 50));
 
this->addChild(particleSystem);
 
 	return true;
}

上述第①行代码ParticleSystemQuad::createWithTotalParticles(200)是创建ParticleSystemQuad对象,静态createWithTotalParticles函数是通过指定初始粒子数来创建粒子对象。

第②行代码是指定粒子的纹理,TextureCache::getInstance()->addImage("snow.png")语句可以通过指定的纹理图片创建纹理对象Texture2D贴图的纹理图片宽高必须是2的n次幂,大小不要超过64x64像素,在美工设计纹理图片时候,不用关注太多细节,例如:设计雪花纹理图片时候,按照雪花是有6个角的,很多人会设计为图10-7所示的样式,而事实上我们需要的图10-8所示的渐变效果的圆点

雪花图片 

 

雪花粒子纹理图片

 

plist文件创建

代码创建方式要维护很多属性,要想手工调整这些属性那是非常困难的事情,我们推荐使用Particle Designer等粒子设计工具进行所见即所得的设计,这些工具一般会生成一个描述粒子的属性类表文件plist,然后通过类似下面的语句加载:

auto particleSystem =ParticleSystemQuad::create("snow.plist");

snow.plist是描述运动的属性文件,plist文件是一种XML文件,参考代码如下:





angle
270
angleVariance
5
blendFuncDestination
771
blendFuncSource
1
duration
-1
emitterType
0.0
finishColorAlpha
1
finishColorBlue
1
finishColorGreen
1
finishColorRed
1
finishColorVarianceAlpha
0.0
finishColorVarianceBlue
0.0
finishColorVarianceGreen
0.0
finishColorVarianceRed
0.0
finishParticleSize
-1
finishParticleSizeVariance
0.0
gravityx
0.0
gravityy
-10
maxParticles
700
maxRadius
0.0
maxRadiusVariance
0.0
minRadius
0.0
minRadiusVariance
0.0
particleLifespan
3
particleLifespanVariance
1
radialAccelVariance
0.0
radialAcceleration
1
rotatePerSecond
0.0
rotatePerSecondVariance
0.0
rotationEnd
0.0
rotationEndVariance
0.0
rotationStart
0.0
rotationStartVariance
0.0
sourcePositionVariancex
1200
sourcePositionVariancey
0.0
speed
130
speedVariance
30
startColorAlpha
1
startColorBlue
1
startColorGreen
1
startColorRed
1
startColorVarianceAlpha
0.0
startColorVarianceBlue
0.0
startColorVarianceGreen
0.0
startColorVarianceRed
0.0
startParticleSize
10
startParticleSizeVariance
5
tangentialAccelVariance
0.0
tangentialAcceleration
1
textureFileName
snow.png


在上述的plist文件描述的属性和属性值都是成对出现,其中标签描述的是属性,描述的属性值。plist文件是描述粒子的属性,使用的时候还需要有粒子纹理图片,plist文件中textureFileName属性指定了纹理图片,我们需要将plist文件和纹理图片放置到Resources目录下面。

提示 描述粒子属性的plist文件,可以通过粒子系统设计工具生成,有关粒子系统工具使用大家可以参考我的TODO

 

如图所示的下雪实例,使用plist文件创建,主要代码如下:

bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false;
}
 
Size visibleSize = Director::getInstance()->getVisibleSize();
 
auto bg = Sprite::create("background-1.png");
bg->setPosition(Point(visibleSize.width/2, visibleSize.height /2));
this->addChild(bg);
 
auto particleSystem = ParticleSystemQuad::create("snow.plist");
    particleSystem->setPosition(Point(visibleSize.width/2, visibleSize.height - 50));
this->addChild(particleSystem);
return true;
}

从代码可见plist文件创建粒子系统要比代码创建简单很多,这主要是因为采用了plist描述粒子属性。




更多内容请关注最新Cocos图书《Cocos2d-x实战 C++卷》
本书交流讨论网站: http://www.cocoagame.net
更多精彩视频课程请关注智捷课堂Cocos课程: http://v.51work6.com
欢迎加入Cocos2d-x技术讨论群:257760386


《Cocos2d-x实战 C++卷》现已上线,各大商店均已开售:

京东:http://item.jd.com/11584534.html

亚马逊:http://www.amazon.cn/Cocos2d-x%E5%AE%9E%E6%88%98-C-%E5%8D%B7-%E5%85%B3%E4%B8%9C%E5%8D%87/dp/B00PTYWTLU

当当:http://product.dangdang.com/23606265.html

互动出版网:http://product.china-pub.com/3770734

《Cocos2d-x实战 C++卷》源码及样章下载地址:

源码下载地址:http://51work6.com/forum.php?mod=viewthread&tid=1155&extra=page%3D1 

样章下载地址:http://51work6.com/forum.php?mod=viewthread&tid=1157&extra=page%3D1

欢迎关注智捷iOS课堂微信公共平台

你可能感兴趣的:(实战,游戏,网络游戏,游戏开发,iphone,Cocos2d-x实战)