第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:[email protected]