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

学习cocos2d-x笔记E1:粒子系统

2013-04-26 10:37 399 查看

http://blog.sina.com.cn/s/blog_4057ab6201019fk9.html




学习cocos2d-x笔记E1:粒子系统

(2012-10-21 02:20:58)


转载▼

分类: Android
粒子系统
1、从看Test范例开始。
看cocos的test范例,可以清楚感受什么例子。一个火,一场雪,效果由几百个粒子组成,这些例粒子的贴图,速度,颜色,大小,存在时间都在按照一定预定规则在变化。

2、粒子发射器的属性
要是几百个例子组合成不同效果,需要设置很多属性。

下载一个例子编辑器,可以更好的帮助理解粒子。
cocos2d-windows-particle-editor http://code.google.com/p/cocos2d-windows-particle-editor/downloads/detail?name=ParticleEditor.zip&can=2&q=
粒子编辑器的选择1 http://www.cnblogs.com/cocos2d-x/archive/2012/06/17/2552635.html
所有粒子属性,编辑器都有列出。编辑器的介绍以及plist导入的方法见上面链接。关于plist的导入,还可参考test粒子。
通过捣鼓粒子编辑器,可以对粒子有更直观的认识。

2.1 属性:emissionRate发射速率
其中, emissionRate发射速率,在cocos2dx中,该数值不是由plist中读取,而是根据
emissionRate = TotalParticles/lifeTime 计算得出。(该属性可以通过set方法另外设置或者直接修改cocos代码吧。)
在我看来,这个不和谐情况的解释就是,cocos粒子系统并没有把 emissionRate当作plist的设置参数之一,但是粒子编辑器作者觉得手动设置这个值很有用,所以就在编辑器中加上了。
于是我们用编辑器到处的plist就会发现实际效果和在编辑器中看到的不一样。

首先 emissionRate的手动设置是有些地方是需要的,比如需要将不多的粒子一次性喷发的粒子效果。
这就需要较小的TotalParticles和较大的 emissionRate。根据上面的计算公式,我又需要手动设定lifeTime,于是通过公式计算出的 emissionRate不能满足了。
而另一方面,在emitterRate = TotalParticles/lifeTime,既然如此设置必然有其原因。
这样做的结果就是,所有粒子在lifeTime时间内,都会被喷发出来(不考虑lifeTime的范围的话)。这样当第一个粒子生命结束时,所有粒子都被喷发出来了。而新一轮的新粒子也将要生成。在我看来,这就使得粒子系统中存储粒子的数组的利用率非常高。首先该数组是长为TotalParticles的数组。
在理想的粒子播放期间,第一轮的第一个粒子结束,第二轮的新粒子也刚生成。产生的粒子总数一直保持最大。数组的长度刚刚够用,也不会被空出来。
理想状态时, TotalParticles = emissionRate * lifeTime
在手动设置TotalParticles时, 若TotalParticles设置的太高,TotalParticles > emissionRate * lifeTime,则会浪费空间。而TotalParticle较小,则不会出现空间浪费。
至于其他可能的原因,还没想到。

3、坐标类型
例子系统有3种坐标类型

kCCPositionTypeFree,

kCCPositionTypeRelative,

kCCPositionTypeGrouped,
三个类型的区别:
假设粒子发射器A被加入了SpriteB, ( B->addChild(A) )
1、当B运动时,若设置Free,A发出的粒子则会出现拖尾现象。
若设置其他的,则不会出现拖尾。
2、当A相对B中坐标变动的时,若设置Relative,A发出的粒子则会出现拖尾现象。
3、而设置Grouped,不管什么坐标改变都不会发生拖尾现象。
总结,Free是相对于世界,Relative相对于父节点,Grouped是相对于发射器坐标。
代码中的实现:
---------首先要知道一个重要的概念--------------
node中结点的坐标是相对于父节点的。(如果是一个有贴图的Sprite,则在绘制时是node中的贴图的中心锚点(如果没设置的话),对应着父节点的原点(左下点)。)
-----------------------------------------------

关于粒子的坐标,有两个属性pos与startPos。当粒子根据属性移动时,坐标的变化是相对于其发射器本身的。这个坐标就是pos。
先根据发射器属性,计算出相对于发射器的移动坐标。在需要(如绘制)时,此坐标加上发射器的坐标,就是真实的世界坐标了。所以如果发射器不移动的话,坐标不需要进行调整。
但是发射器就是移动了,
若类型是Grouped,希望粒子随着发射器移动,则会直接使用坐标pos,不做任何变动。
若是Free,希望粒子不跟着发射器移动,留在它生成的地方。则pos要减去发射器A移动的距离。
对于Relative也是这样减去发射器移动的距离,只不过对于发射器移动的情况,因为参照物不同而不同。A随着SpriteB移动,A相对B是不动的,相对于世界是移动的。
所以为了计算移动的距离,就记录下了粒子被创建时的发射器的坐标startPos(这个值以后不会更改)。这样,只要使用当前发射器坐标减去startPos就得到距离了。
Relative的startPos是发射器A相对B的坐标,而Free的startPos是发射器的世界坐标。
这样就有了三种坐标类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: