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(); }
@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); }值得关注的是 addParticleInitializer和 addParticleModifier这两个函数,配合起来调整粒子集合的形状,颜色旋转,位移等
http://download.csdn.net/detail/cen616899547/4733452
注意:源代码上有些地方比较旧,有不一致的地方,请以上面例子的代码为准!
最新经过修改的源代码:http://download.csdn.net/detail/cen616899547/4734139