Creo que una manera más fácil de hacer esto es utilizar la velocidad del misil en lugar de calcular anglos. Supongamos que tiene un misil que tiene xVelocity
y yVelocity
para representar su movimiento horizontal y verticalmente. Esas velocidades pueden ser positivas o negativas para representar izquierda, derecha, arriba o abajo.
- Si un misil golpea un borde superior o inferior, invierta el signo del
yVelocity
.
- Si un misil golpea un borde izquierdo o derecho, invierta el signo del
xVelocity
.
Esto mantendrá igual el movimiento en el eje opuesto.
El préstamo de la imagen desde ChrisF's answer, digamos que el misil comienza en la posición I.
Con la xVelocity
y yVelocity
tanto ser positivo (en gráficos 2D derecha y hacia abajo son típicamente positivo) el misil viajará en la dirección indicada. Vamos a asignar valores de
xVelocity = 3
yVelocity = 4
Cuando el misil golpea la pared en la posición C , su xVelocity
no debe cambiar, pero su yVelocity
debe ser revertido a -4 manera que viaja en la dirección hacia arriba, pero sigue yendo hacia la derecha.
La ventaja de este método es que sólo es necesario hacer un seguimiento de un misil de xPosition
, yPosition
, xVelocity
y yVelocity
. Usando solo estos cuatro componentes y la velocidad de actualización de tu juego, el misil siempre se volverá a dibujar en la posición correcta. Una vez que te metes en obstáculos más complicados que no están en ángulo recto o se están moviendo, será mucho más fácil trabajar con velocidades X e Y que con ángulos.
Este es un problema por el que la solución probablemente se vuelva inmediatamente obvia si vas a jugar un juego de billar. – smartcaveman