/* built with Studio Sketchpad: * https://sketchpad.cc * * observe the evolution of this sketch: * https://studio.sketchpad.cc/sp/pad/view/ro.X55vhZIzHED/rev.10 * * authors: * GoToLoop * license (unless otherwise specified): * creative commons attribution-share alike 3.0 license. * https://creativecommons.org/licenses/by-sa/3.0/ */ /** * Fireworks (v2.0) * by JManton1992 (2013/Apr) * mod GoToLoop * * http://forum.processing.org/topic/ * i-know-this-is-bad-but-would-anyone-be-able-to-explain-this-code * -i-ve-only-began-using-processing-in-college * -and-i-need-to-replicate-this-code-with-some-understanding * * http://studio.processingtogether.com/sp/pad/export/ro.9Q6oRai8-41WJ/latest */ final static byte MAX_FIRES = 15; final static Firework[] fires = new Firework[MAX_FIRES]; final static color BG = 0x14320028; final static String ENGINE = JAVA2D; //JAVA2D or P2D void setup() { size(400, 400, ENGINE); frameRate(50); smooth(); fill(BG); for ( int i=0; i!=MAX_FIRES; fires[i++] = new Firework() ); } void draw() { noStroke(); rect(0, 0, width, height); for (Firework fw: fires) fw.display(); } void mousePressed() { for (Firework fw: fires) if (fw.isInactive) { fw.launch(); return; } } final class Firework { int x, y, targetY; int flareAmount, flareWeight, colour; int explodeTimer, explosionDuration; float flareAngle; boolean hasExploded, isInactive = true; final static color FG = -1; final static byte SPD = 2, BOLD = 2; void display() { if (isInactive) return; if (hasExploded) exploding(); else rising(); } void rising() { launchMaths(); strokeWeight(BOLD); stroke(FG); point(x, y); } void exploding() { explodeMaths(); strokeWeight(flareWeight); stroke(colour); translate(x, y); for (int i = flareAmount+5; i != 0;) { float rad = radians(--i*flareAngle); point(sin(rad)*explodeTimer, cos(rad)*explodeTimer); } resetMatrix(); } void launch() { activate(); x = mouseX; y = height; targetY = mouseY; colour = color(random(3)*50 + 105, random(3)*50 + 105, random(3)*50 + 105); flareAmount = ceil( random(30) ) + 20; flareWeight = ceil( random(3) ); explosionDuration = 20*ceil( random(4) ) + 30; //makes explosion a full circle: flareAngle = 360/flareAmount; } void launchMaths() { if (targetY - (y -= SPD) > 0) explode(); } void explodeMaths() { if (++explodeTimer > explosionDuration) disable(); } void explode() { explodeTimer = 0; hasExploded = true; } void disable() { isInactive = true; } void activate() { isInactive = hasExploded = false; } }