我想接触过游戏引擎的同学,对粒子系统应该不会陌生。它用于解决由大量按一定规则运动(变化)的微小物质在计算机上的生成和显示问题。粒子系统在游戏中有着非常广泛的应用,可以模拟很多现象,如火花、爆炸、烟雾、星云、流水、落花等。

粒子系统(partical system)在粒子效果中对所有粒子进行统一控制和调度,它的常见功能如下:

·产生粒子:也被称作粒子发射器(emitter)。

·控制粒子:随时间更新粒子的位置、速度以及其他状态。

·回收粒子:当粒子的生存周期结束后就会被系统回收。

Cocos2D-x的粒子系统是通过类CCParticleSystem实现的,看一看它的类继承关系图,如下:

   很显然类CCparticleSystem是粒子系统定义的基类,它有一个子类CCparticleSystemQuad。它表示放射式粒子系统。基于CCparticleSystemQuad有很多子类,这些子类分别实现了各种不同的粒子效果,如下:
    CCParticleExplosion:爆炸粒子效果
    CCParticleFire:火粒子效果
    CCParticleFireworks:烟火粒子效果
    CCParticleFlower:花粒子效果
    CCParticleGalaxy:银河(星系)粒子效果
    CCParticleMeteor:流星粒子效果
    CCParticleRain:下雨粒子效果
    CCParticleSmoke:炊烟粒子效果
    CCParticleSnow:下雪粒子效果
    CCParitcleSpiral:盘旋/螺旋粒子效果
    CCParticleSun:太阳火焰粒子效果
   
   它们是Cocos2D-x内置的常用粒子效果,如自定义粒子效果则需要继承至CCparticleSystemQuad。
   我们这里先来查看CCparticleSystem的内部结构和功能,如下:
   ·CCparticleSystem属性:
     tCCParticle *m_pParticles:粒子容器
     float m_fEmitCounter:粒子发射器每秒发射的粒子数
     unsigned int m_uParticleIdx:粒子索引
     CCParticleBatchNode* m_pBatchNode:批量处理多个粒子效果,用于提高粒子渲染绘制效率(类似CCSpriteBatchNode)
     unsigned int m_uAllocatedParticles:粒子总数量(或粒子容器的大小)
     bool m_bIsActive:是否激活粒子系统
     unsigned int m_uParticleCount:生存的粒子数量
     float m_fDuration:粒子发射器持续时长(-1表示持续一直发射,其他值表示持续时长)
     CCPoint m_tSourcePosition:发射器初始位置
     CCPoint m_tPosVar:发射器位置变化率
     float m_fLife:粒子生命周期
     float m_fLifeVar:粒子生命周期变化率
     float m_fAngle:粒子角度
     float m_fAngleVar:粒子角度变化率
     float m_fStartSize:粒子开始的尺寸(像素)
     float m_fStartSizeVar:粒子开始的尺寸变化率(像素)
     float m_fEndSize:粒子结束的尺寸(像素)
     float m_fEndSizeVar:粒子结束的尺寸变化率(像素)
     ccColor4F m_tStartColor:粒子开始的色彩
     ccColor4F m_tStartColorVar:粒子开始的色彩变化率
     ccColor4F m_tEndColor:粒子结束的色彩    
     ccColor4F m_tEndColorVar:粒子结束的色彩变化率
     float m_fStartSpin:粒子开始自旋的速度
     float m_fStartSpinVar:粒子开始自旋速度变化率
     float m_fEndSpin:粒子结束自旋速度
     float m_fEndSpinVar:粒子结束自旋速度变化率
     float m_fEmissionRate:粒子发射器发射速度
     unsigned int m_uTotalParticles:粒子总数量
     tCCPositionType m_ePositionType:粒子移动类型
     bool m_bIsAutoRemoveOnFinish:粒子结束后是否自动删除
     int m_nEmitterMode: //设置粒子模式(支持两种模式:重力模式(Gravity mode)和发射模式(Radius mode))
 
   ·CCparticleSystem方法:
     //初始化粒子系统(支持多种方式)
     static CCParticleSystem * particleWithFile(const char *plistFile)
     static CCParticleSystem * create(const char *plistFile)
     bool initWithFile(const char *plistFile)
     bool initWithDictionary(CCDictionary *dictionary)
     bool initWithTotalParticles(unsigned int numberOfParticles)
 
     bool addParticle():添加粒子
     void initParticle(tCCParticle* particle):初始化粒子
     void stopSystem():结束粒子系统
     void resetSystem():重置粒子系统
     void update(float dt):更新粒子系统
   
    以上就是CCparticleSystem主要的属性和方法。下面我们看一看如何使用粒子系统产生粒子效果。
    使用粒子系统一般分为五个步骤:
    1)创建粒子系统对象;
    2)产生粒子对象;
    3)设置粒子系统参数;
    4)设置粒子对象纹理图;
    5)将粒子系统添加到节点上(这样才能渲染绘制粒子效果)。
   
    使用代码如下:(以CCParticleFlower粒子效果为例)
    CCSprite* sprite = CCSprite::create("Images/sprite.png"); //创建精灵对象
    CCParticleSystem* emitter = CCParticleFlower::create();//创建粒子系统对象     emitter->setTexture(CCTextureCache::sharedTextureCache()->addImage("Images/particle.png"));//设置粒子对象纹理图
    sprite->addChild(emitter,0);//将粒子系统对象添加到精灵节点
    这样一个简单的花粒子效果就出现了,如下:
   
 
   如果仔细一点,一定可以发现上面代码缺少了点什么。是不是缺少产生粒子对象和设置粒子系统参数两个步骤呀?其实没有少,它们在CCParticleFlower的create方法里,这个方法会调用CCParticleFlower的init方法,用于初始化CCParticleFlower对象。init方法的定义如下:
   bool init(){ return initWithTotalParticles(250);
   原来它调用initWithTotalParticles方法,参数250表示创建250个粒子对象。再查看initWithTotalParticles方法代码,如下:
   bool CCParticleFlower::initWithTotalParticles(unsigned int numberOfParticles)
   {
    if( CCParticleSystemQuad::initWithTotalParticles(numberOfParticles) )
    {
        // duration
        m_fDuration = kCCParticleDurationInfinity;
        // Gravity Mode
        m_nEmitterMode = kCCParticleModeGravity;
        // Gravity Mode: gravity
        modeA.gravity = ccp(0,0);
        // Gravity Mode: speed of particles
        modeA.speed = 80;
        modeA.speedVar = 10;
        // Gravity Mode: radial
        modeA.radialAccel = -60;
        modeA.radialAccelVar = 0;
        // Gravity Mode: tagential
        modeA.tangentialAccel = 15;
        modeA.tangentialAccelVar = 0;
        // angle
        m_fAngle = 90;
        m_fAngleVar = 360;
        // emitter position
        CCSize winSize = CCDirector::sharedDirector()->getWinSize();
        this->setPosition(ccp(winSize.width/2, winSize.height/2));
        m_tPosVar = CCPointZero;
        // life of particles
        m_fLife = 4;
        m_fLifeVar = 1;
        // size, in pixels
        m_fStartSize = 30.0f;
        m_fStartSizeVar = 10.0f;
        m_fEndSize = kCCParticleStartSizeEqualToEndSize;
        // emits per second
        m_fEmissionRate = m_uTotalParticles/m_fLife;
        // color of particles
        m_tStartColor.r = 0.50f;
        m_tStartColor.g = 0.50f;
        m_tStartColor.b = 0.50f;
        m_tStartColor.a = 1.0f;
        m_tStartColorVar.r = 0.5f;
        m_tStartColorVar.g = 0.5f;
        m_tStartColorVar.b = 0.5f;
        m_tStartColorVar.a = 0.5f;
        m_tEndColor.r = 0.0f;
        m_tEndColor.g = 0.0f;
        m_tEndColor.b = 0.0f;
        m_tEndColor.a = 1.0f;
        m_tEndColorVar.r = 0.0f;
        m_tEndColorVar.g = 0.0f;
        m_tEndColorVar.b = 0.0f;
        m_tEndColorVar.a = 0.0f;
        // additive
        this->setBlendAdditive(true);
        return true;
    }
    return false;
}
    看到了吧,粒子系统参数在这里设置的。那粒子对象又在那里创建的呢?是在CCParticleSystem的initWithTotalParticles方法里,如下:
bool CCParticleSystem::initWithTotalParticles(unsigned int numberOfParticles)
{
    m_uTotalParticles = numberOfParticles;
    CC_SAFE_FREE(m_pParticles);
    //创建粒子对象
    m_pParticles = (tCCParticle*)calloc(m_uTotalParticles, sizeof(tCCParticle));
    ...
    return true;
}
 
   除了直接使用内置的粒子效果类(CCParticleSystemQuad子类)创建粒子系统,还可以使用粒子编辑器来创建粒子系统。粒子编辑器的工作原理就是将设置大量粒子参数通过粒子编辑器进行编辑,然后产生plist粒子系统配置文件,程序加载plist粒子配置文件完成粒子参数的设置。使用粒子编辑器的好处是避免了程序中大量设置粒子参数代码,另一个好处是调整粒子参数属性不需要修改程序。
 
   Particle Designer是一款71 Squared公司开发的粒子效果编辑器,它运行到Mac系统之下,用于生成Cocos2d、Sparrow、Startling和MOAI等引擎可用的粒子系统文件。在这些引擎中,我们可以利用Particle Designer在调整参数的同时预览效果。Particle Designer功能很强大,可惜是收费软件,需要购买才能使用。
  
   Cocos2d Particle Editor是一款Windows下的粒子编辑器。它是一个开源项目,可以在网站上下载使用程序和源代码。
 
   我这里就不介绍这两种粒子系统编辑器的使用,在网上应该能够找到很多这方面的教程。我想说的是,无论采用哪种粒子系统编辑器,基本操作都差不多。
   ·在粒子库中寻找和你想要的效果接近的粒子特效;
   ·调整该粒子特效的属性参数,使其达到你想要的最佳效果;
   ·将调整好的粒子特效属性参数存储为plist配置文件。
  
   粒子系统就简单介绍这些,在TestCpp工程的ParticleTest测试项中有大量粒子特效的实例代码,可以进行参考学习。
-------------------------------------------------------------------------------------------------------------------

注:本人在本博客的原创文章采用创作共用版权协议http://creativecommons.org/licenses/by-nc-sa/2.5/cn/), 要求署名、非商业用途和保持一致。要求署名包含注明我的网名及文章来源(我的博客地址:http://www.cnblogs.com/binbingg)。

[原创]cocos2d-x研习录-第三阶 特性之粒子系统的更多相关文章

  1. [原创]cocos2d-x研习录-第三阶 特性之物理引擎

    游戏物理引擎是指在游戏中涉及物理现象的逻辑处理,它用于模拟现实世界的各种物理规律(如赛车碰撞.子弹飞行.物体掉落等),让玩家能够在游戏中有真实的体验. Cocos2D-x中支持Box2D和Chipmu ...

  2. [原创]cocos2d-x研习录-第三阶 特性之瓦片地图集

    由于一张大的世界地图或背景图片往往可以由屈指可数的几种地形来表示,每种地形对应于一张小的图片,我们称这些小的地形图片为瓦片.把这些瓦片拼接在一起,组合成一个完整的地图,这就是瓦片地图集的基本原理. C ...

  3. [原创]cocos2d-x研习录-第三阶 特性之调度器

    在游戏中,经常会周期执行一些检测.操作或更新一些数据等,我们称之为调度.Cocos2D-x中将调度封装为类CCScheduler,方便在游戏开发中使用.我们一起来学习一下,CCScheduler具有哪 ...

  4. [原创]cocos2d-x研习录-第三阶 特性之动作

    在前面的Cocos2D-x的概念类中,我们了解到节点类CCNode.导演类CCDirector.场景类CCScene.布景层类CCLayer和精灵类CCSprite等,这些类都是构成游戏画面的基本元素 ...

  5. [原创]cocos2d-x研习录-第三阶 特性之按键与虚拟键盘

    Cocos2D-x引擎支持按键事件,它能检测设备的键盘输入并处理相应的事件.而基于不同操作系统的移动设备,可供用户操作的按键数量和功能都存在差异.   Cocos2D-x使用CCKeypadDeleg ...

  6. [原创]cocos2d-x研习录-第三阶 特性之加速度传感器

    智能手机的游戏与应用中,也经常会用到加速传感器事件来丰富用户的体验,比如飞翔的企鹅(英文AirPenguin)游戏就是通过加速度传感器来控制角色的移动和跳跃方向.下面学习Cocos2D-x中如何使用加 ...

  7. [原创]cocos2d-x研习录-第三阶 特性之触屏

    游戏跟视频最大的区别就是互动,而手游(基于智能手机)主要靠触摸屏幕.重力传感和虚拟键盘等方式实现互动.这里主要记录Cocos2D-x对玩家触屏操作的处理. 在Cocos2D-x中触屏分为单点触屏和多点 ...

  8. [原创]cocos2d-x研习录-第三阶 多分辨率适配器

    在移动终端(智能手机)平台下开发游戏一般都会涉及到屏幕多分辨率适配问题,原因是手机款式多种多样,不同的款式存在有不同的尺寸,即使尺寸相同又可能存在不同的分辨率. 手机屏幕尺寸:指手机屏幕对角线长度. ...

  9. [原创]cocos2d-x研习录-第三阶 背景音乐和音效

    在游戏中,音效是一个不可或缺的部分,它可以为我们的游戏增加效果.音效在游戏中一般分为长时间的背景音乐和短促的特效音乐.Cocos2D-x支持多种常见音乐格式(mp3.wav等). Cocos2D-x提 ...

随机推荐

  1. MYSQL 处理批量更新数据的一些经验。

    首先,我们需要了解下MYSQL CASE EXPRESSION 语法. 手册传送门:http://dev.mysql.com/doc/refman/5.7/en/control-flow-functi ...

  2. javascript曲线图和面积图Line & Area chart控件功能及下载

    Line & Area chart 控件是一款新型的.可用性极强的曲线图和面积图产品.一个您网站的访问者可以放大他感兴趣的一段区域,打开和关闭数值气球,并可显示和隐藏图表.您能创建简单.堆积. ...

  3. install graph-tool

    try this if ubuntu version is >= 14.04 sudo apt-get update sudo apt-get upgrade sudo apt-get -y i ...

  4. Python开发入门与实战21-订阅事件(subscribe)

    21. 订阅事件(subscribe) 新用户关注微信公众平台,将产生一个订阅事件,即subscribe事件,在新用户关注公众平台后为新用户提供一些简明扼要的公众号说明 事件推送(event): 接收 ...

  5. HTML DOM对象之createElement()方法

    今天在学习DOM节点操作时,发现了创建DOM节点的createElement()方法的一个有意思的现象. 代码如下: var box=document.getElementById("box ...

  6. 预装win8的系统换win7需要做的bios设置

    https://zhidao.baidu.com/question/873669708066476212.html (一)联想G50-70由于预装的是WIN8位系统,哪么改装WIN7 64位的方法如下 ...

  7. 每天学习一点点--word-break和word-wrap用法和区别

    有时候一个又臭又长的单词出现在一个并不宽到足以容纳这个单词时会出现内容溢出容器这种情况: <!DOCTYPE html> <html lang="en"> ...

  8. 使用spring @Scheduled注解执行定时任务、

    http://blog.csdn.net/sd4000784/article/details/7745947,留下来备用.

  9. ArrayList添加新元素的覆盖问题

    首先,看一个代码段: 1. ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String&g ...

  10. PID算法学习记录

    最近做项目需要用到PID算法,这个本来是我的专业(控制理论与控制工程),可是我好像是把这个东西全部还给老师了. 没办法,只好抽时间来学习了. 先占个座,后续将持续更新!