Je reviens sur le étapes qui m’ont amenées à ce résultat.
Le principe de la grille est que quand la souris n’est pas à la position voulue, c’est à dire au dessus du curseur, deux boucles sont lancées pour déplacer le curseur sur tout l’écran (on peut en faire qu’une seule mais je m’y perd à chaque foi).
Ici, les tuiles font 32×32 et le point chaud est au centre. De par leur forme hexagonales, on considère que ce sont des tuiles rectangulaires de 32×16. Pour comprendre comment placer une tuile sur une grille allez voire les explications de Kloug, il explique ça très bien.
La particularité ici, c’est qu’il faut décaler les tuiles une ligne sur deux. Pour savoir si une ligne est paire ou impaire on fait
n mod 2, si le résultat est 1 c’est que n est impaire.
Il suffirait alors d’arrêter les boucles quand la souris est de nouveau au dessus du curseur, mais ça ne marche pas dans une boucle. Dans mon premier exemple, j’ai utilisé la distance entre la position de la tuile (son centre) et celle de la souris. Ça fonctionne relativement bien, mais c’est pas bien précis.
Calculer une zone de collision pour un carré est simple, mais pour un hexagone c’est déjà plus compliqué. Un carré… ok, partons d’un carré.
Prenons un carré penché à 45° inscrit dans une tuile de 32×32. En comptant en horizontal puis en vertical, tous les points de ce carré sont à 32 pixels ou moins par rapport au centre.
Si on étire ce carré pour faire un losange de 64×32 et en comptant 2× en vertical, tous les points sont à 64 pixels ou moins par rapport au centre.
Maintenant si on ajoute une condition qui compte seulement en horizontal, on retrouve notre hexagone du départ.