public class

Particle

extends Object
package org.andengine.entity.particle;

import org.andengine.engine.camera.Camera;
import org.andengine.engine.handler.physics.PhysicsHandler;
import org.andengine.entity.IEntity;
import org.andengine.opengl.util.GLState;

/**
 * (c) 2010 Nicolas Gramlich
 * (c) 2011 Zynga Inc.
 * 
 * @author Nicolas Gramlich
 * @since 19:37:13 - 14.03.2010
 */
public class Particle<T extends IEntity> {
	// ===========================================================
	// Constants
	// ===========================================================

	private static final int EXPIRETIME_NEVER = -1;

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

	private final PhysicsHandler mPhysicsHandler = new PhysicsHandler(null);

	private float mLifeTime;
	private float mExpireTime = Particle.EXPIRETIME_NEVER;
	boolean mExpired;

	private T mEntity;

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

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

	public T getEntity() {
		return this.mEntity;
	}

	public void setEntity(final T pEntity) {
		this.mEntity = pEntity;
		this.mPhysicsHandler.setEntity(pEntity);
	}

	public float getLifeTime() {
		return this.mLifeTime;
	}

	public float getExpireTime() {
		return this.mExpireTime;
	}

	public void setExpireTime(final float pExpireTime) {
		this.mExpireTime = pExpireTime;
	}

	public boolean isExpired() {
		return this.mExpired ;
	}

	public void setExpired(final boolean pExpired) {
		this.mExpired = pExpired;
	}

	public PhysicsHandler getPhysicsHandler() {
		return this.mPhysicsHandler;
	}

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

	protected void onUpdate(final float pSecondsElapsed) {
		if(!this.mExpired){
			if(this.mExpireTime == Particle.EXPIRETIME_NEVER || this.mLifeTime + pSecondsElapsed < this.mExpireTime) {
				/* Particle doesn't expire or didn't expire yet. */
				this.mLifeTime += pSecondsElapsed;
				this.mEntity.onUpdate(pSecondsElapsed);
				this.mPhysicsHandler.onUpdate(pSecondsElapsed);
			} else {
				final float secondsElapsedUsed = this.mExpireTime - this.mLifeTime;
				this.mLifeTime = this.mExpireTime;
				this.mEntity.onUpdate(secondsElapsedUsed);
				this.mPhysicsHandler.onUpdate(secondsElapsedUsed);
				this.setExpired(true);
			}
		}
	}

	public void onDraw(final GLState pGLState, final Camera pCamera) {
		if(!this.mExpired) {
			this.mEntity.onDraw(pGLState, pCamera);
		}
	}

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

	public void reset() {
		this.mEntity.reset();
		this.mPhysicsHandler.reset();
		this.mExpired = false;
		this.mExpireTime = Particle.EXPIRETIME_NEVER;
		this.mLifeTime = 0;
	}

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