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

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

 

1.本节要点

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

2.新学习内容

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

  1. public class SpriteParticleSystemextends ParticleSystem<Sprite> {
  2. // ===========================================================
  3. // Constants
  4. // ===========================================================
  5. // ===========================================================
  6. // Fields
  7. // ===========================================================
  8. // ===========================================================
  9. // Constructors
  10. // ===========================================================
  11. public SpriteParticleSystem(final IParticleEmitter pParticleEmitter,final float pRateMinimum,final float pRateMaximum,final int 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,final float pRateMinimum,final float pRateMaximum,final int 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,final float pRateMinimum,final float pRateMaximum,final int 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. }
public class SpriteParticleSystem extends ParticleSystem<Sprite> {
	// ===========================================================
	// Constants
	// ===========================================================

	// ===========================================================
	// Fields
	// ===========================================================

	// ===========================================================
	// Constructors
	// ===========================================================

	public SpriteParticleSystem(final IParticleEmitter pParticleEmitter, final float pRateMinimum, final float pRateMaximum, final int pParticlesMaximum, final ITextureRegion pTextureRegion, final VertexBufferObjectManager pVertexBufferObjectManager) {
		this(0, 0, pParticleEmitter, pRateMinimum, pRateMaximum, pParticlesMaximum, pTextureRegion, pVertexBufferObjectManager);
	}

	public SpriteParticleSystem(final float pX, final float pY, final IParticleEmitter pParticleEmitter, final float pRateMinimum, final float pRateMaximum, final int pParticlesMaximum, final ITextureRegion pTextureRegion, final VertexBufferObjectManager pVertexBufferObjectManager) {
		super(pX, pY, new IEntityFactory<Sprite>() {
			@Override
			public Sprite create(final float pX, final float pY) {
				return new Sprite(pX, pY, pTextureRegion, pVertexBufferObjectManager);
			}
		}, pParticleEmitter, pRateMinimum, pRateMaximum, pParticlesMaximum);
	}

	protected SpriteParticleSystem(final float pX, final float pY, final IEntityFactory<Sprite> pEntityFactory, final IParticleEmitter pParticleEmitter, final float pRateMinimum, final float pRateMaximum, final int pParticlesMaximum) {
		super(pX, pY, pEntityFactory, pParticleEmitter, pRateMinimum, pRateMaximum, pParticlesMaximum);
	}

	// ===========================================================
	// Getter & Setter
	// ===========================================================

	// ===========================================================
	// Methods for/from SuperClass/Interfaces
	// ===========================================================

	// ===========================================================
	// Methods
	// ===========================================================

	// ===========================================================
	// Inner and Anonymous Classes
	// ===========================================================
}

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

:圆环粒子发射器

PointParticleEmitter:点状粒子发射器

RectangleParticleEmitter:矩形例子粒子器

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

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

  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. }
public class CircleParticleEmitter extends BaseCircleParticleEmitter {
	// ===========================================================
	// Constants
	// ===========================================================

	// ===========================================================
	// Fields
	// ===========================================================

	// ===========================================================
	// Constructors
	// ===========================================================

	public CircleParticleEmitter(final float pCenterX, final float pCenterY, final float pRadius) {
		super(pCenterX, pCenterY, pRadius);
	}

	public CircleParticleEmitter(final float pCenterX, final float pCenterY, final float pRadiusX, final float pRadiusY) {
		super(pCenterX, pCenterY, pRadiusX, pRadiusY);
	}

	// ===========================================================
	// Getter & Setter
	// ===========================================================

	// ===========================================================
	// Methods for/from SuperClass/Interfaces
	// ===========================================================

	@Override
	public void getPositionOffset(final float[] pOffset) {
		final float random = MathUtils.RANDOM.nextFloat() * MathConstants.PI * 2;
		pOffset[VERTEX_INDEX_X] = this.mCenterX + FloatMath.cos(random) * this.mRadiusX * MathUtils.RANDOM.nextFloat();
		pOffset[VERTEX_INDEX_Y] = this.mCenterY + FloatMath.sin(random) * this.mRadiusY * MathUtils.RANDOM.nextFloat();
	}

	// ===========================================================
	// Methods
	// ===========================================================

	// ===========================================================
	// Inner and Anonymous Classes
	// ===========================================================
}

3.内容初始化

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

  1. private staticfinal int CAMERA_WIDTH =800;
  2. private staticfinal int 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. }
private static final int CAMERA_WIDTH = 800;
	private static final int CAMERA_HEIGHT = 480;
	
	private Camera mCamera;
	private TiledTextureRegion mParticleRegion;
	
	
	
	@Override
	public EngineOptions onCreateEngineOptions() {
		// TODO Auto-generated method stub
		mCamera = new Camera(0,0,CAMERA_WIDTH, CAMERA_HEIGHT);
		EngineOptions mEngineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE_SENSOR, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), mCamera);
		
		
		return mEngineOptions;
	}

	@Override
	public void onCreateResources(
			OnCreateResourcesCallback pOnCreateResourcesCallback)
			throws Exception {
		// TODO Auto-generated method stub
		BitmapTextureAtlas mTexture = new BitmapTextureAtlas(getTextureManager(), 32, 32, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
		mParticleRegion = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(mTexture, this, "particle_point.png", 0, 0,1,1);
		mTexture.load();
		
		pOnCreateResourcesCallback.onCreateResourcesFinished();
	}


4.构建场景

  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. }
@Override
	public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback)
			throws Exception {
		// TODO Auto-generated method stub
		Scene mScene = new Scene();
		
		CircleOutlineParticleEmitter mEmitter = new CircleOutlineParticleEmitter(CAMERA_WIDTH/2,CAMERA_HEIGHT/2,80);
		SpriteParticleSystem mParticleSystem = new SpriteParticleSystem(CAMERA_WIDTH/2, CAMERA_HEIGHT/2, 
				mEmitter, 10, 200, 300, mParticleRegion, getVertexBufferObjectManager());
		
		mParticleSystem.addParticleInitializer(new ColorParticleInitializer(1,0,0));
		mParticleSystem.addParticleInitializer(new AlphaParticleInitializer(0));
		mParticleSystem.addParticleInitializer(new VelocityParticleInitializer(-2, 2, -20, -10));
		mParticleSystem.addParticleInitializer(new RotationParticleInitializer(0.0f, 360.0f));
        mParticleSystem.addParticleInitializer(new ExpireParticleInitializer(0,6));
        
        
		mParticleSystem.addParticleModifier(new ScaleParticleModifier(0,5,1.0f,2.5f));
		mParticleSystem.addParticleModifier(new ColorParticleModifier(0,3,1, 1, 0, 0.5f, 0, 0));
		mParticleSystem.addParticleModifier(new ColorParticleModifier(4,6,1, 1, 0.5f, 1, 0, 1));
		mParticleSystem.addParticleModifier(new AlphaParticleModifier(0,1, 0, 1));
		mParticleSystem.addParticleModifier(new AlphaParticleModifier(5,6, 1, 0));
		
		
		mScene.attachChild(mParticleSystem);
		pOnCreateSceneCallback.onCreateSceneFinished(mScene);
	}

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

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







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

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值