在游戏中,经常要实现一些真实的效果,这些效果(如,火焰,雪花等)都是由大量微粒组合而形成的。为了在游戏中实现这种效果,我们必须引进粒子系统,粒子系统中需要包括四个部分:粒子对象,运动规律,随机性,粒子状态。大量的粒子叠加就可以产生我们需要的特效。
在cocos2d-x引擎中,粒子系统使用CCParticleSystem来表示,又分为两大类,重力式粒子系统CCParticleSystemPoint和放射式粒子系统CCParticleSystemQuad,两者在功能上略有不同,CCParticleSystemQuad支持围绕轴线旋转,CCParticleSystemQuad支持更多粒子对象和缩放,重力式故名思义,系统中存在重力,重力大小可以自己定义,包括的参数有:重心,速度,方向,尺寸,存在时间,颜色,绕自己轴心旋转角度,角加速度,线加速度,半径,分组模式(是否随重心移动),放射性系统恰恰相反,不存在重力,包括的参数有:重心,方向,尺寸,存在时间,颜色,绕自己轴心旋转角度,绕重心为轴心旋转角度,半径,分组模式(是否随重心移动)。
那么下面是每个粒子都具有以下一些属性及其规则:
1.Coordinate(坐标)
在烟火爆炸的时刻,每个粒子都有一个相同的初始坐标,随着时间的推移,粒子的新坐标将由它的旧坐标和加速度来求得
2.Velocity(速度)
每个粒子都有一个随机产生的初始速度,粒子的新速度由加速度和空气阻尼来求得
3.Acceleration(加速度)
在烟火中,每个粒子的加速度都等于重力加速度
4.Color(颜色)
粒子颜色取决于粒子的速度或生命值的大小
5.Life(生命值)
每个粒子都有一个初始的随机生命值,这个值将随着时间的推移而逐渐减小,直到等于0
那么实现粒子效果有3中方式:
1.自定义实现效果
2.使用Cocos2d-x内置的粒子效果去实现
3.通过plist文件创建
示例代码:
//在init方法里面初始化当前的实例 bool HelloWorld::init() { bool bRet = false; do { //CCLayer进行初始化,初始化失败跳出循环 if ( !CCLayer::init() ) { break; } //获取手机屏幕的大小 CCSize size = CCDirector::sharedDirector()->getWinSize(); //1自定义实现 //建立一个粒子系统 CCParticleSystem* pParticleSystem=new CCParticleSystemQuad(); //产生300个粒子 pParticleSystem->initWithTotalParticles(300); //设置粒子图片 pParticleSystem->setTexture(CCTextureCache::sharedTextureCache()->addImage("cat.png")); //设置粒子系统持续时间 pParticleSystem->setDuration(-1); //设置重力方向 pParticleSystem->setGravity(CCPointZero); //设置角度,角度变化率 pParticleSystem->setAngle(0); pParticleSystem->setAngleVar(360); //设置运动速度,运动速度的变化率 pParticleSystem->setSpeed(50); pParticleSystem->setSpeedVar(10); //设置径向加速度,径向加速度的变化率 pParticleSystem->setRadialAccel(70); pParticleSystem->setRadialAccelVar(10); //设置切向加速度,径向加速度的变化率 pParticleSystem->setTangentialAccel(80); pParticleSystem->setTangentialAccelVar(0); //设置粒子初始位置,位置变化率 pParticleSystem->setPosition(size.width/2,size.height/2); pParticleSystem->setPosVar(ccp(100,100)); //设置粒子存在时间,时间变化率 pParticleSystem->setLife(2); pParticleSystem->setLifeVar(0.3); //设置粒子初始颜色,颜色变化率 ccColor4F cccStart={0.5,0.5,0.5,1.0}; pParticleSystem->setStartColor(cccStart); pParticleSystem->setStartColorVar(cccStart); //设置粒子结束颜色,颜色变化率 ccColor4F cccEnd={0.5,0.5,0.5,1.0}; pParticleSystem->setStartColor(cccEnd); pParticleSystem->setStartColorVar(cccEnd); //设置粒子初始大小,大小变化率 pParticleSystem->setStartSize(10); pParticleSystem->setStartSizeVar(20); //设置粒子结束大小,大小变化率 pParticleSystem->setStartSize(12); pParticleSystem->setStartSizeVar(12); //设置每秒产生粒子数 pParticleSystem->setEmissionRate(pParticleSystem->getTotalParticles()/pParticleSystem->getLife()); this->addChild(pParticleSystem,1); //2使用系统自带的 CCParticleSystem* m_emitter; //烟花粒子效果 m_emitter = CCParticleFireworks::create(); m_emitter->retain(); this->addChild(m_emitter, 10); m_emitter->setTexture( CCTextureCache::sharedTextureCache()->addImage("cat.png") ); m_emitter->setPosition(ccp(300,320)); /* -- CCParticleSystem(所有粒子系统的父类) -- CCParticleSystemPoint、CCParticleSystemQuad 点粒子和方形粒子系统 -- CCParticleExplosion (爆炸粒子效果) -- CCParticleFireworks (烟花粒子效果) -- CCParticleFire (火焰粒子效果) -- CCParticleFlower (花束粒子效果) -- CCParticleGalaxy (星系粒子效果) -- CCParticleMeteor (流星粒子效果) -- CCParticleSpiral (漩涡粒子效果) -- CCParticleSnow (雪粒子效果) -- CCParticleSmoke (烟粒子效果) -- CCParticleSun (太阳粒子效果) -- CCParticleRain (雨粒子效果) */ //第三种方法通过plist文件创建 CCParticleSystemQuad *system = new CCParticleSystemQuad(); system->initWithFile("Images/SpinningPeas.plist");//plist文件可以通过例子编辑器获得 system->setTextureWithRect(CCTextureCache::sharedTextureCache()->addImage("cat.png") , CCRectMake(0,0,32,32)); addChild(system, 10); system->setPosition(ccp(300,320)); //接收界面的的触摸事件 setTouchEnabled(true); bRet = true; } while (0); //返回成功 return bRet; }
运行的效果: