davmazo
Ex Member
Collision Id.
Aug 29th , 2008, 6:43pm
Hi all, I’m trying to print which ball is touched. I was searching the info inside “void collide” but I don’t get it. I just need the number of the ball that is in contact with the ball[0] controled by the mouse. Thanks for the help David /** * Bouncy Bubbles. * Based on code from Keith Peters (www.bit-101.com). * * Multiple-object collision. */ int numBalls = 8; float spring = 0.5; float gravity = 0.03; Ball[] balls = new Ball[numBalls]; //____________________________________________________________________ void setup() { size(200, 200); noStroke(); smooth(); for (int i = 1; i < numBalls; i++) { balls[i] = new Ball(random(width), random(height), 20, i, balls); } balls[0] = new Ball(mouseX,mouseY, 30, 0, balls); } //____________________________________________________________________ void draw() { background(0); balls[0].x=mouseX; balls[0].y=mouseY; balls[0].collide(); balls[0].display(); for (int i = 1; i < numBalls; i++) { balls[i].collide(); balls[i].move(); balls[i].display(); } } //____________________________________________________________________ class Ball { float x, y; float diameter; float vx = 0; float vy = 0; int id; Ball[] others; Ball(float xin, float yin, float din, int idin, Ball[] oin) { x = xin; y = yin; diameter = din; id = idin; others = oin; } void collide() { for (int i = id ; i < numBalls; i++) { float dx = others[i].x - x; float dy = others[i].y - y; float distance = sqrt(dx*dx + dy*dy); float minDist = others[i].diameter/2 + diameter/2; if (distance < minDist) { float angle = atan2(dy, dx); float targetX = x + cos(angle) * minDist; float targetY = y + sin(angle) * minDist; float ax = (targetX - others[i].x) * spring; float ay = (targetY - others[i].y) * spring; vx -= ax; vy -= ay; others[i].vx += ax; others[i].vy += ay; } } } void move() { vy += gravity; x += vx; y += vy; if (x + diameter/2 > width) { x = width - diameter/2; vx += -0.9; } else if (x - diameter/2 < 0) { x = diameter/2; vx *= -0.9; } if (y + diameter/2 > height) { y = height - diameter/2; vy *= -0.9; } else if (y - diameter/2 < 0) { y = diameter/2; vy *= -0.9; } } void display() { fill(255, 204); ellipse(x, y, diameter, diameter); } }