Tengo un juego simple en el que el jugador mueve una pelota. La pelota rebota en las paredes. En este momento tengo implementadas paredes cuadradas (■): uso colisiones simples de cuadros delimitadores para verificar si el jugador se moverá hacia una pared cuando actualice su velocidad x o y y si es así, multiplico esa velocidad con -1 para que rebote .
Sin embargo, también quiero implementar piezas triangulares (◢◣◤◥). Para recuperarse, creo que uno simplemente puede usar:
newxspeed = -1*yspeed;
newyspeed = -1*xspeed;
Sin embargo, tengo problemas con la detección de colisión: ¿Cuándo golpea el jugador la diagonal?
Respuestas:
En primer lugar, para calcular la detección de colisión entre una esfera (círculo en 2D) y una línea, debe calcular el vector perpendicular entre el centro de la bola en movimiento y la línea, para calcular esta distancia debe hacer lo siguiente:
Entonces, para calcular d en la figura anterior, necesitamos hacer algunos pasos.
Luego expande la ecuación para obtener lo siguiente, parece un poco complicado, pero en realidad no lo es.
Donde Q es el centro del círculo y S es cualquier punto de la línea. Una vez que la distancia es menor que el radio del círculo / esfera, debe activar la respuesta de colisión que se explica en el siguiente punto.
Es incorrecto voltear siempre el componente x o y para hacer rebotar la pelota, lo que debe hacer es reflejar el vector de velocidad, para hacerlo debe calcular el vector Normal de la superficie y usar ese normal para calcular la reflexión vector usando la siguiente ecuación
donde R es el vector de reflexión, N es la normal de la superficie y V es el vector de velocidad.
En el caso de 45 grados, su superficie normal será N = (1,1,0) con signo variable dependiendo de en qué dirección se enfrenta la normal (posición o negativo).
fuente
Desea medir la distancia entre el centro de su bola y la pared, entonces:
resolver el sistema que ves en la imagen te dará las coordenadas del punto d.
Entonces, si la distancia entre el punto d y c es menor o igual al radio de la bola r, hay una colisión entre la bola y la pared
fuente
Las bolas son en realidad objetos bastante simples para la detección de colisiones. Chocan con el terreno cuando la distancia entre el centro de la pelota y el borde del terreno es menor que el radio de la pelota. La posición del centro de la pelota debe ser trivial para obtener. Encontrar el punto de terreno más cercano es generalmente más complicado y la mejor manera de hacerlo depende de cómo esté representado el terreno.
Su algoritmo para calcular la nueva velocidad después de rebotar en una pendiente diagonal es incorrecto. Invertir las coordenadas X e Y hará que la pelota retroceda en la misma dirección desde la que se acercó a la pendiente. Esto está bien si la pelota llega al terreno desde un ángulo recto, pero falla en otros ángulos. Querrá negar solo el componente normal a la superficie, por ejemplo, cuando rebota en el techo, niega y, no x.
fuente