欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

粒子爆炸,,Explosion.ja

来源: javaer 分享于  点击 6928 次 点评:8

粒子爆炸,,Explosion.ja


Explosion.javapackage net.obviam.particles.model;import android.graphics.Canvas;import android.graphics.Rect;import android.util.Log;public class Explosion {    private static final String TAG = Explosion.class.getSimpleName();    public static final int STATE_ALIVE     = 0;    // at least 1 particle is alive    public static final int STATE_DEAD      = 1;    // all particles are dead    private Particle[] particles;           // particles in the explosion    private int x, y;                       // the explosion's origin    private float gravity;                  // the gravity of the explosion (+ upward, - down)    private float wind;                     // speed of wind on horizontal    private int size;                       // number of particles    private int state;                      // whether it's still active or not    public Explosion(int particleNr, int x, int y) {        Log.d(TAG, "Explosion created at " + x + "," + y);        this.state = STATE_ALIVE;        this.particles = new Particle[particleNr];        for (int i = 0; i < this.particles.length; i++) {            Particle p = new Particle(x, y);            this.particles[i] = p;        }        this.size = particleNr;    }    public Particle[] getParticles() {        return particles;    }    public void setParticles(Particle[] particles) {        this.particles = particles;    }    public int getX() {        return x;    }    public void setX(int x) {        this.x = x;    }    public int getY() {        return y;    }    public void setY(int y) {        this.y = y;    }    public float getGravity() {        return gravity;    }    public void setGravity(float gravity) {        this.gravity = gravity;    }    public float getWind() {        return wind;    }    public void setWind(float wind) {        this.wind = wind;    }    public int getSize() {        return size;    }    public void setSize(int size) {        this.size = size;    }    public int getState() {        return state;    }    public void setState(int state) {        this.state = state;    }    // helper methods -------------------------    public boolean isAlive() {        return this.state == STATE_ALIVE;    }    public boolean isDead() {        return this.state == STATE_DEAD;    }    public void update() {        if (this.state != STATE_DEAD) {            boolean isDead = true;            for (int i = 0; i < this.particles.length; i++) {                if (this.particles[i].isAlive()) {                    this.particles[i].update();                    isDead = false;                }            }            if (isDead)                this.state = STATE_DEAD;        }    }    public void update(Rect container) {        if (this.state != STATE_DEAD) {            boolean isDead = true;            for (int i = 0; i < this.particles.length; i++) {                if (this.particles[i].isAlive()) {                    this.particles[i].update(container);//                  this.particles[i].update();                    isDead = false;                }            }            if (isDead)                this.state = STATE_DEAD;        }    }    public void draw(Canvas canvas) {        for(int i = 0; i < this.particles.length; i++) {            if (this.particles[i].isAlive()) {                this.particles[i].draw(canvas);            }        }    }}] Particle.javapackage net.obviam.particles.model;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;public class Particle {    public static final int STATE_ALIVE = 0;    // particle is alive    public static final int STATE_DEAD = 1;     // particle is dead    public static final int DEFAULT_LIFETIME    = 200;  // play with this    public static final int MAX_DIMENSION       = 5;    // the maximum width or height    public static final int MAX_SPEED           = 10;   // maximum speed (per update)    private int state;          // particle is alive or dead    private float widht;        // width of the particle    private float height;       // height of the particle    private float x, y;         // horizontal and vertical position    private double xv, yv;      // vertical and horizontal velocity    private int age;            // current age of the particle    private int lifetime;       // particle dies when it reaches this value    private int color;          // the color of the particle    private Paint paint;        // internal use to avoid instantiation    public int getState() {        return state;    }    public void setState(int state) {        this.state = state;    }    public float getWidht() {        return widht;    }    public void setWidht(float widht) {        this.widht = widht;    }    public float getHeight() {        return height;    }    public void setHeight(float height) {        this.height = height;    }    public float getX() {        return x;    }    public void setX(float x) {        this.x = x;    }    public float getY() {        return y;    }    public void setY(float y) {        this.y = y;    }    public double getXv() {        return xv;    }    public void setXv(double xv) {        this.xv = xv;    }    public double getYv() {        return yv;    }    public void setYv(double yv) {        this.yv = yv;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public int getLifetime() {        return lifetime;    }    public void setLifetime(int lifetime) {        this.lifetime = lifetime;    }    public int getColor() {        return color;    }    public void setColor(int color) {        this.color = color;    }    // helper methods -------------------------    public boolean isAlive() {        return this.state == STATE_ALIVE;    }    public boolean isDead() {        return this.state == STATE_DEAD;    }    public Particle(int x, int y) {        this.x = x;        this.y = y;        this.state = Particle.STATE_ALIVE;        this.widht = rndInt(1, MAX_DIMENSION);        this.height = this.widht;//      this.height = rnd(1, MAX_DIMENSION);        this.lifetime = DEFAULT_LIFETIME;        this.age = 0;        this.xv = (rndDbl(0, MAX_SPEED * 2) - MAX_SPEED);        this.yv = (rndDbl(0, MAX_SPEED * 2) - MAX_SPEED);        // smoothing out the diagonal speed        if (xv * xv + yv * yv > MAX_SPEED * MAX_SPEED) {            xv *= 0.7;            yv *= 0.7;        }        this.color = Color.argb(255, rndInt(0, 255), rndInt(0, 255), rndInt(0, 255));        this.paint = new Paint(this.color);    }    /**     * Resets the particle     * @param x     * @param y     */    public void reset(float x, float y) {        this.state = Particle.STATE_ALIVE;        this.x = x;        this.y = y;        this.age = 0;    }    // Return an integer that ranges from min inclusive to max inclusive.    static int rndInt(int min, int max) {        return (int) (min + Math.random() * (max - min + 1));    }    static double rndDbl(double min, double max) {        return min + (max - min) * Math.random();    }    public void update() {        if (this.state != STATE_DEAD) {            this.x += this.xv;            this.y += this.yv;            // extract alpha            int a = this.color >>> 24;            a -= 2;                             // fade by 5            if (a <= 0) {                        // if reached transparency kill the particle                this.state = STATE_DEAD;            } else {                this.color = (this.color & 0x00ffffff) + (a << 24);       // set the new alpha                this.paint.setAlpha(a);                this.age++;                     // increase the age of the particle//              this.widht *= 1.05;//              this.height *= 1.05;            }            if (this.age >= this.lifetime) { // reached the end if its life                this.state = STATE_DEAD;            }            // http://lab.polygonal.de/2007/05/10/bitwise-gems-fast-integer-math/            //32bit//          var color:uint = 0xff336699;//          var a:uint = color >>> 24;//          var r:uint = color >>> 16 & 0xFF;//          var g:uint = color >>>  8 & 0xFF;//          var b:uint = color & 0xFF;        }    }    public void update(Rect container) {        // update with collision        if (this.isAlive()) {            if (this.x <= container.left || this.x >= container.right - this.widht) {                this.xv *= -1;            }            // Bottom is 480 and top is 0 !!!            if (this.y <= container.top || this.y >= container.bottom - this.height) {                this.yv *= -1;            }        }        update();    }    public void draw(Canvas canvas) {//      paint.setARGB(255, 128, 255, 50);        paint.setColor(this.color);        canvas.drawRect(this.x, this.y, this.x + this.widht, this.y + this.height, paint);//      canvas.drawCircle(x, y, widht, paint);    }}//该片段来自于http://byrx.net
相关栏目:

用户点评