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 , dy
acelera en aceleración constante, indefinidamente hacia abajo. (Gravedad). dx
permanece en su valor actual.
Cuando se presiona ARRIBA , dy
acelera en aceleración constante desde lo que sea actualmente, hasta 4 (hacia arriba, hasta que alcanza la velocidad 4). dx
permanece en su valor actual.
Cuando se presiona IZQUIERDA , dx
acelera 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: dy
cada 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.
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
Respuestas:
tl; dr:
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.
CS.x
&CS.y
son nuestra velocidad actual en los ejes x e y.TS.x
YTS.y
Es el tiempo que le tomaría detenerse solo vertical u horizontalmente considerando su velocidad actual en el eje relevante.D.x
YD.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:
Lo mismo con y.
fuente
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.
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.
fuente
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.
fuente