Dans mon jeu 2D, j'ai des tourelles IA qui devraient aider le joueur en tirant automatiquement vers les ennemis. Je voudrais leur faire tirer intelligemment et diriger leur cible au lieu de viser simplement la position actuelle d'un ennemi. Donc, étant donné la vitesse (toujours constante) et le vecteur de position de l'ennemi et du projectile de la tourelle, comment puis-je trouver un vecteur qui représente la position réelle que la tourelle doit cibler pour que le projectile intersecte (et frappe) l'ennemi?
Tout lien vers des articles décrivant les mathématiques, les algorithmes, etc. serait apprécié!
Réponses:
Cette question sur GameDev , et cette question sur StackOverflow devrait vous fournir la réponse que vous recherchez. :)
la source
Je ne vais pas vous donner de réponse, je suis sûr que c'est utile ou même correct, mais voici:Après avoir joué avec mathématique un peu plus (vérifiez la fin de la réponse pour les cahiers / cahiers publiés), cette solution semble être correcte, même si elle n'est peut-être pas la meilleure en termes d'efficacité.
J'ai écrit ceci en mathématique qui correspond à votre problème. Fondamentalement, il résout les équations / inégalités afin de la variable OA qui est ce que nous devons découvrir. La sortie va nous donner les solutions possibles que OA peut avoir et les conditions à vérifier pour que chaque solution soit valide:
{BPx, BPy} est la position actuelle du bleu
{BVx, BVy} est le vecteur de vitesse du bleu
{OPx, OPy} est la position de la puce orange
L'OV est la norme du vecteur de vitesse de la balle orange (vitesse totale)
OA est l'angle de balle d'orange (angle du vecteur vitesse)
t est le temps nécessaire pour que la balle frappe le bleu
J'ai essayé de mettre t> 0 && OV> 0 dans les conditions mais mathématique prendrait une éternité donc j'ai juste utilisé t! = 0 && OV! = 0. Donc les solutions que je vais donner ici fonctionnent juste quand le bleu n'est pas exactement même position que l'orange et quand la balle de l'orange bouge vraiment (au lieu de rester immobile)
La sortie est gigantesque: http://freetexthost.com/xzhhpr5e2w
Cependant, si nous extrayons les parties OA == _, nous obtenons ceci:
http://freetexthost.com/iyrhqoymfo
Ce sont les valeurs que OA peut avoir (chacune nécessitant des conditions différentes pour être valide).
Après avoir analysé plus en détail les solutions qui nécessitent que OV soit négatif, ce que nous ne voulons pas, j'ai obtenu ceci:
http://freetexthost.com/iy4wxepeb6
Ce sont donc les solutions possibles au problème, chacune nécessitant des conditions différentes pour être valide. Pour qu'un certain angle OA soit une solution valable, les conditions suivantes doivent être remplies:
Production:
Considérez donc uniquement les solutions où cela vérifie (vous n'avez pas besoin de vérifier les t == _ pièces. Ce sont elles qui vous donnent le temps nécessaire pour que la balle frappe le véhicule si les autres conditions sont valides. Notez que si t donne une valeur négative, vous ne pouvez pas considérer un OA donné comme une solution valide, même s'il vérifie les autres conditions (c'est parce que nous avons utilisé t! = 0 au lieu de t> 0 dans réduire)).
Ce pourrait également être une bonne idée de demander à /math// à ce sujet.
Éditer
J'ai développé un certain intérêt pour cette question, j'ai donc créé un cahier commenté avec une démonstration graphique de tout ce que j'ai expliqué. Télécharger les ici:
http://www.2shared.com/file/pXhYyhN1/towerBullets.html
Ou ici: http://www.2shared.com/file/W01g4sST/towerBullets.html
(ceci est la version publiée, et vous n'avez besoin que du lecteur mathématique - qui est gratuit - pour le voir. Si vous n'avez pas mathématique c'est la voie à suivre)
Capture d'écran:
la source