Fla pessoal, blz?
To com uma seguinte dúvida, procurei bastante na internet e não achei mta coisa, estou fazendo um pequeno teste com Java2d para aprender um pouco de física para usar em games, no meu teste bolas ficam caindo e quicando no chão, paredes e umas nas outras, até a parte do chão e paredes está tranquilo, minha duvida está na hora de detectar colisões entre as bolinhas, eu fiz uma comparação na mão, “deu para tapar o buraco”, mas queria algo mais elegante.
Queria saber se o Java2d tem recurso pronto para detectar colisões entre círculos, e se tiver como faz.
Aproveitando para deixar outra pergunta sobre o assunto.
Estou utilizando vetores para calcular os movimentos, alguem ai sabe como faço para calcular um vetor resultante de uma colisão entre esses vetores?
Agradeço desde já.
[]s
Veja a classe Elipse2D:
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/geom/Ellipse2D.html
Ela possui o método para detectar colisão (intersectsWith).
Quanto ao resultante. Basta somar os dois vetores. Lindo, não?
Ah. Se quiser fazer a mão:
Pegue o vetor que representa a posição de cada bola (do centro da bola).
Subtraia um do outro.
Para haver colisão: O tamanho desse vetor (que representa distância entre as bolas) deve ser menor que a soma dos dois raios.
Para otimizar isso, basta fazer o tamanho ao quadrado ser menor que a soma dos raios ao quadrado (o que evita o calculo de raiz quadrada no tamanho).
Olá amigos,
Eu tenho estudo um pouco sobre Java2D e uma das dúvidas que eu tinha era justamente sobre a colisão entre esferas, comecei estudo algumas dicas dadas nesse tópico e busquei mais algumas coisas na internet, pati do conceito geométrico de que duas bolas colidem quando a soma dos raios é igual ou menor que a distância dos centros dessas bolas, partindo desse princípio eu crie uma classe Bola e nela criei um método que calcula a distância entre o centro das duas bolas.
private int calculaDistanciaEntrePontos(PontoMedio p1, PontoMedio p2) {
double resp = 0;
double distX = Math.abs(p1.getX() - p2.getX());
double distY = Math.abs(p1.getY() - p2.getY());
resp = Math.sqrt((Math.pow(distX, 2) + Math.pow(distY, 2)));
return (int) resp;
}
Depois criei um método que detecta a colisão
public boolean detectaColisao(Bola bola) {
double soma = (this.getRaio() + bola.getRaio());
double aux = this.calculaDistanciaEntrePontos(pCentral, bola.getPCentral());
if (soma == aux || aux < soma) {
return true;
} else {
return false;
}
}
E na Thread do meu JPanel eu fiz da seguinte maneira
public void run() {
super.run();
while (true) {
//double teste = bola.calculaDistanciaEntrePontos(bola.getPCentral(), bola2.getPCentral());
if(bola.detectaColisao(bola2)){
bola.setVelocidadeX(-bola.getVelocidadeX());
bola2.setVelocidadeX(-bola2.getVelocidadeX());
}
if (!pause) {
gameUpDate();
repaint();
}
try {
Thread.sleep(1000 / UPDATE_RATE);
} catch (InterruptedException ex) {
}
}
}
Sei que é um exemplo bem simplório e ainda precisa de muito trabalho em cima dele, mas achei legal compartilhar com os colegas
Abçs
Marcelo Logan
Logan, vai ficar ainda mais elegante se você usar vetores para representar seus pontos. A classe Vector2D poderia substituir tranquilamente a sua classe PontoMedio (ou Ponto).
Dá uma lida:
O uso de vetores nos jogos
Valeu pela dica ViniGodoy,
Já dei uma lida, agora vou tentar trocar a Classe PontoMedio pela Vector2D. Fiz uns testes e o meu programa não fuinciona em todos os casos, se eu mudar a velocidade de uma das bolas da erro, mas vou continuar meus estudos.
Abçs
Marcelo Logan