Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

package com.gebauz.pingK;

import java.util.Vector;

import com.gebauz.pingK.util.Vector2D;

import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;

public class WallImpactEffect {
       
        Bitmap mWallImpact;
        Vector<WallImpactInstance> mInstances = new Vector<WallImpactInstance>();
       
        static public final float INSTANCE_LIFE_TIME = 0.5f;
       
        class WallImpactInstance {
                Vector2D position = new Vector2D();
                float lifeTime = 0;
                float directionDegrees = 0;
               
                public WallImpactInstance(float x, float y, float direction) {
                        position.x = x;
                        position.y = y;
                        directionDegrees = direction;
                }
               
                public void update(float deltaTime) {
                        lifeTime += deltaTime;
                }
               
                public void render(Canvas canvas) {
                        float width = mWallImpact.getWidth();                                          
                       
                        Paint paint = new Paint();
                        int alpha = 255;
                        alpha = (int)((1.0f-(lifeTime / INSTANCE_LIFE_TIME))* 255.0f);
                        int color = Color.argb(alpha, 255, 0, 153);
                        paint.setColor(color);
                        paint.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.MULTIPLY));
                       
                        Matrix matrix = new Matrix();
                        matrix.setTranslate(position.x - width/2, position.y - width/2);
                       
                        Matrix mirror = new Matrix();
                        mirror.postRotate(directionDegrees, width/2, width/2);

                        matrix.reset();
                        matrix.postConcat(mirror);

                        Matrix trans = new Matrix();
                        trans.setTranslate(position.x - width/2, position.y - width/2);
                        matrix.postConcat(trans);

                        canvas.drawBitmap(mWallImpact, matrix, paint);
                }
               
                public float getLifeTime() {
                        return lifeTime;
                }
        }      
       
        public void init(Resources resources) {
                mWallImpact = BitmapFactory.decodeResource(resources, R.drawable.wallimpact);
        }
       
        public void update(float deltaTime) {
                int i = 0;
                while (i < mInstances.size()) {
                        WallImpactInstance instance = mInstances.get(i);
                        instance.update(deltaTime);
                       
                        if (instance.getLifeTime() > INSTANCE_LIFE_TIME) {
                                mInstances.remove(i);
                                continue;
                        }
                       
                        i++;
                }
        }
       
        public void render(Canvas canvas) {
                for (int i = 0; i < mInstances.size(); i++) {
                        mInstances.get(i).render(canvas);
                }
        }
       
        public void spawnInstance(float x, float y, float directionDegrees) {
                mInstances.add(new WallImpactInstance(x, y, directionDegrees));
        }
       
        public void clearAllInstances() {
                mInstances.removeAllElements();
        }
       
       
}