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.