Estoy tratando de encontrar una buena solución para que una bala golpee al enemigo. El juego es la defensa de la torre 2D, se supone que la torre dispara una bala y golpea al enemigo garantizado.
Probé esta solución: http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/
El enlace mencionado para restar el origen de la bala y el enemigo también (resta de vectores). Lo intenté pero una bala sigue al enemigo.
float diffX = enemy.position.x - position.x;
float diffY = enemy.position.y - position.y;
velocity.x = diffX;
velocity.y = diffY;
position.add(velocity.x * deltaTime, velocity.y * deltaTime);
Estoy familiarizado con los vectores, pero no estoy seguro de qué pasos (operaciones matemáticas de vectores) se deben realizar para que esta solución funcione.
Respuestas:
Su razonamiento fue perfecto: use un vector para moverse de mi posición a mi objetivo. Este es el propósito de un vector ; ¡simplemente olvidaste la velocidad !
La velocidad es un vector: una velocidad y una dirección. Sin embargo, si olvida normalizar el vector de diferencia y multiplicarlo por la velocidad de la bala (un escalar), básicamente está diciendo que si está cerca del objetivo (el vector de diferencia es pequeño) la bala se ralentiza ; mientras que si estás lejos, la velocidad de la bala es mayor.
Este es el problema subyacente: necesita calcular tanto la dirección como la magnitud del vector.
fuente
Si el objetivo se mueve en una dirección constante a un ritmo constante, y su trayectoria de bala está en línea recta a un ritmo constante, puede usar una ecuación cuadrática para predecir el punto exacto en el que se cruzarán y apuntar el arma de su torre hacia ese punto .
Dado que es seguro que la bala alcanzará su marca, y puede calcular el tiempo exacto que tomará desde el disparo hasta el impacto, no se requerirá detección de colisión, simplemente dispare el arma, espere el lapso de tiempo calculado, registre un golpe.
Aquí hay un pseudocódigo para la ecuación cuadrática:
fuente
Debe 'predecir' la posición de los objetos para cuando la bala lo alcance. Puede hacer esto usando la velocidad / velocidad de los objetos (es de esperar que sea constante;)) y su vector direccional.
No estoy seguro de cuál es la fórmula exacta de mi cabeza, pero creo que es algo como esto:
NewPosition = OldPosition + (Speed * DirectionVector);
Si tiene una ruta establecida, deberá volver a calcular cuando el objeto cambie de dirección. Use esta nueva posición como su vector de posición enemiga y la bala debería golpear el objeto sin el 'efecto de referencia'. El recorrido de referencia se produce debido al hecho de que el objeto enemigo se ha movido desde que se calculó el vector original, solo puede alcanzarlo cuando un objeto viaja en una dirección el tiempo suficiente.
Espero que esto ayude :)
fuente
Puede evitar el uso de raíz cuadrada y potencia de 2.
Todo está escrito de memoria. Por cierto, usa los elementos que funcionan: pruébalo línea por línea si eres nuevo en esto. Float es Number en AS3.
fuente