粒子效果

第15章

粒子系统

15.1  粒子系统简介

粒子系统在游戏中被大量应用,我们主要将其应用于游戏特效,它能够极大的提高游戏地画面观感。有时,我们使用帧动画来为精灵添加动画,并且使用帧动画也可以实现特效的效果,但是其缺点也很明显。

(1)画面效果弱,有时要想实现一个大范围的爆炸,还需要美工做很多事情。

(2)细节不自然,在视觉上没有变化,模式比较僵硬

(3)画面制作成本比较高。

以前,手机性能不强时,使用粒子系统是非常耗费资源的。现在,手机硬件配置和软件支持(OpenGL)的大幅度强化,使强大的粒子系统有了展示的机会。下面我们就来介绍粒子系统。

15.2  粒子系统的生命周期

作为一个对象,粒子存在于引擎当中,其一旦诞生就要经历一个完整的生命周期:出生、成长及死亡。

首先,在引擎中存在一个粒子池,用于存放等待复活的粒子,发射器会从粒子池中获取一个粒子,然后计算赋予的初始属性,将粒子发射出去,粒子诞生。

其次,粒子发射出去后,衰减器会在粒子的运动过程中,不断地刷新来修改其属性,这就是粒子成长的过程。

最后,粒子死亡后,回归粒子池。等待重新被激活。

15.3  粒子的相关属性

粒子的常见属性有位置、颜色、尺寸及旋转等,我们需要的效果通过单个粒子是实现不了的,需要一个能产生粒子的发射器以发射很多的粒子。

15.4  发射器的相关属性

发射器有两种:一种是重力发射器(用于实现在重力条件下的粒子运动);另一种是放射发射器(用于实现在无重力条件下的粒子运动)。在Cocos2d-x中,我们使用ParticleSystem来设置发射器的属性,下面看一下发射器的常见属性。

代码清单16-1:

struct {

         Vec2 gravity;                //重力和方向的向量

         float speed;                 //速度

         float speedVar;              //粒子的速度差异

         float tangentialAccel;       //粒子的切线加速度

         float tangentialAccelVar;    //粒子间的切线加速度差异

         float radialAccel;           //粒子的径向加速度

         float radialAccelVar;        //粒子间的径向加速度差异

         bool rotationIsDir;

 } modeA; 

struct {   float startRadius;          //粒子开始半径

             float startRadiusVar;     //粒子间开始半径差异

             float endRadius;          //粒子结束半径

             float endRadiusVar;       //粒子间结束半径差异

             float rotatePerSecond;    //粒子每秒的旋转角度

             float rotatePerSecondVar; //粒子间每秒的旋转角度差异

} modeB;

粒子系统的多样性,依靠的是自身众多属性的配置,如果用代码来进行各项配置,那么对我们来说将是一个极大的考验,因此,一些开发者制作了粒子编辑器。接下来介绍一款简单的粒子编辑器——Particle Designer的使用方法。

Particle Designer是一款专门为Cocos2d开发的粒子编辑器,我们可以在 http://particledesigner.71squared.com下载试用版。试用版有一些限制,不能保存,因此,你可以选择购买正式版,价格约7.99美元。下面我们看一下该软件的界面,如图15-1所示。

 

图15-1  ParticleDesigner界面

 

图15-2  ParticleDesigner属性调整界面

使用该软件的最大好处就是通过直观的方式来修改粒子的各种属性,如图15-2红色区域所示,省去了开发者单独调试的时间,并且可以在模拟器视图中同步地看到粒子属性修改所带来的变化,设计完成后我们可以将其导出以便在自己应用程序中使用。

15.5  在代码中使用粒子效果

设计完成粒子效果之后,可以将其保存为plist文件,plist文件就是将粒子系统所需要的参数以XML的形式组装起来。Cocos2d-x直接支持plist作为粒子系统的参数,并且提供了非常多的粒子系统效果:

◎        ParticleSystem(所有粒子系统的父类)

◎        -- ParticleExplosion (爆炸粒子效果)

◎        -- ParticleFireworks(烟花粒子效果)

◎        -- ParticleFire(火焰粒子效果)

◎        -- ParticleFlower (花束粒子效果)

◎        -- ParticleGalaxy(星系粒子效果)

◎        -- ParticleMeteor(流星粒子效果)

◎        -- ParticleSpiral(漩涡粒子效果)

◎        -- ParticleSnow(雪粒子效果)

◎        -- ParticleSmoke(烟粒子效果)

◎        -- ParticleSun (太阳粒子效果)

◎        -- ParticleRain (雨粒子效果)

下面介绍如何在项目中使用我们导出的文件。

第一步,使用我们自己导出的文件,如代码清单15-2所示。

代码清单15-2:

//Boom.plist文件是我们导出的文件

auto sy=ParticleSystemQuad::create ("Boom.plist");

//设置单个粒子的纹理

sy->setTextureWithRect(Director::getInstance()->getTextureCache()->addImage(“fire.png”) );

sy->setBlendAdditive(true);//这个调用必不可少

sy->setPosition(Point(200,200));//设置位置

sy->setDuration(2);//设置持续时间

addChild(sy);//添加粒子效果

sy->setAutoRemoveOnFinish(true);//播放完之后自动移除

第二步,使用系统提供的粒子效果,以下雪ParticleSnow和ParticleRain为例子讲解,如代码清单15-3所示。

代码清单15-3:

auto snow = ParticleSnow::create();

snow->setTexture(Director::getInstance()->getTextureCache()->addImage(“fire.png”));

    snow->setPosition(Vec2( 450, 840));

    snow->setTotalParticles(130);

    snow->setLife(5.0f);

    this->addChild(snow);

 

  //雨

    auto rain = ParticleRain::create();

    rain->setTexture(Director::getInstance()->getTextureCache()->addImage(fire.png));

    rain->setPosition(Vec2( 450, 940));

    rain->setTotalParticles(130);

    rain->setLife(5.0f); 

    this->addChild(rain);

好了,对于粒子系统我们先讲解这么多,不再详述其他属性,有兴趣的读者可以深入研究,以开发出具有超棒效果的应用程序。

15.6  小结

本章我们主要讲解了粒子系统的使用,包括粒子工具的制作和其在代码中的使用方法。希望大家能掌握常见的属性,熟练地制作方法需要的粒子效果。另外,对于系统中提供的常见粒子效果我们也必须掌握,这些效果虽然简单,却有利于我们队其进行使用。

 

资源安装文件-Mac os 联系作者Email:1911398892@qq.com

 

如果一件事情你觉得难的完不成,你可以把它分为若干步,并不断寻找合适的方法。最后你发现你会是个超人。不要给自己找麻烦,但遇到麻烦绝不怕,更不要退缩。 电工查找电路不通点的最快方法是:分段诊断排除,快速定位。你有什么启示吗? 求知若饥,虚心若愚。 当你对一个事情掌控不足的时候,你需要做的就是“梳理”,并制定相应的规章制度,并使资源各司其职。
原文地址:https://www.cnblogs.com/wvqusrtg/p/4616331.html