Comment prendre en compte la gravité lors du déplacement de l'IA

9

Je fais un jeu 2D. Il y a actuellement un hélicoptère volant autour, contrôlé par le joueur. Il est contrôlé à l'aide des touches fléchées: HAUT, GAUCHE et DROITE.

C'est la vitesse le long de l'axe y dyet la vitesse le long de l'axe x dx.

Sa physique est la suivante:

Chaque fois que UP n'est pas enfoncé , dyaccélère en accélération constante, indéfiniment vers le bas. (La gravité). dxreste dans sa valeur actuelle.

Lorsque UP est enfoncé , dyaccélère en accélération constante de ce qu'elle est actuellement, jusqu'à 4 (vers le haut, jusqu'à ce qu'elle atteigne la vitesse 4). dxreste dans sa valeur actuelle.

Lorsque GAUCHE est enfoncé , dxaccélère en accélération constante, quelle qu'elle soit actuellement, jusqu'à -4 .

Lorsque vous appuyez à DROITE , dx accélère en accélération constante, quelle qu'elle soit actuellement, jusqu'à 4 .

(Lorsque GAUCHE ou DROITE sont enfoncés et HAUT n'est pas enfoncé simultanément, comme je l'ai dit: dydevient de plus en plus petit, car la gravité affecte l'hélicoptère)

Tout cela fait que l'hélicoptère suit souvent des arcs en l'air plutôt que des lignes droites.

Cela crée une physique qui semble assez réaliste.

Ma question est:

L'hélicoptère adverse, une IA, devrait se déplacer en utilisant le même système physique.

Disons que l'IA veut se rendre d'où elle est actuellement, au point B.

entrez la description de l'image ici

S'il n'y avait pas de gravité et aucune accélération progressive dans le jeu, ce serait facile. Je dessinerais simplement un vecteur de la position de l'IA au point B et je ferais en sorte que l'IA le suive.

Mais comme il y a de la gravité et une accélération progressive, l'IA ne peut jamais (presque) se déplacer en ligne droite . quelle serait la meilleure façon de faire passer l'IA au point B, le plus rapidement possible?

Comment puis-je prendre en compte la gravité lors du déplacement de l'IA vers une destination spécifique?

(Si c'est plus facile à expliquer, veuillez considérer que le point B est au même niveau sur l'axe des y que l'IA, et non en diagonale par rapport à lui.)

Merci

user3150201
la source
Pouvez-vous désactiver la physique sur l'IA pendant qu'elle se déplace? Si c'est le cas, vous pouvez le désactiver pendant qu'il se déplace vers le point et l'activer lorsqu'il l'a atteint.
Zhafur
@Zhafur Cela rendra le mouvement de l'IA irréaliste, ou du moins différent de la façon dont le mouvement du joueur semble. Je veux que le mouvement de l'IA ressemble au mouvement du joueur.
user3150201

Réponses:

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;

Même chose avec y. N'oubliez pas de limiter la vitesse pour qu'elle se situe entre zéro et la vitesse maximale. Si l'ennemi a une vitesse très lente à un moment donné et qu'il essaie de s'arrêter, il peut commencer à se déplacer dans la direction opposée. Ne le permettez pas. Arrêtez-le s'il ralentit et que sa vitesse est inférieure à 1 * Acc.

Version longue: S'il n'y a pas d'obstacles, le mouvement sur l'axe des y est complètement hors de propos (et n'affecte pas) le mouvement sur l'axe des x. La question que vous décrivez peut donc être divisée en deux questions distinctes.

  1. Se déplacer là-bas sur l'axe des x
  2. Et se déplacer là-bas sur l'axe des y.

CS.x& CS.ysont notre vitesse actuelle sur les axes x et y.

TS.x& TS.yEst-ce le temps qu'il vous faudrait pour vous arrêter uniquement verticalement ou horizontalement compte tenu de votre vitesse actuelle dans l'axe concerné.

D.x& D.ysont la distance sur chaque axe.

tl; dr: vous continuez d'accélérer (si possible [sauf si vous avez atteint la vitesse de pointe]) sur l'axe des x jusqu'à ce que vous atteigniez un endroit où la condition suivante est vraie:

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

La même chose avec y.

AturSams
la source
2

Une approche que j'ai utilisée pour un problème similaire consistait à dessiner d'abord un vecteur sur la cible, puis à le comparer à la direction de vitesse actuelle.

Donc, prenez l'angle signé entre le vecteur vitesse et le vecteur cible et appliquez une poussée par rapport à la taille du vecteur.

Donc, si l'angle a entre le vecteur de vitesse rouge et le vecteur cible vert est négatif, appliquez une poussée positive, sinon n'appliquez aucune poussée et laissez la gravité la régler.entrez la description de l'image ici

Notez que vous devrez traiter les quatre quadrants où la cible peut être différente (comme si la cible avait été dans le coin supérieur gauche, un angle positif aurait nécessité l'application d'une poussée).

Assurez-vous également d'appliquer la quantité de poussée par rapport à l'écart par rapport à la vitesse cible.

Techniquement, cela ne prend pas en compte la gravité, cela compense l'état actuel et cela signifie que l'hélicoptère AI peut ne pas voler en ligne droite vers la cible, mais vacillera un peu. Cela peut ou non fonctionner pour votre jeu.

bornander
la source
1
Merci. Plusieurs questions à ce sujet: 1- "... appliquer une poussée par rapport à la taille du vecteur " . Voulez-vous dire, "taille de l' angle " ? 2- Par «angle signé», vous voulez dire positif ou négatif - correct? Si c'est le cas, un angle est positif s'il se situe au-dessus de la ligne brune et négatif s'il se situe en dessous de la ligne brune. Droite? 3- Si je comprends bien, vous voulez dire: à chaque image, obtenez l'angle entre le vecteur vitesse actuel et le vecteur courant par rapport à la cible. Ensuite, ajoutez / soustrayez de dx et dy en conséquence. Est-ce correct?
user3150201
@ user3150201 Oui sur la question de l'angle. Oui sur la question signée / non signée, atan2 peut vous donner l'angle signé entre deux vecteurs. Il semble que vous ayez compris mon point de vue, je m'excuse si je n'ai pas été clair.
bornander
1

Vous pouvez simplement recalculer le mouvement de chaque image X. En supposant que vous ne placez pas trop d'images entre les deux, mais suffisamment pour que cela n'affecte pas les performances, la gravité sur un hélicoptère ne devrait pas être assez forte pour vraiment voir la trajectoire changer. De plus, je pense qu'un joueur pourrait éventuellement se déplacer de la même manière, en s'adaptant à la gravité tout en se déplaçant et sans l'avoir planifiée.

Alexandre Dansereau
la source