您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d-x学习笔记(十四)-------->粒子特效

2014-12-11 00:14 363 查看
粒子特效
Cocos2d-x粒子特效原理
不论是2D还是3D,几乎每个游戏引擎都会提供一套自己的粒子系统,这些粒子系统的内容和功能大同小异,原因是粒子系统本身就已经成为了游戏开发的技术规范。粒子系统所模拟的图像效果都有如下特点:
(1)整个现象都是由很多个独立的图像效果组成,这些图像效果都有自己的位置、移动轨迹等特点;
(2)这些独立的图像效果组合或者叠加起来,就形成了要模拟的现象;
(3)独立的图像效果经过一段生命周期之后会从屏幕上消失,进而可以将其状态重置并重新利用;
以上所谓的独立图像,就可以抽象称为粒子,而对整个现象的模拟,就是对多个粒子的控制和管理过程,这就是粒子系统的主要工作。参考粒子系统的运行原理和特点,在x引擎的粒子系统中,提供了两个最为主要的功能类。
粒子类:每个单独的粒子是整个粒子特效的一个基本组成部分,每个粒子都具有大量属性,比如粒子图片、生命时长、方向、速度、加速度等,这些属性能够决定粒子的外观及行为表现。
粒子发射器:实际上是所有粒子的管理者,是用来进行粒子生成、粒子控制、回收粒子的管理器类。

Cocos2d-x引擎使用单一发射器模式,也就是说每个粒子特效都是独立的,都具有自己唯一的发射器和大量属于此发射器的粒子。比如要实现一架飞机的爆炸,我们需要定义两个独立的粒子系统,第一个负责显示爆炸火焰粒子特效,第二个复杂显示飞机残片散落特效。有些游戏引擎可能提供多发射器模式,一个粒子系统同时具有多个粒子发射器,可以发射不同的粒子效果。这两种模式并没有明显的好坏之分,因为它们都能满足实现复杂粒子效果的需求。

x引擎粒子发射器工作原理
在进行粒子系统创建时,首先把粒子发射器放到某个位置,然后设定要生成的粒子的数量及粒子的起始属性,然后再开始创建出粒子,并不断的更新粒子的状态,粒子在更新运动状态的同时生命值会不断地消耗直至死亡。死亡后的粒子被发射器记录回收,为保证同一时间内有固定数量的粒子在存活中,发射器会在合适的时间重新初始化并运行回收的粒子。

x引擎在渲染粒子对象时,少则几十个粒子,多则成百上千。所以粒子对象的绘制必然要使用高效的批量绘制技术,这一特点和精灵Sprite的批量绘制SpriteBatchNode方法比较相似。x引擎使用了CCParticleBatchNode,这个类的强大支持下,使用同一个纹理的粒子对象被高效地绘制到屏幕之上。

CCParticleSystem是x引擎提供的粒子系统类,而在此类基础上,x引擎还提供了一种更完善的CCParticleSystemQuad作为扩展粒子系统。CCParticleSystemQuad使用户可以在不需要批次节点(BatchNode)时也能够实现粒子系统的OPENGL顶点和索引缓冲的创建和渲染。但是大家在使用粒子系统时,尽量保证使用同一张图片资源,尽量使用批次渲染以提高游戏的运行效率。x引擎还内置了30多种直接可用的粒子特效,这些特效都在CCParticleSystemQuad基础上定义成了直接可用的类,我们在使用时直接定义对象并修改粒子属性就能够得到让人满意的效果。

使用
bulletCaseEmitter = new CCParticleSystemQuad();
bulletCaseEmitter->initWithTotalParticles(15);
bulletCaseEmitter->autorelease();

bulletCaseEmitter->setTexture(CCTextureCache::sharedTextureCache()->addImage("bullet_case.png"));
bulletCaseEmitter->setDuration(-1);
bulletCaseEmitter->setGravity(CCPointZero);
bulletCaseEmitter->setAngleVar(10);
bulletCaseEmitter->setSpeed(150);
bulletCaseEmitter->setRadialAccel(-120);
bulletCaseEmitter->setTangentialAccel(50);
bulletCaseEmitter->setPosVar(CCPointZero);
bulletCaseEmitter->setLife(1.0f);
bulletCaseEmitter->setEndSpinVar(2000);
ccColor4F startColor = {1.0f, 1.0f, 1.0f, 1.0f};
bulletCaseEmitter->setStartColor(startColor);
ccColor4F startColorVar = {0.0f, 0.0f, 0.0f, 1.0f};
bulletCaseEmitter->setStartColorVar(startColorVar);
ccColor4F endColor = {1.0f, 1.0f, 1.0f, 0.2f};
bulletCaseEmitter->setEndColor(endColor);
ccColor4F endColorVar = {0.0f, 0.0f, 0.0f, 0.2f};
bulletCaseEmitter->setEndColorVar(endColorVar);
bulletCaseEmitter->setEmissionRate(10);
bulletCaseEmitter->setBlendAdditive(false);
bulletCaseEmitter->setStartSize(16.0f);
bulletCaseEmitter->setEndSize(kParticleStartSizeEqualToEndSize);
gunSprite->getParent()->addChild(bulletCaseEmitter, 13);
bulletCaseEmitter->setPosition(ccp(BULLET_PARTICLE_POS, BULLET_PARTICLE_POS));
上面代码定义了一个子弹弹壳不断从枪膛飞出的粒子特效,在定义此特效时我们通过使用粒子发射器定义了非常多的粒子和发射器属性。

粒子编辑器使用介绍
在游戏开发流程中,通常都会使用粒子编辑器这类工具来编辑、调试和观察粒子的效果,在得到满意的效果后,可以通过粒子编辑器将粒子和编辑器属性以配置文件的形式保存,在x引擎需要播放粒子特效时,读取配置文件并生成对应的粒子特效。这种粒子特效的定义和工作方式极大地方便了开发者,让开发者从复杂的属性定义代码中解放出来。
因为2D游戏的粒子系统通常都采用了统一的技术规范,所以不同2D游戏引擎的粒子和发射器属性却大同小异,在这种情况下,一款粒子编辑器就可以支持大多数的2D游戏引擎,也就是说,在市面上的大多数2D游戏粒子编辑器,都能够支持x引擎中的粒子系统。粒子编辑器统一输出的配置文件是plist格式(全称是PropertyList,中文译为属性列表),这是一种预定义好格式的XML文件。
例:
<?xml version="1.0" encoding="utf-8"?>
<plist version="1.0">
<dict>
<key>angle</key>
<real>0.000000</real>
<key>angleVariance</key>
<real>360.000000</real>
<key>duration</key>
<real>-1.000000</real>
<key>startParticleSize</key>
<real>9.000000</real>
<key>startParticleSizeVariance</key>
<real>64.000000</real>
<key>finishParticleSize</key>
<real>9.000000</real>
<key>finishParticleSizeVariance</key>
<real>0.000000</real>
<key>gravityx</key>
<real>0.000000</real>
<key>gravityy</key>
<real>0.000000</real>
<key>maxParticles</key>
<real>30.000000</real>
...
</dict>
</plist>
plist配置文件中的属性定义都是以KeyValue对的形式出现,例如上面的XML节点<key>angle</key>就是名称为angle的属性,它的值就是后面紧跟着的XML节点<real>0.000000</real>,其中的real指明它是浮点数据类型,值是0.000000度。

Windows下采用particle builderCocos2d-x引擎编辑粒子特效。



粒子属性介绍
Max Particles:全部粒子的总数量,也就是同时能够显示的最大粒子数量。
Life span:粒子的生命值,此属性决定粒子会在多长时间内从生成到消失,此属性为单个粒子设置生命期。
Life span Variance:生命值浮动值,每个粒子的具体生命时间由生命值和其浮动值一起计算,比如生命值是5秒,浮动值为1秒,则最终的生命值就是4~6秒之间的随机数值。

Start Size:起始大小,使用像素作为单位,粒子最终大小需要与浮动值一同计算得出。
Start Size Variance:起始大小浮动值。
Finish Size:结束大小,同样使用像素作为单位,粒子最终大小还需要与浮动值一同计算得出。
Finish Size Variance:结束大小浮动值。
Angle:发射角度,最终值还需要与浮动值一同计算得出。
Angle Variance:发射角度浮动值。
Rotation Start:起始旋转角度,最终值还需要与浮动值一同计算得出。
Rotation Start Variance:起始旋转角度浮动值。
Rotation End:结束旋转角度,最终值还需要与浮动值一同计算得出。
Rotation End Variance:起始旋转角度浮动值。

每个粒子都可以从一个起始颜色渐变到一个最终颜色,从而创造出艳丽的颜色粒子效果。我们至少需要设置起始颜色,因为默认情况下粒子是黑色的,所以如果不设置起始颜色的话,就可能看不到粒子。颜色类型是ccColor4F,这是一个由4个浮点数组组成的结构体:rgba分别对应绿透明度。浮点数的数值在0到1之间,1代表最饱和的颜色,如果需要完全白色的粒子颜色的话,就应该把所有rgba都设置为1。以下是粒子的颜色属性表格。
Start Red:起始红色通道值。
Start Green:起始绿色通道值。
Start Blue:起始蓝色通道值。
Start Alpha:起始透明度通道。
Start Red Variance:起始红色通道浮动值。
Start Green Variance:起始绿色通道浮动值。
Start Blue Variance:起始蓝色通道浮动值。
Start Alpha Variance:起始透明度通道浮动值。
Finish Red:终止红色通道值。
Finish Green:终止绿色通道值。
Finish Blue:终止蓝色通道值。
Finish Alpha:终止透明度通道值。
Finish Red Variance:终止红色通道值浮动值。
Finish Green Variance:终止绿色通道值浮动值。
Finish Blue Variance:终止蓝色通道值浮动值。
Finish Alpha Variance:终止透明度通道浮动值。

发射器属性简介
粒子发射器有两种类型,一种是重力发射器(用于实现在重力条件下的粒子运动),另一种是放射发射器(用于实现在无重力下的粒子运动)。

通用属性
Duration:持续时间,此属性决定发射器粒子的时间,如果是设置为2秒,则连续发射2秒后就停止了,如果是-1,表示一直持续发射。
Emitter Type:发射器类型,包括两种发射器:重力(Gravity)和放射(又叫半径发射器Radius)。
Source PositionX:发射器x坐标。
Source PositionX Variance:发射器x坐标浮动值。
Source PositionY:发射器y坐标。
Source PositionY Variance:发射器y坐标浮动值。

重力发射器类型的专用属性
Speed:粒子移动的速度。
Speed Variance:速度浮动值。
Gravity X:粒子X轴加速度大小。
Gravity Y:粒子Y轴加速度大小。
Radial Acceleration:径向加速度,此值为正数,粒子离发射器越远速度就越快;此值为负数,粒子离发射器越远,速度就越慢。
Radial Acceleration Variance:径向加速度浮动值。
Trangential Acceleration:切向加速度,它可以让粒子围着发射器旋转,粒子旋转离开发射器越远,速度越快。此属性值为正数,粒子逆时针旋转;此属性为负数,粒子顺时针旋转。
Trangential Acceleration Variance:切向加速度浮动值。

放射发射器类型的专用属性
Max Radius:最大半径,是粒子效果的节点位置和发射粒子的位置之间的距离。
Max Radius Variance:最大半径浮动值。
Min Radius:最小半径,是粒子效果和粒子最终要到达的位置之间的距离。
Rotate Per Second:每秒旋转,使用此值来影响粒子移动的方向和速度。
Rotate Per Second Variance:每秒旋转浮动值。

使用
void ParticleBatchHybrid::onEnter()
{
ParticleDemo::onEnter();

setColor(ccBLACK);
removeChild(m_background, true);
m_background = NULL;

m_emitter = CCParticleSystemQuad::create("Particles/LavaFlow.plist");
m_emitter->retain();
CCParticleBatchNode *batch = CCParticleBatchNode::createWithTexture(m_emitter->getTexture());

batch->addChild(m_emitter);

addChild(batch, 10);

schedule(schedule_selector(ParticleBatchHybrid::switchRender), 2.0f);

CCNode *node = CCNode::create();
addChild(node);

m_pParent1 = batch;
m_pParent2 = node;
}
效果



常用x引擎内置粒子特效
火焰效果:x引擎使内置的CCParticleFire类实现了这一粒子特效,全部粒子和发射器的属性定义都由CCParticleFire类实现。唯一要做的就是需要指定粒子使用的2D图片。
使用
CCParticleFire* fire = CCParticleFire::create();
fire->retain();
fire->setTexture(CCTextureCache::sharedTextureCache()->addImage("fire.png"));

fire->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));
this->addChild(fire);
效果



爆炸效果:x引擎使用内置的CCParticleExplosion类实现爆炸特效,与CCParticleFire一样,全部粒子和发射器的属性定义都由CCParticleExplosion类实现。
使用
CCParticleExplosion* boom = CCParticleExplosion::create();
boom->retain();
boom->setTexture(CCTextureCache::sharedTextureCache()->addImage("fire.png"));

boom->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));
this->addChild(boom);
效果



烟雾效果:x引擎使用内置的CCParticleSmoke类实现了这一粒子特效。
使用
CCParticleSmoke* smoke = CCParticleSmoke::create();
smoke->retain();
smoke->setTexture(CCTextureCache::sharedTextureCache()->addImage("fire.png"));

smoke->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));
this->addChild(smoke);
效果



x引擎内置了30多种粒子特效,要想高效地在游戏中实现粒子特效,更多的是需要掌握粒子特效工具的使用,以及利用好x引擎以及提供给大家的多种粒子特效样例。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: