Un objet qui se dirige vers un point
Salut à tous,
L'objet de se billet est d'aborder d'une manière simple et efficace le suivi d'un objet vers un point. Le problème posé est le suivant :
Un objet A doit se rendre à un point B en ligne droite.
Nous prendrons une boule pour représenter l'objet A, et la position de la souris représentera le point B. L'application sera réalisée sous Flash pour plus de simplicité :)
Bref, un objet est représenté par des coordonnées, jusque là rien de nouveau. Son déplacement est le résultat de l'application d'une vitesse dans la direction voulue. La direction voulue est aussi représentée par un couple de point (x,y).
Pour déplacer un objet, on modifier simplement la position en X, et la position en Y (pour un plan en 2D). Ces 2 variables sont affectées par un vecteur vitesse V qu'il faudra calculer. Maintenant que nous avons tous les outils en main, et qu'on a fait notre schéma sur une feuille on peut passer à quelle méthode choisir. Il existe principalement 2 possibilités, une compliqué, et une simple.
La compliqué fait appel à vos vieux souvenirs : le théorème de Thalès, et aux formules permettant de calculer la distance entre 2 points. Inutile ici. La direction d'un vecteur est symbolisée par le signe de ses composantes, la distance de déplacement unitaire par sa norme. Donc si nous avons sa norme, il suffira de la multiplier par notre vitesse pour avoir le déplacement souhaité et dans la bonne direction ! Maintenant comment avoir ce vecteur ?
Il est simplement calculé en faisant la différence du vecteur d'arrivée par celui de départ.
Rappel, calcul de la norme d'un vecteur, soit le vecteur Z :
N = √( Zx² + Zy²)
Le vecteur normalisé sera alors :
Z ( Zx / N ; Zy / N)
Appelons notre occurence "test", voici ce que donne le code :
vit = 10
var ox,oy, dx,dy, ix,iy;
// origine de notre boule (son centre)
ox = test._x + test._width / 2
oy = test._y + test._height / 2
// destination souris
dx = _root._xmouse
dy = _root._ymouse
// vecteur qui sera normalisé, c'est la distance à parcourir
ix = dx - ox
iy = dy - oy
var n = rac((ix)²+(iy)²)
// on multiplie par la vitesse le vecteur unitaire
ix *= (vit/n)
iy *= (vit/n)
// on ajoute le vecteur vitesse à notre boule
test._x += ix
test._y += iy
Si vous testez ce code aprés avoir créé un clip et l'avoir nommé en "test", vous verrez que la boule tremblera une fois arrivée. Tout simplement parce qu'il faut rajouter une condition vérifiant si distance à parcourir vers la cible n'est pas inférieure à la vitesse de déplacement. Dans ce cas là, on avance de ce qu'il reste. (On applique donc pas le vecteur vitesse)
if(n>vit)
{
ix *= (vit/n)
iy *= (vit/n)
}
Le résultat :
Evidemment ce n'est pas compliqué, mais je pense que les personnes qui ont oublié leurs cours de maths trouveront ça bien utile, car j'ai galéré pour faire un truc aussi simple, et ça sert énormément ce genre de calcul.
Cliquez sur ce lien pour avoir les sources Source
Votez![]() ![]() ![]() | Billets similaires Hordes : Combien de temps survivrez vous encore ? | Tags flash programmation algorithme ia | Publicité< |

28 Avril 2008
7:19
28 Avril 2008
7:47
28 Avril 2008
8:46
Voilà, c'était ma remarque à deux balles ! ;o)
28 Avril 2008
8:59
28 Avril 2008
9:53





Ajouter cette page à mes favoris
Envoyer cet article par mail