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 dy
et la vitesse le long de l'axe x dx
.
Sa physique est la suivante:
Chaque fois que UP n'est pas enfoncé , dy
accélère en accélération constante, indéfiniment vers le bas. (La gravité). dx
reste dans sa valeur actuelle.
Lorsque UP est enfoncé , dy
accé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). dx
reste dans sa valeur actuelle.
Lorsque GAUCHE est enfoncé , dx
accé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: dy
devient 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.
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
Réponses:
tl; dr:
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.
CS.x
&CS.y
sont notre vitesse actuelle sur les axes x et y.TS.x
&TS.y
Est-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.y
sont 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:
La même chose avec y.
la source
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.
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.
la source
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.
la source