Dúvida em tratamento de colisão, detectar lado

Olá

Estou tendo problemas para pensar em como fazer o tratamento das colisões do game que estou desenvolvendo, o jogo é o pong.

Eu tenho um método que me retorna se há ou não colisão, mas o problema está em desenvolver a lógica para descobrir de que lado vem a colisão. Isto por que estou testando o projeto como se houvesse duas bolas em ação, e as duas podem se rebater, e preciso saber em qual dos lados houve colisão, para efetivamente mudar a direção das bolas.

Este é o método que checa colisão:

public boolean checkCollisionTo(Sprite obj){
            if(colisao == false){
                if (x > obj.x+SIZE)
                    return false;
                if (x+SIZE < obj.x)
                    return false;
                if (y > obj.y+SIZE)
                    return false;
                if (y+SIZE < obj.y)
                    return false;
                return true;
            }
            return false;
        }

Não sei se esta é a melhor forma de detectar uma colisão, mas preciso da ajuda de vocês.

Obrigado!

http://keith-hair.net/blog/2008/08/08/line-to-polygon-intersection-data/

Acho que entendi a utilidade…

Eu usaria a lógica desse código, e verificaria o lado da colisão a partir dos pontos de interseção e do centro de massa do polígono certo?

Bom, desde já obrigado! Vou tentar aplicar o que pensei (caso seja isto) e retorno com os resultados.

Sim. Vc traça a reta da posição antiga até a nova do polígono. E então, testa o lado da colisão.

Achei que tinha entendido, mas não entendi bem o que vocês quis dizer com traçar a reta da posição antiga até a atual do polígono… Não consigo enxergar seu raciocínio…

Esse é um calculo que envolve uma reta.

A trajetória que um corpo percorreu entre dois pontos, define uma reta.

Essa reta é que será usada na colisão do polígono.

PS: Esse algorítmo, além de determinar lado, evita o problema de penetração. Ou seja, de não haver colisão caso o game loop ocorra lentamente.

O que eu consegui fazer foi:

Criei um método que no momento da colisão calcula a distancia entre os centros dos polígonos, caso a distância em X seja maior, é uma colisão lateral, que eu verifico se é esquerda ou direita fazendo x1-x2 ou x2-x1, ou caso a distância seja maior em Y, e mesmo esquema pra verificar se é de cima ou em baixo…

Funciona quase perfeitamente, a não ser pelo caso em que a colisão por cima ou por baixo, os dois polígonos estão entrando um dentro do outro…