除了使用Cocos2d-x的11种内置粒子系统外我们还可以通过创建ParticleSystemQuad对象并设置属性实现自定义粒子系统通过这种方式完全可以实现我们说需要的各种效果的粒子系统。使用ParticleSystemQuad自定义粒子系统至少有两种方式可以实现代码创建和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::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文件参考代码如下
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>angle</key> <real>270</real> <key>angleVariance</key> <real>5</real> <key>blendFuncDestination</key> <integer>771</integer> <key>blendFuncSource</key> <integer>1</integer> <key>duration</key> <real>-1</real> <key>emitterType</key> <real>0.0</real> <key>finishColorAlpha</key> <real>1</real> <key>finishColorBlue</key> <real>1</real> <key>finishColorGreen</key> <real>1</real> <key>finishColorRed</key> <real>1</real> <key>finishColorVarianceAlpha</key> <real>0.0</real> <key>finishColorVarianceBlue</key> <real>0.0</real> <key>finishColorVarianceGreen</key> <real>0.0</real> <key>finishColorVarianceRed</key> <real>0.0</real> <key>finishParticleSize</key> <real>-1</real> <key>finishParticleSizeVariance</key> <real>0.0</real> <key>gravityx</key> <real>0.0</real> <key>gravityy</key> <real>-10</real> <key>maxParticles</key> <real>700</real> <key>maxRadius</key> <real>0.0</real> <key>maxRadiusVariance</key> <real>0.0</real> <key>minRadius</key> <real>0.0</real> <key>minRadiusVariance</key> <real>0.0</real> <key>particleLifespan</key> <real>3</real> <key>particleLifespanVariance</key> <real>1</real> <key>radialAccelVariance</key> <real>0.0</real> <key>radialAcceleration</key> <real>1</real> <key>rotatePerSecond</key> <real>0.0</real> <key>rotatePerSecondVariance</key> <real>0.0</real> <key>rotationEnd</key> <real>0.0</real> <key>rotationEndVariance</key> <real>0.0</real> <key>rotationStart</key> <real>0.0</real> <key>rotationStartVariance</key> <real>0.0</real> <key>sourcePositionVariancex</key> <real>1200</real> <key>sourcePositionVariancey</key> <real>0.0</real> <key>speed</key> <real>130</real> <key>speedVariance</key> <real>30</real> <key>startColorAlpha</key> <real>1</real> <key>startColorBlue</key> <real>1</real> <key>startColorGreen</key> <real>1</real> <key>startColorRed</key> <real>1</real> <key>startColorVarianceAlpha</key> <real>0.0</real> <key>startColorVarianceBlue</key> <real>0.0</real> <key>startColorVarianceGreen</key> <real>0.0</real> <key>startColorVarianceRed</key> <real>0.0</real> <key>startParticleSize</key> <real>10</real> <key>startParticleSizeVariance</key> <real>5</real> <key>tangentialAccelVariance</key> <real>0.0</real> <key>tangentialAcceleration</key> <real>1</real> <key>textureFileName</key> <string>snow.png</string> </dict> </plist>
在上述的plist文件描述的属性和属性值都是成对出现其中<key>标签描述的是属性<real>描述的属性值。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://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课堂微信公共平台