Découvrir dans quelle tuile un clic de souris a atterri


9

Je travaille sur un jeu basé sur une grille isométrique et je rencontre un problème en essayant de lier un clic de souris de l'utilisateur à une tuile. J'ai pu diviser le problème en 2 parties:

  • Trouver un rectangle qui entoure une tuile (ce que j'ai pu faire)
  • Déterminer à partir du rectangle sur lequel le cliquet a atterri

Voici un exemple de rectangle avec des tuiles à l'intérieur:

Rectangle contenant des tuiles

Le rectangle mesure 70 pixels de long et 30 pixels de haut, donc si j'utilise une entrée disons 30x (haut) / 20y (gauche), comment pourrais-je déterminer la tuile dans laquelle il est tombé?



Qu'en est-il d'un changement de coordonnées puis d'un contrôle? Si votre tuile où des tranches d'anneau, vous utiliseriez sûrement un système de coordonnées polaires.
— FxIII

Réponses:


8

Pour chaque étape que vous effectuez dans la direction x, vous vous déplacerez de 35 pixels vers la gauche et de -15 pixels vers votre toile;

Pour chaque étape que vous effectuez dans la direction y, vous vous déplacerez de -35 px à gauche et de -15 px jusqu'à votre toile;

tuile à cartésien

Cela signifie que vous pouvez convertir facilement votre système de coordonnées en pixels:

(x, y) => (35 · x, -15 · x) + (-35 · y, -15 · y) = (35 · x - 35 · y, -15 · x - 15 · y) = ( Xpx, Ypx)

Vous devez résoudre le problème inverse que vous connaissez Xpx et Ypx et que vous voulez connaître x et y (en coordonnées de mosaïque).

Xpx = 35 · x - 35 · y;

Ypx = -15 · x - 15 · y;

pouvez-vous résoudre ce problème?

x = 1/70 · Xpx - 1/30 · Ypx

y = -1 / 70 · Xpx - 1/30 · Ypx

Évidemment, vous aurez des valeurs non entières dans le cas général: prendre le plafond de x et y vous donnera les coordonnées de la tuile entière.


le rectangle mesure 70 pixels de long, puis le pas est de 35 pixels et non de 30 pixels (en horizontal)
— CeeJay
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.