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
Article précédant :
[Tuto] Un terrain 3D à partir d'un bitmapArticle suivant :
Media Player Classic : pixel shaders pour les débutants!
Billets similaires | Tagsflash programmation algorithme ia |
Commentaires 5 commentaires
Damien le 28 Avril 2008 à 7:19
Tu rajoute 2 ou 3 mobs et up ca fait un jeu de tir lol.RoUtMoUt le 28 Avril 2008 à 7:47
si la coordonnées de la souris est égale à celle des contour (0,y ; 0,x ; maxX,y ; x,maxY) hop la petite bouboule reviens en son centre pour un effet de toute beauté ou pas ...n666eo le 28 Avril 2008 à 8:46
Je me permets une petite correction de maths (je suis nul en info, mais j'ai des notions de maths... ;o) : "La direction d'un vecteur est symbolisé par sa norme." Là j'ai un soucis pour comprendre. La direction d'un vecteur correspond aux coordonnées du vecteur vitesse dans ce cas précis. Dans tous les cas, la direction indique une orientation spatiale, en 2D ou en 3D, ou en 18D (vive les maths...). La norme est représentative de la "longueur" de ce vecteur, de sa dimension. Ca correspond d'ailleurs au calcul que tu fais aprés.Voilà, c'était ma remarque à deux balles ! ;o)
dante le 28 Avril 2008 à 8:59
Tout à faire n666eo, merci, je fais la correction !Seb le 28 Avril 2008 à 9:53
gg, simple et compréhensible. Merci dante :)