第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粒子效果的更多相关文章

  1. cocos2d 粒子效果以及Particle Designer粒子工具的学习

    最近在学习cocos2d中的粒子效果吧,下面就把学到的和大家分享下吧! Now!我们先了解下类结构吧 -- CCParticleSystem(所有粒子系统的父类) -- CCParticleSyste ...

  2. cocos2d(粒子效果编辑器)

    ParticleDesigner  for  Mac下载地址:http://www.cocoachina.com/bbs/read.php?tid=108339 最近在做一款粒子编辑器 其实就是在co ...

  3. Cocos2D v3.4.9粒子效果不能显示的原因分析及解决办法

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在游戏App中为了衬托气氛我们往往使用一些特殊的图形效果,粒子 ...

  4. 6 cocos2dx粒子效果,类图关系,系统原生粒子和自己定义粒子效果,粒子编译器软件,爆炸粒子效果,烟花效果,火焰效果,流星效果,漩涡粒子效果,雪花效果,烟雾效果,太阳效果,下雨效果

     1 粒子 演示样例 2 类图关系 3 系统原生粒子 CCParticleSystem 全部粒子系统的父类 CCParticleSystemPoint. CCParticleSystemQuad ...

  5. 超炫的HTML5粒子效果进度条 VS 如何规范而优雅地code

    最近瞎逛的时候发现了一个超炫的粒子进度效果,有多炫呢?请擦亮眼镜!   // _this.ch){ _this.particles.splice(i, 1); } }; this.Particle.p ...

  6. 简直要逆天!超炫的 HTML5 粒子效果进度条

    我喜欢粒子效果作品,特别是那些能够应用于实际的,例如这个由 Jack Rugile 基于 HTML5 Cavnas 编写的进度条效果.看着这么炫的 Loading 效果,即使让我多等一会也无妨:)你呢 ...

  7. CodePen 作品秀:Canvas 粒子效果文本动画

    作品名称——Shape Shifter,基于 Canvas 的粒子图形变换实验.在页面下方的输入框输入文本,上面就会进行变换出对应的粒子效果文本动画. CodePen 作品秀系列向大家展示来自 Cod ...

  8. iOS开发——UI进阶篇(十八)核心动画小例子,转盘(裁剪图片、自定义按钮、旋转)图片折叠、音量震动条、倒影、粒子效果

    一.转盘(裁剪图片.自定义按钮.旋转) 1.裁剪图片 将一张大图片裁剪为多张 // CGImageCreateWithImageInRect:用来裁剪图片 // image:需要裁剪的图片 // re ...

  9. 能产生粒子效果的CAEmitterLayer

    能产生粒子效果的CAEmitterLayer 下雪效果: // // RootViewController.m // Cell // // Copyright (c) 2014年 Y.X. All r ...

随机推荐

  1. WEB安全性测试测试用例(基础)

    建立整体的威胁模型,测试溢出漏洞.信息泄漏.错误处理.SQL 注入.身份验证和授权错误. 输入验证 客户端验证服务器端验证(禁用脚本调试,禁用Cookies) 1.输入很大的数(如4,294,967, ...

  2. 用javascript 面向对象制作坦克大战(四)

    我们现在还差一个重要的功能,没错,敌人坦克的创建以及子弹击中敌人坦克时的碰撞检测功能. 5.  创建敌人坦克完成炮弹碰撞检测 5.1   创建敌人坦克对象 敌人坦克和玩家坦克一样,同样继承自我们的坦克 ...

  3. SqlServer中输出错误消息

    raiserror('所有参数都不能为空',16,1,@@error)

  4. 学习笔记——XSLT转换器的使用(Xalan和Saxon) .(转)

    转自:http://blog.csdn.net/crystalbruce/article/details/7401602 XSLT分为两类: 1:客户端转换:需要浏览器的支持. 2:服务器转换:需要使 ...

  5. javaIO(05)字节流和字符流的区别

    字节流和字符流的区别:   直接根据图片得出结论: 结论:   字节流在操作时本身不会用到缓存区,是在文件本身直接操作的,而字符流在操作时使用了缓存区,通过缓存区在操作文件:  所以在操作字符流的时候 ...

  6. AutoCAD.NET二次开发:创建自定义菜单的两种方法比较

    目前我已经掌握的创建CAD菜单方法有两种: COM方式: http://www.cnblogs.com/bomb12138/p/3607929.html CUI方式: http://www.cnblo ...

  7. 在线教育服务:http://www.ablesky.com/

    在线教育服务:http://www.ablesky.com/

  8. TypeScript学习笔记(七):模块

    JavaScript中的模块 在学习TypeScript的模块之前我们先看看在JavaScript中的模块是如何实现的. 模块的好处 首先我们要了解使用模块的好处都有什么? 模块化.可重用: 封装变量 ...

  9. jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究

    终于动笔开始 jQuery 源码解析第二篇,写文章还真是有难度,要把自已懂的表述清楚,要让别人听懂真的不是一见易事. 在 jQuery 源码解析一:jQuery 类库整体架构设计解析 一文,大致描述了 ...

  10. ThinkPHP3.1.3的单字母函数汇总

    A函数: 用于实例化Action 格式:[项目://][分组/]模块 /** * A函数用于实例化Action 格式:[项目://][分组/]模块 * @param string $name Acti ...