Créons un cercle qui suit le curseur de la souris. Commençons par créer un cercle :
|
|
Pour déplacer le cercle jusqu’à la souris, nous devons connaître l’angle. Nous pouvons le connaître avec la fonction math.atan2. Le premier argument est la position y que nous souhaitons accéder moins la position y de notre objet. Le second argument est le même mais pour x. C’est l’une des rares occasions où y est avec x.
Fondamentalement, ce que fait atan2 est qu’il faut un vecteur vertical et horizontal (distance + direction) et avec cette information il retourne un angle :
Pour obtenir la vitesse, nous avons besoin de soustraire la position du cercle à la position de la cible :
|
|
Si atan2 vous déroute, ne vous inquiétez pas, tout ce que vous devez savoir est que math.atan2(cible_y – objet_y, cible_x – objet_x) vous donne un angle. Dans notre cas l’objet est le cercle et la cible le curseur de la souris.
Vous êtes sur le point d’y arriver. Ne vous laissez pas effrayer. Ce n’est pas difficile et si vous ne comprenez pas ça, ce n’est pas grave pour un débutant.
Quand vous lancez le jeu vous remarquerez que l’angle ne dépassera pas 3,14 (Pi, π). C’est parce que atan2 ne retourne pas un angle en degré mais plutôt en radian.
Cette image animée (gif) explique les radians :
Si vous êtes encore perdu, je vous recommande de lire cet article sur wikipedia
Quelques points clef :
- math.atan2 retourne un angle en radian
- l’angle retourné est compris entre -3,14 et 3,14.
- 360 degrés vaut 2×π radian. Donc 90 degré équivaut à $\dfrac{π}{2}$ radian.
- Le nombre π, écrit aussi Pi, est le rapport de la circonférence d’un cercle à son diamètre ce qui signifie que si nous devions prendre le diamètre d’un cercle et le diviser par la circonférence du cercle (périmètre), nous obtiendrions π.
En Lua nous pouvons obtenir π en utilisant math.pi.
Si vous ne comprenez pas tout correctement maintenant, ne vous découragez pas, surtout si c’est la première fois
Sinus et cosinus
Maintenant nous avons besoin de faire avancer notre cercle vers la souris. Pour ça nous allons utiliser math.cos et math.sin
Les 2 fonctions retournent un nombre entre -1 et 1, basé sur l’angle que nous passons en paramètre.
Voilà un gif pour vous aider à visualiser le sinus et le cosinus :
Et une image pour montrer exactement ce qu’il se passe sur l’image animée :
Sinus et cosinus sont des nombres compris entre -1 et 1 qui sont basés sur l’angle
Si l’angle pointe sur la gauche alors le cosinus sera -1 et le sinus sera 0 :
Si l’angle est en bas alors le cos vaut 0 et le sinus 1 :
Alors, comment pouvons-nous utiliser ces valeurs pour faire avancer notre cercle vers la souris ? Hé bien en multipliant votre vitesse par eux. Par exemple, si la souris est à sur une diagonale, disons en haut à droite, le sinus vaudrait $\approx −0,7$ et le $cos \approx 0,7$.
Maintenant, si nous faisons ceci :
|
|
Notre cercle se déplacerait directement en bas à droite. Mais en multipliant par le sin et le cos comme ceci :
|
|
Alors notre cercle se déplace horizontalement avec $circle.speed×0.7$
Et devrait bouger verticalement avec $circle.speed\times −0.7$
Ce qui signifie qu’il devrait se déplacer directement vers notre souris. Essayons ça !
|
|
Les distances
Maintenant disons que nous voulons seulement déplacer notre cercle quand il est loin de notre souris. Pour faire ça, nous avons besoin de calculer la distance entre eux. Nous utilisons donc le théorème de Pythagore.
Avec lui, nous pouvons calculer la ligne la plus longue (hypoténuse) dans un triangle rectangle.
Fondamentalement, ce que vous faites est d’utiliser la longueur des cotés les plus courts en les mettant au carré. Ensuite vous en faites la somme pour finalement en prendre la racine carré et finalement avoir la longueur du coté le plus long que l’on appelle aussi hypoténuse.
Lorsque vous avez 2 points, dans notre cas le cercle et la souris, il existe également un triangle invisible. Vérifions le :
|
|
Si nous utilisons le théorème de Pythagore sur notre triangle nous pouvons trouver son hypoténuse et trouver la distance entre les 2 points.
Créons une nouvelle fonction pour ça. Premièrement nous avons besoin des cotés horizontaux et verticaux :
|
|
Ensuite nous avons besoin de mettre au carré les nombres. Nous pouvons les multiplier par eux-même ou utiliser ^2.
|
|
Nous avons besoin de faire la somme de ces nombres et d’en prendre la racine carré. Si vous faites $5\times 5$ ou $5^2$, vous obtenez 25. La racine carrée de 25 est 5. Nous pouvons obtenir la racine carrée avec math.sqrt :
|
|
Pour prouver que cela fonctionne, dessinons un cercle avec un rayon de la distance :
|
|
Cela fonctionne !
Maintenant amusez-vous. Je veux seulement que le cercle bouge quand la distance est supérieure à 200 pixels et que plus il est près et plus il bouge doucement :
|
|
Images
Utilisons une image et changeons le look de la souris :
L’argument optionnel pour la rotation est par défaut à 0.
Avec un angle à 0, le cos vaut 1 et le sin 0 ce qui veut dire que l’objet se déplacerait sur la droite.
Donc quand vous utilisez une image, vous devriez la voir sur la droite par défaut :
|
|
Quand vous lancez le jeu vous devriez noter que la flèche est un peu éteinte
C’est parce que l’image tourne autour de sa partie supérieure gauche au lieu de son centre. Pour fixer ça, nous avons besoin de mettre l’origine au centre de l’image :
|
|
Et maintenant, elle indique correctement notre souris.
Résumé
Nous pouvons faire bouger un objet avec un angle en obtenant le cosinus et le sinus de cet angle. Ensuite nous le déplaçons avec le x et une vitesse multiplié par le cosinus. Idem pour y mais avec le sinus. Nous pouvons calculer la distance entre 2 points en utilisant le théorème de Pythagore. Quand vous utilisez une image vous devriez avoir le centre à droite par défaut. N’oubliez pas de mettre l’origine au centre.