[AndEngine学习教程] 第8节 ParticleSystem 粒子系统

来源:互联网 发布:江苏网络问政 编辑:程序博客网 时间:2024/05/17 23:44

转自:http://blog.csdn.net/cen616899547/article/details/8148627

 

1.本节要点

本节主要基于粒子系统实现火焰视觉效果的模拟

2.新学习内容

1.SpriteParticleSystem的介绍,这个类是集成自ParticleSystem<Sprite]>的,从源码可以看出

[java] view plaincopyprint?
  1. public class SpriteParticleSystemextends ParticleSystem<Sprite> {
  2. // ===========================================================
  3. // Constants
  4. // ===========================================================
  5. // ===========================================================
  6. // Fields
  7. // ===========================================================
  8. // ===========================================================
  9. // Constructors
  10. // ===========================================================
  11. public SpriteParticleSystem(final IParticleEmitter pParticleEmitter,finalfloat pRateMinimum,finalfloat pRateMaximum,finalint pParticlesMaximum,final ITextureRegion pTextureRegion,final VertexBufferObjectManager pVertexBufferObjectManager) {
  12. this(0,0, pParticleEmitter, pRateMinimum, pRateMaximum, pParticlesMaximum, pTextureRegion, pVertexBufferObjectManager);
  13. }
  14. public SpriteParticleSystem(finalfloat pX,finalfloat pY,final IParticleEmitter pParticleEmitter,finalfloat pRateMinimum,finalfloat pRateMaximum,finalint pParticlesMaximum,final ITextureRegion pTextureRegion,final VertexBufferObjectManager pVertexBufferObjectManager) {
  15. super(pX, pY, new IEntityFactory<Sprite>() {
  16. @Override
  17. public Sprite create(finalfloat pX,finalfloat pY) {
  18. return new Sprite(pX, pY, pTextureRegion, pVertexBufferObjectManager);
  19. }
  20. }, pParticleEmitter, pRateMinimum, pRateMaximum, pParticlesMaximum);
  21. }
  22. protected SpriteParticleSystem(finalfloat pX,finalfloat pY,final IEntityFactory<Sprite> pEntityFactory,final IParticleEmitter pParticleEmitter,finalfloat pRateMinimum,finalfloat pRateMaximum,finalint pParticlesMaximum) {
  23. super(pX, pY, pEntityFactory, pParticleEmitter, pRateMinimum, pRateMaximum, pParticlesMaximum);
  24. }
  25. // ===========================================================
  26. // Getter & Setter
  27. // ===========================================================
  28. // ===========================================================
  29. // Methods for/from SuperClass/Interfaces
  30. // ===========================================================
  31. // ===========================================================
  32. // Methods
  33. // ===========================================================
  34. // ===========================================================
  35. // Inner and Anonymous Classes
  36. // ===========================================================
  37. }

2.在SpriteParticleSystem中引出了IParticleEmitter的概念,在AndEngine中,常用的几种粒子发射器有:

:圆环粒子发射器

PointParticleEmitter:点状粒子发射器

RectangleParticleEmitter:矩形例子粒子器

根据名称几可以大概知道发射出来的粒子形状

在本节当中主要使用到CircleParticleEmitter环形粒子源码如下:

[java] view plaincopyprint?
  1. public class CircleParticleEmitterextends BaseCircleParticleEmitter {
  2. // ===========================================================
  3. // Constants
  4. // ===========================================================
  5. // ===========================================================
  6. // Fields
  7. // ===========================================================
  8. // ===========================================================
  9. // Constructors
  10. // ===========================================================
  11. public CircleParticleEmitter(finalfloat pCenterX,finalfloat pCenterY,finalfloat pRadius) {
  12. super(pCenterX, pCenterY, pRadius);
  13. }
  14. public CircleParticleEmitter(finalfloat pCenterX,finalfloat pCenterY,finalfloat pRadiusX,finalfloat pRadiusY) {
  15. super(pCenterX, pCenterY, pRadiusX, pRadiusY);
  16. }
  17. // ===========================================================
  18. // Getter & Setter
  19. // ===========================================================
  20. // ===========================================================
  21. // Methods for/from SuperClass/Interfaces
  22. // ===========================================================
  23. @Override
  24. public void getPositionOffset(finalfloat[] pOffset) {
  25. final float random = MathUtils.RANDOM.nextFloat() * MathConstants.PI *2;
  26. pOffset[VERTEX_INDEX_X] = this.mCenterX + FloatMath.cos(random) *this.mRadiusX * MathUtils.RANDOM.nextFloat();
  27. pOffset[VERTEX_INDEX_Y] = this.mCenterY + FloatMath.sin(random) *this.mRadiusY * MathUtils.RANDOM.nextFloat();
  28. }
  29. // ===========================================================
  30. // Methods
  31. // ===========================================================
  32. // ===========================================================
  33. // Inner and Anonymous Classes
  34. // ===========================================================
  35. }

3.内容初始化

这里要实现的东西很简单,只有一张图片,用作粒子系统用的

[java] view plaincopyprint?
  1. private staticfinalint CAMERA_WIDTH =800;
  2. private staticfinalint CAMERA_HEIGHT =480;
  3. private Camera mCamera;
  4. private TiledTextureRegion mParticleRegion;
  5. @Override
  6. public EngineOptions onCreateEngineOptions() {
  7. // TODO Auto-generated method stub
  8. mCamera = new Camera(0,0,CAMERA_WIDTH, CAMERA_HEIGHT);
  9. EngineOptions mEngineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE_SENSOR,new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), mCamera);
  10. return mEngineOptions;
  11. }
  12. @Override
  13. public void onCreateResources(
  14. OnCreateResourcesCallback pOnCreateResourcesCallback)
  15. throws Exception {
  16. // TODO Auto-generated method stub
  17. BitmapTextureAtlas mTexture = new BitmapTextureAtlas(getTextureManager(),32,32, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
  18. mParticleRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mTexture,this,"particle_point.png",0,0,1,1);
  19. mTexture.load();
  20. pOnCreateResourcesCallback.onCreateResourcesFinished();
  21. }


4.构建场景

[java] view plaincopyprint?
  1. @Override
  2. public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback)
  3. throws Exception {
  4. // TODO Auto-generated method stub
  5. Scene mScene = new Scene();
  6. CircleOutlineParticleEmitter mEmitter = new CircleOutlineParticleEmitter(CAMERA_WIDTH/2,CAMERA_HEIGHT/2,80);
  7. SpriteParticleSystem mParticleSystem = new SpriteParticleSystem(CAMERA_WIDTH/2, CAMERA_HEIGHT/2,
  8. mEmitter, 10, 200, 300, mParticleRegion, getVertexBufferObjectManager());
  9. mParticleSystem.addParticleInitializer(new ColorParticleInitializer(1,0,0));
  10. mParticleSystem.addParticleInitializer(new AlphaParticleInitializer(0));
  11. mParticleSystem.addParticleInitializer(new VelocityParticleInitializer(-2,2, -20, -10));
  12. mParticleSystem.addParticleInitializer(new RotationParticleInitializer(0.0f,360.0f));
  13. mParticleSystem.addParticleInitializer(new ExpireParticleInitializer(0,6));
  14. mParticleSystem.addParticleModifier(new ScaleParticleModifier(0,5,1.0f,2.5f));
  15. mParticleSystem.addParticleModifier(new ColorParticleModifier(0,3,1,1,0,0.5f,0,0));
  16. mParticleSystem.addParticleModifier(new ColorParticleModifier(4,6,1,1,0.5f,1,0,1));
  17. mParticleSystem.addParticleModifier(new AlphaParticleModifier(0,1,0,1));
  18. mParticleSystem.addParticleModifier(new AlphaParticleModifier(5,6,1,0));
  19. mScene.attachChild(mParticleSystem);
  20. pOnCreateSceneCallback.onCreateSceneFinished(mScene);
  21. }

值得关注的是addParticleInitializeraddParticleModifier这两个函数,配合起来调整粒子集合的形状,颜色旋转,位移等

参数,呈现呈现出来的就是想要的火焰效果了;







http://download.csdn.net/detail/cen616899547/4733452

注意:源代码上有些地方比较旧,有不一致的地方,请以上面例子的代码为准!

最新经过修改的源代码:http://download.csdn.net/detail/cen616899547/4734139