粒子系统

粒子系统表示三维计算机图形学中模拟一些特定的模糊现象的技术,而这些现象用其它传统的渲染技术难以实现的真实感的 game physics。经常使用粒子系统模拟的现象有火、爆炸、烟、水流、火花、落叶、云、雾、雪、尘、流星尾迹或者象发光轨迹这样的抽象视觉效果等等。OGengine开源引擎的粒子系统中包含粒子,粒子发射器,粒子修改器等表现粒子效果。这次做一个简单的粒子效果。


自定义了一个MyParticle的类

  1. public void setMyParticle(float pX, float pY, TextureRegion region, Scene pScene)

复制代码


首先,我们需要选择一个点发射器,所以我们选择的是:

  1.         /**

  2.          * 点粒子发射器

  3.          * @param pCenterX 发射中心点X

  4.          * @param pCenterY 发射中心点Y*/

  5. public PointParticleEmitter(

  6.                 final float pCenterX, final float pCenterY)

复制代码


我们需要图片来创建粒子效果,所以我们选择SpriteParticleSystem

  1. /**

  2. *        精灵粒子系统

  3. *        @param pParticleEmitter 粒子发射器

  4. *        @param pRateMinimum:一秒中能同时发射到屏幕上的粒子最小的数量

  5. *        @param pRateMaximum:一秒中能同时发射到屏幕上的粒子最大的数量

  6. *        @param pParticlesMaximum:屏幕上允许可以存活的最大的粒子数

  7. *        @param pTextureRegion:选择表达的纹理*/ 

  8. public SpriteParticleSystem(

  9.                 final IParticleEmitter pParticleEmitter,

  10.                 final float pRateMinimum, 

  11.                 final float pRateMaximum,

  12.                 final int pParticlesMaximum, 

  13.                 final ITextureRegion pTextureRegion,

  14.                 final VertexBufferObjectManager pVertexBufferObjectManager)

复制代码


接下来我们要对粒子做初始化并为其添加粒子修改器

  1. /**粒子初始化*/

  2. public void addParticleInitializer(final IParticleInitializer<T> pParticleInitializer)

  3. /**添加粒子修改器*/

  4. public void addParticleModifier (final IParticleInitializer<T> pParticleInitializer)

复制代码


以下就是各种类型粒子的构造函数

  1. /**

  2.          * 速率粒子初始化器

  3.          * @param 最小速率X

  4.          * @param 最大速率X

  5.          * @param 最小速率Y

  6.          * @param 最大速率Y*/

  7. public VelocityParticleInitializer(

  8.                 final float pMinVelocityX, final float pMaxVelocityX, 

  9.                 final float pMinVelocityY, final float pMaxVelocityY)

复制代码

  1. /**限时粒子初始化器

  2.          * @param pMinLifeTime 最小存在时间

  3.          * @param pMaxLifeTime 最大存在时间*/

  4. public ExpireParticleInitializer(

  5.                 final float pMinLifeTime, final float pMaxLifeTime)

复制代码

  1. /**

  2.          * 缩放粒子修改器

  3.          * @pFromTime 开始时间

  4.          * @pToTime 结束时间

  5.          * @pFromScale 开始缩放值

  6.          * @pToScale 结束缩放值 */

  7. public ScaleParticleModifier(

  8.                 final float pFromTime, final float pToTime, 

  9.                 final float pFromScale, final float pToScale)

复制代码

  1. /**

  2.          * 透明粒子修改器

  3.          * @pFromTime 开始时间

  4.          * @pToTime 结束时间

  5.          * @pFromScale 开始透明值

  6.          * @pToScale 结束透明值 */

  7. public AlphaParticleModifier(

  8.                 final float pFromTime, final float pToTime, 

  9.                 final float pFromAlpha, final float pToAlpha)

复制代码

源码:

  1. public void setMyParticle(float pX, float pY, TextureRegion region, Scene pScene) {

  2.         PointParticleEmitter particleEmitter = new PointParticleEmitter(pX, pY);

  3.         SpriteParticleSystem mParticleSystem = 

  4.                         new SpriteParticleSystem(particleEmitter, 10, 10, 30, region,                                                 pScene.getVertexBufferObjectManager());

  5.         mParticleSystem.addParticleInitializer(

  6.                         new VelocityParticleInitializer<Sprite>(-150,150, -380, 0));

  7.         mParticleSystem.addParticleInitializer(

  8.                         new ExpireParticleInitializer<Sprite>(5f, 6f));

  9.         mParticleSystem.addParticleModifier(

  10.                         new ScaleParticleModifier<Sprite>(0f, 5f, 0, 1.3f));

  11.         mParticleSystem.addParticleModifier(

  12.                         new AlphaParticleModifier<Sprite>(0.8f, 1, 0.2f, 1f));

  13.         pScene.attachChild(mParticleSystem);

  14. }

复制代码


添加好效果后,将方法放在Scene中进行调用

  1. MyParticle myParticle = new MyParticle();

  2. myParticle.setMyParticle(

  3.                 this.getCameraWidth()/2, this.getCameraHeight()*0.8f, ballRegion, 

  4.                 TestScene.this);

复制代码

http://www.eoeandroid.com/forum-863-1.html

www.ogengine.com