Método para colisão

 Bom dia galera,

Estou sem idéias para criar um método de colisão. Seria mais fácil criar as bolinhas com a Ellipse2D para ver a colisão?
Segue o código:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Board extends JFrame implements KeyListener {
	// Setando a posição das bolinhas constantes
	public int x2 = 150;
	public int y2 = 30;

	// Setando a posição inicial da bolinha principal
	int x = 50;
	int y = 50;

	// Variável responsavel por parar as threads
	public boolean acertou;
	

	// Construtor
	Board() {

		setSize(500, 500);
		setVisible(true);
		addKeyListener(this);
		ConstantBall b1 = new ConstantBall();
		b1.start();
		ConstantBall b2 = new ConstantBall();
		b2.start();
		ConstantBall b3 = new ConstantBall();
		b3.start();
	}

	// Método responsável por atualizar a tela
	public void paint(Graphics g) {
		Graphics2D g2 = (Graphics2D) g;
		g2.setColor(Color.white);
		g2.fillRect(0, 0, this.getWidth(), this.getHeight());

		// Gerando Cores aleatórias
		int red = (int) (Math.random() * 255);
		int green = (int) (Math.random() * 255);
		int blue = (int) (Math.random() * 255);
		Color c = new Color(red, green, blue);

		// Pintando a bolinha principal
		g2.setColor(c);
		g2.fillOval(x, y, 20, 20);

		// Pintando a bolinha constante 1 de preto
		g2.setColor(Color.black);
		g2.fillOval(x2, y2, 20, 20);

		// Pintando a bolinha constante 2 de vermelho
		g2.setColor(Color.red);
		g2.fillOval(x2 + 100, y2, 20, 20);

		// Pintando a bolinha constante 3 de azul
		g2.setColor(Color.blue);
		g2.fillOval(x2 + 200, y2, 20, 20);
	}

	public static void main(String[] args) {
		Board m = new Board();
		m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Para o processo
															// terminar quando o
															// frame for fechado
	}

	// Dando movimento a bolinha principal
	@Override
	public void keyPressed(KeyEvent e) {
		switch (e.getKeyCode()) { // Pegando o código da tecla pressionada
		case KeyEvent.VK_UP: // Verificando se a seta para cima foi a tecla
								// pressionada
			if (y > 30) // Incrementando o eixo y da bolinha e verificando os
						// limites
				y -= 10;
			break;
		case KeyEvent.VK_DOWN:
			if (y < 470)
				y += 10;
			break;
		case KeyEvent.VK_LEFT:
			if (x > 10)
				x -= 10;
			break;
		case KeyEvent.VK_RIGHT:
			if (x < 470)
				x += 10;
		}
		repaint(); // Atualizando o Frame
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub

	}

	// Criando a sub-classe responsável pelas Threads
	public class ConstantBall extends Thread {

		// Sobreescrevendo o método run
		public void run() {
			
			// Código responsável pelo movimento constante das bolinhas
			do {
				do {
					y2 += 15;
					repaint();
					try {
						Thread.sleep(30);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				} while (y2 < 470 && !acertou);

				do {
					y2 -= 15;
					repaint();
					try {
						Thread.sleep(30);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				} while (y2 > 30 && !acertou);
			} while (!acertou);
			

		}

	}
}

Obrigado a todos!

Sim, seria melhor usar o Ellipse 2D, pois ele tem o método intersects.

Além disso, você deve copiar o contexto gráfico para usa-lo, e libera-lo posteriormente com dispose:

[code]public void paint(Graphics g) {
//Cópia do contexto gráfico
Graphics2D g2 = (Graphics2D) g.create();

    g2.setColor(Color.white);  
    g2.fillRect(0, 0, this.getWidth(), this.getHeight());  

    // Gerando Cores aleatórias  
    int red = (int) (Math.random() * 255);  
    int green = (int) (Math.random() * 255);  
    int blue = (int) (Math.random() * 255);  
    Color c = new Color(red, green, blue);  

    // Pintando a bolinha principal  
    g2.setColor(c);  
    g2.fillOval(x, y, 20, 20);  

    // Pintando a bolinha constante 1 de preto  
    g2.setColor(Color.black);  
    g2.fillOval(x2, y2, 20, 20);  

    // Pintando a bolinha constante 2 de vermelho  
    g2.setColor(Color.red);  
    g2.fillOval(x2 + 100, y2, 20, 20);  

    // Pintando a bolinha constante 3 de azul  
    g2.setColor(Color.blue);  
    g2.fillOval(x2 + 200, y2, 20, 20);  
    //Liberação do contexto gráfico
    g2.dispose();
}  [/code]

Se quiser testar a colisão “no braço”, basta ver se a distância entre os centros das bolinhas é menor que a soma dos raios.

Também seria legal você usar vetores matemáticos para descrever a posição e direção das bolinhas.

Uma classe para a bolinha não é má idéia. Assim vc poderia armazenar o raio, direção e posição, além de sortear a cor dela apenas no momento da criação da bolinha.

Ola Vini, Como sempre, me ajudando aqui hauhauahuahua.

Pois então, acabei arrumando aqui a colisão, mais ainda há alguns problemas:
1 - as vezes a bolinha atravessa.
2 - as vezes o programa não roda.
3 - não consigo add mais bolinhas, pois as elipses deveriam ser instanciadas na classe aninhada (thread) só que se forem estanciadas lá eu não consigo as desenhadas.

Segue o código:

package Principal;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Ellipse2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Board extends JFrame implements KeyListener {
	public boolean cima;
	public boolean baixo;
	
	// Setando a posição das bolinhas constantes
	public int x2 = 150;
	public int y2 = 30;

	// Setando a posição inicial da bolinha principal
	int x = 50;
	int y = 50;
	
	
	Ellipse2D pb;
	Ellipse2D b1;
	Ellipse2D b2;
	Ellipse2D b3;

	// Variável responsavel por parar as threads
	public boolean acertou;

	// Construtor
	Board() {
		setSize(500, 500);
		setVisible(true);
		addKeyListener(this);
		ConstantBall t1 = new ConstantBall();
		t1.start();
		/*ConstantBall t2 = new ConstantBall();
		t2.start();
		ConstantBall t3 = new ConstantBall();
		t3.start();*/
	}

	// Método responsável por atualizar a tela
	public void paint(Graphics g) {
		pb = new Ellipse2D.Double(x, y, 20, 20);
		b1 = new Ellipse2D.Double(x2, y2, 20, 20);
		b2 = new Ellipse2D.Double(x2 + 100, y2, 20, 20);
		b3 = new Ellipse2D.Double(x2 + 200, y2, 20, 20);
		
		Graphics2D g2 = (Graphics2D) g;
		g2.setColor(Color.white);
		g2.fillRect(0, 0, this.getWidth(), this.getHeight());

		// Gerando Cores aleatórias
		int red = (int) (Math.random() * 255);
		int green = (int) (Math.random() * 255);
		int blue = (int) (Math.random() * 255);
		Color c = new Color(red, green, blue);

		// Pintando a bolinha principal
		g2.setColor(c);
		g2.fill(pb);

		// Pintando a bolinha constante 1 de preto
		g2.setColor(Color.black);
		g2.fill(b1);
		

		/*// Pintando a bolinha constante 2 de vermelho
		g2.setColor(Color.red);
		g2.fill(b2);

		// Pintando a bolinha constante 3 de azul
		g2.setColor(Color.blue);
		g2.fill(b3);
		*/
	}

	public static void main(String[] args) {
		Board m = new Board();
		m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Para o processo
															// terminar quando o
															// frame for fechado
	}

	// Dando movimento a bolinha principal
	@Override
	public void keyPressed(KeyEvent e) {
		switch (e.getKeyCode()) { // Pegando o código da tecla pressionada
		case KeyEvent.VK_UP: // Verificando se a seta para cima foi a tecla
								// pressionada
			if (y > 30) // Incrementando o eixo y da bolinha e verificando os
						// limites
				y -= 10;
			break;
		case KeyEvent.VK_DOWN:
			if (y < 470)
				y += 10;
			break;
		case KeyEvent.VK_LEFT:
			if (x > 10)
				x -= 10;
			break;
		case KeyEvent.VK_RIGHT:
			if (x < 470)
				x += 10;
		}
		repaint(); // Atualizando o Frame
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub

	}

	// Criando a sub-classe responsável pelas Threads
	public class ConstantBall extends Thread {
		int j =0;
		// Sobreescrevendo o método run
		public void run() {
	
			do{
				desce();
				sobe();
						}while(!acertou);
		}
		public boolean CheckCollision(){
			boolean acertou = false;
			if(pb.intersects(x2, y2, b1.getWidth(), b1.getHeight())){
				acertou = true;
			}
			return acertou;
		}
		public void sobe(){
			do {
				if(this.CheckCollision()) {
					y2 -= 16;
					break;
					}
				y2 += 15;
				repaint();
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			} while (y2 < 470 && !acertou);
		}
		public void desce(){		
			do {
					if(this.CheckCollision()) {
						y2+=16;
						break;}					
				y2 -= 15;
				repaint();
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			} while (y2 > 30 && !acertou);
		}
	}
}

Obrigado novamente!