buenas, tengo esta formula para la interacción entre una pelota y un rectángulo, el caso es que he conseguido que funcione, pero solo el rebote hacía un lado, si por ejemplo quiero que al golpear por arriba rebote lo que pongo es if (y==1){y=-1} así le digo que si la dirección y es positiva (la pelota esta bajando) al tocar tiene que ser negativa (la pelota empezará a subir y producirá la sensación de rebote) el problema es que si le pongo lo mismo por abajo if(y==-1){y=1} la pelota se vuelve loca en el sitio, podría solucionarlo con un timer creo porque lo que creo que pasa es que intenta ejecutar los dos if a la vez al hacer contacto, pero ya no se me ocurre nada para que pueda rebotar por los lados del rectángulo (al tocar ahí hace efecto tunel, se mete dentro hasta salir por el otro lado), se que tendría que manejar las x para cambiar la dirección lateral pero si le pongo que al hacer contacto cambie la dirección de la x me la cambiara cuando choque en cualquier parte del rectangulo, tengo entendido que con esta formula puedo manejar el rebote en los cuatro lados del rectángulo pero no estoy sabiendo aplicarlo, alguien podría decirme como podría hacerlo?
100 es la posición x del rectángulo.
300 es la posición y del rectángulo
170 es el ancho del rectángulo
30 es el alto del rectángulo
circlex lo posición x del centro del circulo
circley es la posición y del centro del rectángulo
public boolean golpe(Pelota circle) {
double circleDistanceX = Math.abs(circle.centrox - 100 - 170/2);
double circleDistanceY = Math.abs(circle.centroy - 300 - 30/2);
if (circleDistanceX > (170/2+ circle.radio)) { return false; }
if (circleDistanceY > (30/2 + circle.radio)) { return false; }
if (circleDistanceX <= (170/2)) { return true; }
if (circleDistanceY <= (30/2)) { return true; }
double cornerDistance_sq = Math.pow(circleDistanceX - 170/2, 2) + Math.pow(circleDistanceY - 30/2, 2);
return (cornerDistance_sq <= (Math.pow(circle.radio, 2)));
}