ArrayList blobs = new ArrayList(); float SZ; void setup() { size(500, 500); SZ = 500; for(int i = 0; i < 5; i++){ blobs.add(new Blob(random(100,400),random(200,300))); } noStroke(); } void draw() { background(220); for(Blob b : blobs){ b.check(); b.draw(); } fill(220); rect(0,250,500,250); fill(240); arc(250,250,480,300,0,PI); } class Blob{ ArrayList corners= new ArrayList(); float sz,x,y; Blob(float px, float py){ x = px ; y = py; sz = SZ / 5; for(int i = 0; i < 4; i++){ float a = 2 * PI - (i * (PI/2)) - PI/4; corners.add(new Corner( x + (cos(a) *sz)+ (sz * random(-.2,.2)), y + (sin(a) *sz)+ (sz * random(-.2,.2)) )); } } boolean mouseIn = false; void check(){ boolean mouseInNow = mouseSortaOver(); if(mouseIn && ! mouseInNow){ // println("RELEASE"); for(Corner c : corners){ c.release(); } } if(! mouseIn && mouseInNow){ // println("HOLD " + dist(mouseX,mouseY,x,y)); for(Corner c : corners){ c.startHold(x,y); } } if(mouseIn && mouseInNow){ // println("PRESS " + dist(mouseX,mouseY,x,y)); for(Corner c : corners){ c.press(sz-dist(x,y,mouseX,mouseY)); } } mouseIn = mouseInNow; if(!mouseIn){ for(Corner c : corners){ c.move(); } } } boolean mouseSortaOver(){ return dist(mouseX,mouseY, x, y) bx) xs -= f; if(y < by) ys += f; if(y > by) ys -= f; x += xs; y += ys; xs *= .98; ys *= .98; } }