package com.plattysoft.leonids;
import java.util.List;
import com.plattysoft.leonids.modifiers.ParticleModifier;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
public class Particle {
protected Bitmap mImage;
public float mCurrentX;
public float mCurrentY;
public float mScale = 1f;
public int mAlpha = 255;
public float mInitialRotation = 0f;
public float mRotationSpeed = 0f;
public float mSpeedX = 0f;
public float mSpeedY = 0f;
public float mAccelerationX;
public float mAccelerationY;
private Matrix mMatrix;
private Paint mPaint;
private float mInitialX;
private float mInitialY;
private float mRotation;
private long mTimeToLive;
protected long mStartingMilisecond;
private int mBitmapHalfWidth;
private int mBitmapHalfHeight;
private List<ParticleModifier> mModifiers;
protected Particle() {
mMatrix = new Matrix();
mPaint = new Paint();
}
public Particle (Bitmap bitmap) {
this();
mImage = bitmap;
}
public void init() {
mScale = 1;
mAlpha = 255;
}
public void configure(long timeToLive, float emiterX, float emiterY) {
mBitmapHalfWidth = mImage.getWidth()/2;
mBitmapHalfHeight = mImage.getHeight()/2;
mInitialX = emiterX - mBitmapHalfWidth;
mInitialY = emiterY - mBitmapHalfHeight;
mCurrentX = mInitialX;
mCurrentY = mInitialY;
mTimeToLive = timeToLive;
}
public boolean update (long miliseconds) {
long realMiliseconds = miliseconds - mStartingMilisecond;
if (realMiliseconds > mTimeToLive) {
return false;
}
mCurrentX = mInitialX+mSpeedX*realMiliseconds+mAccelerationX*realMiliseconds*realMiliseconds;
mCurrentY = mInitialY+mSpeedY*realMiliseconds+mAccelerationY*realMiliseconds*realMiliseconds;
mRotation = mInitialRotation + mRotationSpeed*realMiliseconds/1000;
for (int i=0; i<mModifiers.size(); i++) {
mModifiers.get(i).apply(this, realMiliseconds);
}
return true;
}
public void draw (Canvas c) {
mMatrix.reset();
mMatrix.postRotate(mRotation, mBitmapHalfWidth, mBitmapHalfHeight);
mMatrix.postScale(mScale, mScale, mBitmapHalfWidth, mBitmapHalfHeight);
mMatrix.postTranslate(mCurrentX, mCurrentY);
mPaint.setAlpha(mAlpha);
c.drawBitmap(mImage, mMatrix, mPaint);
}
public Particle activate(long startingMilisecond, List<ParticleModifier> modifiers) {
mStartingMilisecond = startingMilisecond;
// We do store a reference to the list, there is no need to copy, since the modifiers do not carte about states
mModifiers = modifiers;
return this;
}
}