class Color { float r, g, b, a; Color() { r = random(0, 255); g = random(0, 255); b = random(0, 255); a = 255;//random(na, 255); } Color( float nr, float ng, float nb, float na) { r = nr; g = ng; b = nb; a = na; } boolean equals(Color t) { float pixelError = 2.0; if( abs(t.r-r) < pixelError && abs(t.g-g) < pixelError && abs(t.b-b) < pixelError ) return true; return false; } float getR() { return r; } float getG() { return g; } float getB() { return b; } float getA() { return a; } } class Blob { Color blobColor; float posx, posy, d; float v; float weight = 6.0; float flicked = 0; float origd; float bob, rad, speed; int animation; Blob(int maxX, int maxY) { posx = random(0, maxX); posy = random(0, maxY); origd = random(10, 100); d = 0; bob = 0; blobColor = new Color(); rad = random(2, 10); speed = random(0.1,0.5); } void update() { switch(animation) { case 1: bob += 1; if(bob >=360 ) bob = 0; d = d + rad * sin(bob*(speed)); break; case 2: blobColor.a -= speed * random(2, 10); break; default: if(d < origd) { d += random(0.1, 0.5); } break; } } void render() { strokeWeight(5 * (blobColor.a / 255)); stroke(0, blobColor.a); fill(blobColor.r, blobColor.g, blobColor.b, blobColor.a);//, (life/birth)*a); ellipse(posx, posy, d, d); } boolean isDead() { return (blobColor.a <=0 ); } boolean inside(int x, int y) { if( (posx - x) * (posx - x) + (posy - y) * (posy - y) <= (d/2) * (d/2) && animation != 2) return true; return false; } Color getColor() { return blobColor; } void animate(int mode) { if(animation == 2 ) return; animation = 0; if(mode > 0) animation = mode; } } class Background { float r, g, b; Color bgColor; Color toColor = new Color(); Color stepColor = new Color(); int steps, stepsize; Background() { bgColor = toColor = new Color(255, 255, 255, 255); } void update() { if(!toColor.equals(bgColor)) { transitionTo( toColor ); } } void render() { background(bgColor.r, bgColor.g, bgColor.b); } void changeBG( Color newColor ) { steps = (int)random(5, 250); toColor = newColor; stepColor.r = ((bgColor.r - newColor.r)/steps); stepColor.g = ((bgColor.g - newColor.g)/steps); stepColor.b = ((bgColor.b - newColor.b)/steps); } void transitionTo( Color newColor ) { bgColor.r -= stepColor.r; bgColor.g -= stepColor.g; bgColor.b -= stepColor.b; } } class World { ArrayList Blobs; Background bg; World( int numBlobs ) { Blobs = new ArrayList(); bg = new Background(); for( int i = 0; i < numBlobs; ++i) { Blobs.add(new Blob(width, height)); } } void render() { // Render our background bg.render(); // Renders our blobs. for( int i = 0; i < Blobs.size(); ++i) { ((Blob)Blobs.get(i)).render(); } } void update() { // Update our background bg.update(); // Updates our blobs. for( int i = 0; i < Blobs.size(); ++i) { ((Blob)Blobs.get(i)).update(); if( ((Blob)Blobs.get(i)).isDead() ) { Blobs.remove(i); if(Blobs.size() == 0) { newBlobs((int)random(1,50)); } } } } void mouseClick(int x, int y) { for( int i = Blobs.size()-1; i >= 0; --i) { if(((Blob)Blobs.get(i)).inside(x, y)) { bg.changeBG(((Blob)Blobs.get(i)).getColor()); for( int k = 0; k < Blobs.size(); ++k) { ((Blob)Blobs.get(k)).animate(2); } break; } } } void mouseMove(int x, int y) { boolean bobble = true; for( int i = Blobs.size()-1; i >= 0; --i) { if(bobble && ((Blob)Blobs.get(i)).inside(x, y)) { ((Blob)Blobs.get(i)).animate(1); bobble = false; } else { ((Blob)Blobs.get(i)).animate(0); } } } void newBlobs( int num ) { for( int i = 0; i < Blobs.size(); ++i) { Blobs.remove(i); } for( int i = 0; i < num; ++i) { Blobs.add(new Blob(width, height)); } } void transition() { } } World myWorld; void setup() { size(400, 400); frameRate(60); smooth(); myWorld = new World((int)random(1,50)); } void draw() { myWorld.update(); myWorld.render(); } void mouseMoved() { myWorld.mouseMove(mouseX, mouseY); } void mousePressed() { myWorld.mouseClick(mouseX, mouseY); }