cocos2d粒子效果

第9章 粒子效果 
游戏开发者通常使用粒子系统来制作视觉特效。粒子系统能够发射大量细小的粒子并对他们进行渲染,而且效率要远高于渲染同样数目的精灵。粒子系统可以模拟下雨、火焰、雪、爆炸、蒸气拖尾以及其他多种视觉效果。 
粒子系统由很多属性来驱动。这里的“很多”大概是30种左右,它们不仅影响单个粒子的外观和行为,而且也影响着整体的粒子效果。粒子效果是所有粒子一起工作所创造出的独有的视觉效果。单个粒子或是10个粒子是做不出火焰效果的,一般需要十几个甚至数百个粒子以正确的方式运行才能够制作出火焰效果。 
9.1 粒子效果实例 
cocos2d的源码中自带了很多内置的粒子效果,这些例子可以说明cocos2d能够创造出的粒子效果。如果你想在简单修改之后就直接使用这些例子中的特效,那么可以直接修改并使用CCParticleExamples.m文件中的代码,或是创建一个继承类。创建例子中的粒子效果和使用普通CCNode对象的方式是一样的,因为它们都继承自CCNode类。 
只有一种粒子的效果不能被移动——像CCParticleExplosion(爆炸效果)这样的一次性效果。爆炸效果的特别之处是:所有的粒子会被一次性射出,然后粒子发射就结束了。其他的粒子效果会一直发射粒子:在一些粒子应为生存期结束而消失的同时,新的粒子还在不断地生成。使用此类粒子效果的难点在于如何保持屏幕上同时显示的粒子的总数。 
cocos2d内置的粒子效果需要加载一个指定的贴图fire.png。这幅图像可以在cocos2d源码的Resources/Images文件夹中找到。即便没有贴图,也还是可以生成很漂亮的粒子效果,但前提是粒子要很小才可以。可以将fire.png添加到你的Xcode项目中,这样就可以看到内置粒子效果的原始效果了。 
9、2用复杂方法创建粒子效果。 
实际上新类应该继承自CCPointParticleSystem(点粒子系统)或CCQuadParticleSystem(方形粒子系统)。点粒子系统在第1代和第2代iOS设备上运行得比方形粒子系统要快一些。但是点粒子系统在第3代和第4代iOS设备上,比如iPhone3GS、iPad和iPhone4,运行得不是很流畅。这是因为这些设备的CPU架构变了。第3代和第4代iOS设备使用了ARMv7CPU架构,里面包含了很多优化和新特性,比如增加了一个“矢量浮点处理器”(vector floating-point processor)和一个SIMD指令级(SIMD instruction Set,又称NEON),而方形粒子系统则能很好地利用这些新特性。 
如果无法决定要采用哪个粒子系统,那么就应该选择CCQuadParticleSystem,因为它在所有设备上都可以流畅运行,而且由它生成的效果和点粒子系统一样。或者也可以让cocos2d通过构建目标(build target)来替你判断应该使用哪个粒子系统。 
9.2.1 变化度属性 
在上面的代码中,很多属性都有一个后缀是Var的配对属性。它们是变化度属性,用于决定对应属性运行的模糊度范围。比如属性life=5和lifeVar=1,这些数值意味着每个粒子的平均生存期是5秒,而变化度lifeVar则允许生命值在5-1和5+1之间变化。这样一来,每个粒子都会得到一个介于4秒和6秒的随机的生存期。 
如果不想设置变化度,可以将以Var为后缀的变量设置为0。变化度为粒子效果带来了动态的行为和外观。不过在设计新效果时,变化度可能会让你迷惑。因此,除非有设计经验,否则建议在开始时使用尽可能小的变化度值为好,或者根本不用。 
9.2.2 粒子数量 
totalParticles用于设置粒子效果中的粒子总数。通常使用initWithTotalParticles方法来初始化totalparticles变量,随后可以改变它的值。粒子的数量对粒子效果的外观和运行效率有直接的影响。 
提示; 
一般而言,我们的目标是用最少的粒子创造出所需的效果。单个粒子的大小对游戏运行效率也有很大的影响——单个粒子越小,性能越高。 
9.2.3 发射器持续时间 
发射器的duration(持续时间)属性决定着发射器发射粒子的时间长短。如果设为2,发射器将会在两秒钟的时间内持续生成粒子,然后就停止了。设置的方法很简单。 
self.duration=2.0f; 
如果想在粒子系统停止发射粒子和粒子都消失以后,将粒子系统的节点从它的父节点删除的话,可以将autoRemoveOnFinish属性设置为YES。 
9.2.4 发射器模式 
cocos2d的粒子系统存在两种发射器模式:重力模式和半径模式。它们由emitterMode属性来控制。虽然这两种模式的大多数参数相同,但是生成的粒子效果却完全不同。 
1.重力模式 
重力模式可以让粒子向一个中心点飞去,或者飞离一个中心点。它的有点事可以创造出非常动态和自然的效果。以下代码用于设定重力模式: 
self.emitterMode=kCCParticleModeGravity; 
重力模式下有以下几个独有的属性,这些属性只有在emitterMode被设为kCCParticleModeGravity时才能使用。 
centerOfGravity属性是一个CGPoint对象,用于计算与新生成粒子所处位置之间的偏移。其实这个名称有点误导人,因为实际的重心点应该是新生成粒子的位置,而centerOfGravity则是与粒子重心点的偏移。 
gravity属性用于决定粒子在X轴和Y轴的加速度大小。要想让重心点有任何效果,粒子的gravity属性值不应该设置得太大,centerOfGravity也不应设置的太远。 
如果radialAccel属性的值是正数,那么粒子离开发射器越远,加速就越快。如果此属性的值为负数,那么粒子离开发射器越远,速度就越慢。 
tangentialAccel属性与radialAccel属性类似,只是它可以让粒子围着发射器旋转,粒子离开发射器越远,旋转速度越快。该属性的值为正时,粒子沿逆时针方向旋转;属性为负时,粒子沿顺时针方向旋转。 
speed属性决定粒子的移动速度。这里的速度没有指定计量单位。 
2.半径模式 
半径模式会让粒子沿着一个圆形旋转,当然也可以生成螺旋粒子的效果、漩涡效果或是螺旋上升效果。 
同重力模式一样,半径模式也有几个专有属性,只有在emitterMode被设置为KCCParticleModeRadius时才能使用。 
startRadius属性用于确定粒子效果节点与发射粒子位置之间的距离。endRadius属性则用于确定粒子效果节点与粒子最终要到达的位置之间的距离。如果想得到完美的粒子效果,可以使用一些常量将endRadius和startRadius设置为相同的值。 
self.endRadius=kCCParticleStartRadiusEqualToEndRadius; 
可以通过rotatePerScond属性来改变粒子移动的方向和速度。如果startRadius和endRadius的值不相同的话,也会影响粒子旋转的圈数。 
9.2.5 粒子位置 
通过移动粒子节点的位置,可以移动整个效果。不过效果本身也有一个posVar属性,用于控制锌离子将被生成的位置上的变化。默认情况下,position和pisitionVar都在节点的中心位置。 
自由移动类效果最适合用于实现蒸气、火焰,引擎产生的废气等效果。 
9.2.6 粒子大小 
startSize和endSize属性用于控制粒子的大小,单位是像素。startSize是粒子刚被发射时的大小,endSize是粒子消失时的大小。粒子的大小从startSize渐变为endSize。 
kCCParticleStartSizeEqualEndSize这个常量用于确保粒子在其生存期内大小都不发生变化。 
9.2.7 粒子方向 
发射粒子时,粒子射出的方向使用angle属性来控制的。angle为0意味着向上发射粒子,不过只有在重力模式下才会如此。在半径模式下,angle属性有农工业决定粒子在startRadius属性上的发射点,大的angle值将导致发射点沿半径逆时针移动。 
9.2.8 粒子生存期 
粒子生存期指明了粒子从生成到消失的时间长短。life属性可以为单个粒子设置生存期。请记住,粒子的生存期越长,任意时刻屏幕上同时存在的粒子就越多。如果屏幕上同时显示的粒子数达到所允许的最大数量,那么在一些已存在的粒子小时之前将不能再生成新的粒子。 
emissionRate属性直接影响着每秒钟内可以生成的粒子数量。与totalParticles属性配合使用,会对粒子效果的外观有很大的影响。 
通常,需要调整emissionRate来与粒子的生存期及totalParticles属性相匹配。可以通过以下公式来计算emissionRate的值: 
self.emissionRate=self.totalParticles/self.life; 
提示: 
通过调整粒子的生存期(life)、粒子总数(totalParticles)和emissionRate,可以创造出爆炸效果,原理是:屏幕上的粒子总数是有限的,而新粒子会在短时间内生成,从而使粒子的流动频繁中断。从另一方面来说,如果注意到粒子流动过程中产生了缺口,那么可以通过增加粒子数量或减少生存期(或emissionRate)来解决问题。 
9.2.9 粒子颜色 
每个粒子都可以从一个起始颜色渐变到一个最终颜色,从而创造出眼里的粒子颜色效果。你至少要设置startColor属性,因为默认情况下粒子是黑色的,如果不设置起始颜色的话,你有可能看不到粒子。粒子颜色的类型是ccColor4F,这是一个有4个浮点数组成的结构体:r、g、b和a,对应红、绿、蓝和透明度。浮点数的数值在0~1之间,1代表最饱和的颜色。如果需要纯白色的粒子,那么应把所有的r、g、b和a都设为1。 
9.2.10 粒子混合模式 
“混合”是指粒子的像素在被显示到屏幕上之前所需要经历的计算过程。blendFunc属性以ccBlendFunc结构体作为输入,ccBlendFunc则提供了源混合模式和目标混合模式的信息。 
“混合”的工作方式为:当对粒子进行渲染时,将源图像(粒子)的红、绿、蓝和透明度信息与屏幕上已经存在的图像颜色相混合。实际效果是,粒子和它所处背景以某种方式进行了混合,而blendFunc则决定源图像颜色和背景颜色的混合程度。 
bleandFunc属性对粒子的外观有很大的影响。 
9.2.11 粒子贴图 
如果没有贴图的话,所有的粒子都会是单调的色块。如果要在粒子效果中使用贴图,可以使用CCTextureCache的addImage方法,此方法返回一个由指定贴图生成的CCTexture2D节点。 
用于粒子效果的贴图最好是云状的、粗略看上去像球形的图像。如果贴图中有高对比度区域,通常对生成的粒子效果是不利的。 
粒子贴图最重要的一点是图像尺寸不能超过64*64像素。贴图尺寸越小,粒子效果运行的越流畅。 
9.3 Particle Designer介绍 
Particle Designer是一个用于为cocos2d和iOS OpenGL应用程序设计并生成粒子效果的工具。可以从如下网址下载试用版:http://particledesigner.71squared.com 
使用此工具能够节省创建粒子效果所需的时间。它能够在改变粒子属性的同时,实时显示粒子效果的变化。默认情况下,软件的用户界面中显示了一个粒子的效果清单。如果要修改某个粒子效果,可以选中该效果,然后双击它或者单击右上角的Emitter Config按钮,切换到Emitter Config视图。 
警示: 
设计粒子效果的时候要注意以下几点:首先,要时刻记住,游戏处理渲染粒子效果之外,还要渲染很多其他的东西。比如,Particle Designer中设计出的粒子效果在预览窗口中以60帧每秒的速度运行,但这并不意味着在游戏实际运行时也可以达到每秒60帧的速率,所以请一定要在实际的游戏中测试粒子效果。其次,一定要在真是的iOS设备上进行测试。 
9.3.1 使用Particle Designer生成的粒子效果 
为了在cocos2d中使用生成的粒子效果,必须将输出的File Format(文件格式)设置为cocos2d(plist)。可以选中Embed Texture复选框,从而把粒子贴图保存到plist文件中。这样做的好处是,只需要将plist文件添加到Xcode项目中就可以,不利之处是,如果要使用不同的粒子贴图,就必须使用Particle Designer把旧的贴图用新的贴图换掉,重新导出plist文件,然后在重新添加到Xcode项目中。 
警示 
在使用Particle Designer生成的粒子效果时,必须使用CCQuadParticleSystem或CCPointParticleSystem对粒子效果进行初始化。虽然CCParticleSystem作为父类也实现了particleWithFile这个方法,但是如果使用父类初始化粒子效果的话,屏幕上将不会显示任何东西。 
9.3.2 分享粒子效果 
Particle Designer的一个很酷的地方是,可以与别的用户分享创造出来的粒子效果。在软件的菜单栏中选择Share,然后单击Share Emitter,会出现一个对话框,可以在其中输入想要分享的粒子效果的标题和描述信息。 
9.4 在射击游戏中添加粒子效果 
现在,当游戏进行时,你可能会注意到在粒子效果显示之前,游戏会停滞一小段时间。那是cocos2d在加载粒子效果所需要的贴图文件——这是个很缓慢的过程,而且与贴图是否被嵌入plist文件无关。为了避免发生上述情况,我们可以在GameScene中添加一个预加载机制:在init方法中为每一个需要在游戏过程中用到的粒子效果调用自定义的preloadParticleEffect方法。 
如果没有将贴图嵌入粒子效果的plist文件中,那么可以通过调用CCTextureCache的addImage方法来预加载粒子效果的贴图。 
9.5 本章小结 

 

 
 

你可能感兴趣的:(cocos2d)