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);
}
}
}
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);
}
}
}