[Cocos2d-x For WP8]Particle粒子系统

    在游戏中,经常要实现一些真实的效果,这些效果(如,火焰,雪花等)都是由大量微粒组合而形成的。为了在游戏中实现这种效果,我们必须引进粒子系统,粒子系统中需要包括四个部分:粒子对象,运动规律,随机性,粒子状态。大量的粒子叠加就可以产生我们需要的特效。

    在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;
}

运行的效果:

 

posted on 2013-08-24 15:36  linzheng  阅读(989)  评论(0编辑  收藏  举报

导航