Android实现粒子爆炸效果的方法

本文实例讲述了Android实现粒子爆炸效果的方法。分享给大家供大家参考。具体如下:

1. Explosion.java文件:

package 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);

}

}

}

}

2. Particle.java文件如下:

package 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);

}

}

希望本文所述对大家的Android程序设计有所帮助。

以上是 Android实现粒子爆炸效果的方法 的全部内容, 来源链接: utcz.com/z/325823.html

回到顶部