package com.javisjava.processing; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import ddf.minim.AudioSnippet; import ddf.minim.Minim; import processing.core.PApplet; @SuppressWarnings("serial") public class Rain extends PApplet { ArrayList drops; Map lightningFrames = new HashMap(); float lightningBackground = 0; Minim minim; AudioSnippet thunder; public void setup() { drops = new ArrayList(); size(400, 400); for (float i = 0; i < 400; i += 15) { for (float j = 0; j < 400; j += 15) { drops.add(new Drop(i + random(9), j + random(9))); } } lightningFrames.put(1, 0); lightningFrames.put(3, 60); lightningFrames.put(5, 70); lightningFrames.put(7, 100); lightningFrames.put(9, 60); lightningFrames.put(11, 100); lightningFrames.put(13, 80); lightningFrames.put(16, 60); lightningFrames.put(18, 40); lightningFrames.put(20, 35); lightningFrames.put(22, 30); lightningFrames.put(24, 25); lightningFrames.put(26, 20); lightningFrames.put(28, 10); lightningFrames.put(30, 5); lightningFrames.put(32, 0); minim = new Minim(this); thunder = minim.loadSnippet("thunder.mp3"); thunder.loop(); thunder.pause(); } public void draw() { int lightningFrame = frameCount % 600; if (lightningFrames.get(lightningFrame) != null) { lightningBackground = 255 * lightningFrames.get(lightningFrame) / 100; } background(lightningBackground); float wind = mouseX / 400f; for (int i = 0; i < drops.size(); i++) { Drop drop = (Drop) drops.get(i); stroke(255 - 150 * drop.y / 400f - 100 * wind); line(drop.x, drop.y, drop.x + 2 + wind, drop.y + 4 - wind); drop.y += 5; if (drop.y >= 405) { drop.y -= 405; } drop.x += wind; if (drop.x >= 405) { drop.x -= 405; } float distance2 = (drop.x - mouseX) * (drop.x - mouseX) + (drop.y - mouseY) * (drop.y - mouseY); if (distance2 < 100 * 100 + random(10000) && mouseX > 10 && mouseX < 390) { drop.x += 100 * (drop.x - mouseX) / distance2; drop.y += 100 * (drop.y - mouseY) / distance2; } else { drop.x += ((i * 15) - drop.x) / 1000; drop.y += ((i * 15) - drop.y) / 1000; } } } public void stop() { minim.stop(); super.stop(); } public void mouseClicked() { if (thunder.isPlaying()) { thunder.pause(); } else { thunder.play(); } } class Drop { float x, y; Drop(float x, float y) { this.x = x; this.y = y; } } public static void main(String[] args) { PApplet.main(new String[] { "com.javisjava.processing.Rain" }); } }