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

1.本节要点

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

2.新学习内容

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

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环形粒子源码如下:

    

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.内容初始化

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

   

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.构建场景

@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这两个函数,配合起来调整粒子集合的形状,颜色旋转,位移等

参数,呈现呈现出来的就是想要的火焰效果了;
[AndEngine学习教程] 第8节 ParticleSystem 粒子系统_第1张图片


[AndEngine学习教程] 第8节 ParticleSystem 粒子系统_第2张图片



[AndEngine学习教程] 第8节 ParticleSystem 粒子系统_第3张图片


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

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

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



你可能感兴趣的:([AndEngine学习教程] 第8节 ParticleSystem 粒子系统)