Detectar colisões Java2D

5 respostas
N

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

5 Respostas

V

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?

V

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).

L

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

V

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

L

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

Criado 8 de abril de 2010
Ultima resposta 6 de jan. de 2011
Respostas 5
Participantes 3