package no.agens.depth.headers; import android.animation.ArgbEvaluator; import android.animation.ValueAnimator; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import com.github.florent37.depth.lib.MathHelper; import java.util.ArrayList; import java.util.List; public class ParticleSystem extends Renderable { public static final int DURATION = 10000; Paint particlePaint = new Paint(); long lastEmit; private int emitInterWall; private float gravityY; private float randomXPlacement; private float minYCoord; private float randomMovementY; int startColor; int endColor; private int randomMovementChangeInterval=2000; public void setParticleSize(int particleSize) { this.particleSize = particleSize; } int particleSize = 20; public void setRandomMovementX(float randomMovement) { this.randomMovementX = randomMovement; } float randomMovementX = 10; public ParticleSystem(float x, float y, int emitInterWall, float gravityY, float randomXPlacement) { super(null, x, y); lastEmit = System.currentTimeMillis(); particlePaint.setColor(Color.RED); this.emitInterWall = emitInterWall; this.gravityY = gravityY; this.randomXPlacement = randomXPlacement; } public void setColors(int startColor, int endColor) { this.startColor = startColor; this.endColor = endColor; color = ValueAnimator.ofObject(new ArgbEvaluator(), startColor, endColor, Color.TRANSPARENT).setDuration(DURATION); } List<Particle> paricles = new ArrayList<>(); @Override public void draw(Canvas canvas) { for (int i = 0; i < paricles.size(); i++) { Particle p = paricles.get(i); setParticlePaintColor(p); canvas.drawRect(p.x, p.y, p.x + particleSize, p.y + particleSize, particlePaint); } } @Override public void update(float deltaTime, float wind) { long currentTimeMillis = System.currentTimeMillis(); if (lastEmit + emitInterWall < currentTimeMillis) { addParticle(); } for (int i = 0; i < paricles.size(); i++) { Particle particle = paricles.get(i); particle.y += gravityY * deltaTime; particle.y += particle.randomSpeedY * deltaTime; particle.x += particle.randomSpeedX * deltaTime; particle.x += wind * deltaTime; if (particle.lastRandomizeChange + randomMovementChangeInterval < currentTimeMillis) { particle.lastRandomizeChange = System.currentTimeMillis(); particle.setRandomSpeed(MathHelper.randomRange(-randomMovementX,randomMovementX), MathHelper.randomRange(-randomMovementY,randomMovementY)); } if (particle.y < minYCoord) { paricles.remove(i); i--; } } } private void addParticle() { paricles.add(new Particle(x + MathHelper.randomRange(-randomXPlacement,randomXPlacement), y, MathHelper.randomRange(-randomMovementX,randomMovementX), MathHelper.randomRange(-randomMovementY, randomMovementY))); lastEmit = System.currentTimeMillis(); } public void setMinYCoord(float minYCoord) { this.minYCoord = minYCoord; } public void setRandomMovementY(float randomMovementY) { this.randomMovementY = randomMovementY; } ValueAnimator color; public void setParticlePaintColor(Particle particle) { float currentY = y - particle.y; float maxMoveDistance = y - minYCoord; float travelDistanceInPercentOfMax = currentY / maxMoveDistance; color.setCurrentPlayTime((long) (DURATION * travelDistanceInPercentOfMax)); particlePaint.setColor((Integer) color.getAnimatedValue()); } public void setRandomMovementChangeInterval(int randomMovementChangeInterval) { this.randomMovementChangeInterval = randomMovementChangeInterval; } }