1、化的,粒子系统的所有属性都是时间t的函数,随着时间的推移,系统中不断有新粒子的加入,旧的粒子死亡,系统中“存活”的粒子其位置及生命值亦随时间变化而变化。随着虚拟世界时间的流逝,每个粒子都要在虚拟世界经历“产生”、“活动”和“消亡”三个阶段。一般而言,粒子系统的绘制基本可按照以下步骤进行。产生新的粒子加入系统中;赋予每个粒子一定的属性;删除超过生命值上限的粒子;根据粒子属性的动态变化对粒子进行移动和变换;绘制并显示由有生命的粒子组成的图形。其中第、步循环形成了物体的动态变化过程。粒子系统的组成通过前面的学习,我们知道了粒子系统中每一颗粒子他都具有自己的各种属性,因此这每一颗粒子就是一个粒子对象,
2、所以我们的例子系统首先需要一个代表粒子的类Particle。由于我们每一种特效都需要很多粒子来实现,这些粒子的运动方式以及发射的频率都是我们能够控制的,所以我们还需要一个用于控制粒子特效的类ParticleSystem。综上所诉,粒子系统将由粒子(Particle)和发射器(ParticleSystem)组成。粒子(Particle)这里我们的粒子类Particle主要就用于表示粒子特效中的每一颗粒子,他将包括每一颗粒子的各种属性,如代码清单8-1是我们用于表示粒子对象的类Particle的实现。代码清单8-1:Particleview plaincopy to clipboardprint?
3、1./粒子类 2.publicclassParticle 3./位置 4.YFSPointpos=YFSPoint.makeZero(); 5./开始位置 6.startPos7./颜色 8.YFSColor4FcolornewYFSColor4F();9./辅助颜色变化 10.deltaColor11./尺寸和辅助尺寸变化 12.floatsize;13.deltaSize;14./自转速度,辅助自转速度 15.rotation;16.deltaRotation;17./生命周期 18.timeToLive;19./方向 20.direction21./径向加速度,逃离发射原点的速度 22.
4、radialAccel;23./切线加速度,围绕发射原点旋转速度 24.tangentialAccel;25./弧度. 26.radian;27.radianPerSecond;28./半径. 29.radius;30.deltaRadius;31./粒子类 public class Particle /位置 YFSPoint pos = YFSPoint.makeZero(); /开始位置 YFSPoint startPos = YFSPoint.makeZero(); /颜色 YFSColor4F color = new YFSColor4F(); /辅助颜色变化 YFSColor4F d
5、eltaColor = new YFSColor4F(); /尺寸和辅助尺寸变化 float size; float deltaSize; /自转速度,辅助自转速度 float rotation; float deltaRotation; /生命周期 float timeToLive; /方向 YFSPoint direction = YFSPoint.makeZero(); /径向加速度,逃离发射原点的速度 float radialAccel; /切线加速度,围绕发射原点旋转速度 float tangentialAccel; /弧度. float radian; float radianPe
6、rSecond; /半径. float radius; float deltaRadius; 从代码清单8-1我们可以看出,这些成员变量实际上都是每一颗粒子所共同拥有的一些通用的属性,其中我们给每一个变量都加入了注解,这里所要说明的就是,粒子特效都是需要运动的,所以大多数数据需要一个初始值,然后还需要指定一个该值的变化范围,比如上面的radius表示粒子的半径,而deltaRadius则表示该半径可以在一个什么样的范围之内变化。timeToLive则表示该粒子的生命周期,即粒子从激活之后到消亡这段时间,因为我们的每颗粒子都会消亡,这里我们说一下,通常一个粒子消亡之后,我们不会去释放他,而是将其
7、标记为为激活状态,用来作为下一个将要产生的例子(去修改其属性值即可),这样就避免了重复的分配内存空间。当然如果你确实需要释放也是可以的。发射器(ParticleSystem)上面我们介绍了单独的一刻粒子对象,这里我们来分析一下如何实现一个发射器,来控制每一颗粒子的发射情况,在分析这个发射器之前,我们首先看一下粒子系统一般包括哪几种?粒子系统一般可以按照其特性分为两类:模拟重力效果 以半径来进行扩散 重力效果相信不用过多的介绍了,就是通过程序来模拟物理重力效果,那么另外一种是以一个中心点,来根据所设定的半径进行扩散的粒子,因此我们首先将这两种不同的粒子通过一个enum分区开来,起定义如代码清单8
8、-2所示。代码清单8-2:Mode1./粒子系统模式 staticenumModeGRAVITY,/模拟重力 RADIUS;/以半径来扩散 5./粒子系统模式 public static enum Mode GRAVITY,/模拟重力 RADIUS;/以半径来扩散 稍后我们会在程序中实现这样两种粒子效果,现在大家可以思考一个问题,在我们的粒子系统中,这些微粒他们应该如何运动呢?实际上运动就是改变这些微粒的坐标位置,那么我们可以按照坐标的位置来将粒子系统分为两种,他们分别是:自由运动,成组运动。每一颗粒子他可以按照自己的属性来自由的运动,当然在某些特殊需求时,我们可以将粒子分成很多组,然后对这每
9、一组的所有粒子采用一种运动方式,那么就是我们所说的成组运动的方式,我们同样也先通过一个enum将其分别定义出来,如代码清单8-3所示。代码青岛那8-3:PositionType1./位置类型 PositionTypeFREE,/自由 GROUPED;/组 /位置类型 public static enum PositionType FREE,/自由 GROUPED;/组 其中FREE代表自由运动,GROUPED代表成组的运动。好的,我们已经对粒子系统,也就是发射器进行了分类,下面我们来分析如何实现这个发射器呢?这里我们将以一个通用的发射器来作为基类进行实现,具体的特殊的特效,我们可以继承自该发射
10、器来完善,首先看一下我们这个发射器他需要包括哪些属性呢?如代码清单8-4所示。代码清单8-4:ParticleSystem成员1./粒子系统基类 ParticleSystemextendsNodeimplementsNode.IBlendableTextureOwnerpublicfinalintPARTICLE_DURATION_INFINITY-1;PARTICLE_START_SIZE_EQUAL_TO_END_SIZEPARTICLE_START_RADIUS_EQUAL_TO_END_RADIUS/是否要更新 privatebooleanmUpdating;/是否激活 mActive;/运行时间 protectedmDuration;/流失的时间 mElapsed;/所有粒子重心,(变化范围) mCenterOfGravity;mCenterOfGravityVar;/角度,(变化范围) mAngle;mAngleVar;/开始结束尺寸,(变化范围) mStartSize;mStartSiz
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1