J'essaie de trouver une bonne solution pour qu'une balle frappe l'ennemi. Le jeu est la tour de défense 2D, la tour est censée tirer une balle et frapper l'ennemi garanti.
J'ai essayé cette solution - http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/
Le lien mentionné pour soustraire également l'origine de la balle et l'ennemi (soustraction vectorielle). J'ai essayé mais une balle suit juste autour de l'ennemi.
float diffX = enemy.position.x - position.x;
float diffY = enemy.position.y - position.y;
velocity.x = diffX;
velocity.y = diffY;
position.add(velocity.x * deltaTime, velocity.y * deltaTime);
Je connais les vecteurs mais je ne sais pas quelles étapes (opérations mathématiques vectorielles) doivent être effectuées pour que cette solution fonctionne.
Réponses:
Votre raisonnement était parfait: utilisez un vecteur pour passer de ma position à ma cible. C'est le but d'un vecteur ; vous avez simplement oublié la vitesse !
La vitesse est un vecteur: une vitesse et une direction. Cependant, si vous oubliez de normaliser le vecteur de différence et de le multiplier par la vitesse de la balle (un scalaire), vous dites essentiellement que si vous êtes proche de la cible (le vecteur de différence est petit), la balle ralentit ; tandis que si vous êtes loin, la vitesse des balles est plus grande.
C'est le problème sous-jacent: vous devez calculer à la fois la direction et la grandeur du vecteur.
la source
Si la cible se déplace dans une direction stable à un rythme régulier et que votre trajectoire de balle est en ligne droite à un rythme constant, vous pouvez utiliser une équation quadratique pour prédire l'endroit exact où ils se croiseront et viser le pistolet de votre tour à cet endroit. .
Comme il est certain que la balle frappera sa marque et que vous pouvez calculer le temps exact qu'il faudra du tir à l'impact, aucune détection de collision ne serait nécessaire, il suffit de tirer le pistolet, d'attendre la durée calculée, d'enregistrer un coup.
Voici un pseudo code pour l'équation quadratique:
la source
Vous devez «prédire» la position des objets au moment où la balle l'atteindra. Vous pouvez le faire en utilisant la vitesse / vitesse des objets (espérons-le, c'est constant;)) et son vecteur directionnel.
Je ne sais pas quelle est la formule exacte du haut de ma tête, mais je pense que c'est quelque chose comme ça:
NewPosition = OldPosition + (Speed * DirectionVector);
Si vous avez un chemin défini, vous devrez recalculer lorsque l'objet change de direction. Utilisez ce NewPosition comme vecteur de l'ennemi.position et la balle devrait toucher l'objet sans «l'effet de homing». Le rapatriement se produit du fait que l'objet ennemi s'est déplacé depuis le calcul du vecteur d'origine, il ne peut rattraper son retard que lorsqu'un objet se déplace dans une direction suffisamment longtemps.
J'espère que cela t'aides :)
la source
Vous pouvez éviter d'utiliser la racine carrée et la puissance de 2.
Tout est écrit de mémoire. Soit dit en passant, utilisez les éléments qui fonctionnent - testez-le ligne par ligne si vous êtes nouveau dans ce domaine. Float est Number dans AS3.
la source