Cómo tener en cuenta la gravedad al mover IA

9

Estoy haciendo un juego en 2D. Actualmente hay un helicóptero volando, controlado por el jugador. Se controla con las teclas de flecha: ARRIBA, IZQUIERDA y DERECHA.

Su velocidad a lo largo del eje y es dy, y la velocidad a lo largo del eje x es dx.

Su física es la siguiente:

Siempre que no se presiona ARRIBA , dyacelera en aceleración constante, indefinidamente hacia abajo. (Gravedad). dxpermanece en su valor actual.

Cuando se presiona ARRIBA , dyacelera en aceleración constante desde lo que sea actualmente, hasta 4 (hacia arriba, hasta que alcanza la velocidad 4). dxpermanece en su valor actual.

Cuando se presiona IZQUIERDA , dxacelera en aceleración constante, desde lo que sea actualmente, hasta -4 .

Cuando se presiona DERECHA , dx acelera en aceleración constante, desde lo que sea actualmente, hasta 4 .

(Cuando se presiona IZQUIERDA o DERECHA y no se presiona ARRIBA simultáneamente, como dije: dycada vez se hace más y más pequeño, porque la gravedad afecta al helicóptero)

Todo esto hace que el helicóptero a menudo siga arcos en el aire, en lugar de líneas rectas.

Esto crea una física que parece bastante realista.

Mi pregunta es:

El helicóptero oponente, una IA, debe moverse usando el mismo sistema de física.

Digamos que la IA quiere llegar desde donde está actualmente, al punto B.

ingrese la descripción de la imagen aquí

Si no hubiera gravedad ni aceleración gradual en el juego, sería fácil. Simplemente dibujaría un vector desde la posición de la IA hasta el punto B, y haría que la IA lo siguiera.

Pero como hay gravedad y aceleración gradual, la IA nunca puede moverse en línea recta (casi). ¿Cuál sería la mejor manera de hacer que la IA vaya al punto B, de la forma más eficiente posible?

¿Cómo puedo tener en cuenta la gravedad al mover la IA hacia un destino específico?

(Si es más fácil de explicar, considere que el punto B está en el mismo nivel en el eje y que la IA, y no en diagonal).

Gracias

usuario3150201
fuente
¿Puedes desactivar la física en la IA mientras se mueve? Si es así, puede deshabilitarlo mientras se mueve hacia el punto y habilitarlo cuando lo alcance.
Zhafur
@Zhafur Esto hará que el movimiento de la IA parezca poco realista, o al menos diferente de cómo parece el movimiento del jugador. Quiero que el movimiento de la IA se vea igual que el movimiento del jugador.
usuario3150201

Respuestas:

4

tl; dr:

TimeToStop.x = CurrentSpeed.x / Accelaration.x;

if (TimeToStop.x * CurrentSpeed.x >= 1.99 * DistanceFromTarget.x)
    slow_down_x(); // CurrentSpeed += Acc.x * direction;
else
    speed_up_towards_target_x(); // CurrentSpeed += Acc.x * direction;

Lo mismo con y. Recuerde limitar la velocidad para que esté entre cero y la velocidad máxima. Si el enemigo tiene una velocidad muy lenta en algún momento y está tratando de detenerse, puede comenzar a moverse en la dirección opuesta. No lo permita. Deténgalo si está disminuyendo la velocidad y su velocidad es inferior a 1 * Acc.

Versión larga: si no hay obstáculos, el movimiento en el eje y es completamente irrelevante (y no afecta) al movimiento en el eje x. Entonces, la pregunta que describe puede dividirse en dos preguntas separadas.

  1. Moviéndose allí en el eje x
  2. Y moviéndose allí en el eje y.

CS.x& CS.yson nuestra velocidad actual en los ejes x e y.

TS.x Y TS.y Es el tiempo que le tomaría detenerse solo vertical u horizontalmente considerando su velocidad actual en el eje relevante.

D.x Y D.y son la distancia en cada eje.

tl; dr: continúa acelerando (si es posible [a menos que haya alcanzado la velocidad máxima]) en el eje x hasta llegar a un punto donde se cumple la siguiente condición:

if (TS.x * CS.x >= 1.99 * D.x) hit_the_breaks_on_x();

Lo mismo con y.

AturSams
fuente
2

Un enfoque que utilicé para un problema similar fue dibujar primero un vector hacia el objetivo, luego compararlo con la dirección de velocidad actual.

Por lo tanto, tome el ángulo firmado entre el vector de velocidad y el vector objetivo y aplique un empuje relativo al tamaño del vector.

Entonces, si el ángulo a entre el vector de velocidad rojo y el vector objetivo verde es negativo, aplique un empuje positivo; de lo contrario, no aplique ningún empuje y deje que la gravedad lo resuelva.ingrese la descripción de la imagen aquí

Tenga en cuenta que tendrá que tratar los cuatro cuadrantes donde el objetivo puede ser diferente (como si el objetivo hubiera estado en la esquina superior izquierda, un ángulo positivo habría requerido aplicar empuje).

Además, asegúrese de aplicar la cantidad de empuje en relación con la desviación de la velocidad objetivo.

Técnicamente, esto no tiene en cuenta la gravedad, está compensando el estado actual y significa que el helicóptero AI puede no volar en línea recta hacia el objetivo, pero se tambaleará un poco. Esto puede o no funcionar para tu juego.

Nacido
fuente
1
Gracias. Varias preguntas sobre esto: 1- "... aplicar un empuje relativo al tamaño del vector " . ¿Quiso decir "tamaño del ángulo " ? 2- Por 'ángulo con signo', quieres decir positivo o negativo, ¿correcto? Si es así, un ángulo es positivo si está por encima de la línea marrón y negativo si está por debajo de la línea marrón. ¿Derecha? 3- Si entiendo correctamente, lo que quiere decir es: cada cuadro, obtener el ángulo entre el vector de velocidad actual y el vector actual al objetivo. Luego suma / resta de dx y dy en consecuencia. ¿Es esto correcto?
user3150201
@ user3150201 Sí en la pregunta de ángulo. Sí, en la pregunta con signo / sin signo, atan2 puede darle el ángulo firmado entre dos vectores. Parece que entendiste mi punto, disculpas si no estaba claro.
bornander
1

Simplemente podría recalcular el movimiento que cada X enmarca. Suponiendo que no coloque demasiados cuadros entre ellos, pero lo suficiente como para que no afecte el rendimiento, la gravedad en un helicóptero no debería ser lo suficientemente fuerte como para ver realmente cambiar la trayectoria. Además, creo que un jugador podría moverse de la misma manera, adaptándose a la gravedad mientras se mueve y sin tenerlo planeado.

Alexandre Dansereau
fuente