Bonjour à tous,
Après plusieurs heure de recherche, j'ai finis par aboutir à une formule qui permet d'afficher et de retrouver la tile sur laquelle on clique, peu importe la forme de notre tile (du moment que c'est en iso 2D).
Je suis partis de la formule d'affichage suivante:
Qui permet pour chaque tile de l'afficher sur l'écran.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 int x = 0; int y = 0; while (y < _Height) { x = 0; while (x < _Width) { _Map[y][x].setPosition((x * _CaseWidth) - (y * _CaseWidth), (y * _CaseHeight) + (x * _CaseHeight)); x++; } y++; }
L'important est le _CaseWidth et _CaseHeight qui correspondent à :
_ La distance entre le pixel 0 et le premier pixel de couleur horizontal
_ La distance entre le pixel 0 et le premier pixel de couleur vertical
En schématisant avec une tile comme ceci:
O est le pixel 0, C un pixel de couleur, A un pixel transparent.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 OAAAACAAAAA AAAACCCAAAA AACCCCCCCAA CCCCCCCCCCC AACCCCCCCAA AAAACCCAAAA AAAAACAAAAA
on calcul donc _CaseWidth = Cx-Ox et _CaseHeight = Cy-Oy en prenant pour C le premier pixel rencontré selon l'axe.
à partir de là, j'ai réussi à trouver la formule suivante qui permet de retrouver les coordonnée map à partir des coordonnée écran:
Cette méthode me permet de ne pas utilisé le rapport entre x et y (régulièrement x = 2y en 2D isométrique), de ne pas m'inquiéter de l'angle de transformation des tiles, de la taille de l'image (des fois les tiles ont un background en dessous comme l'image ci-dessous) .......
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 // calcul des coordonnée flottante à partir du point cliqué (x,y) float casey = (((y*CaseWidth)/CaseHeight)-x)/(CaseWidth+CaseWidth); float casex = ((casey*CaseWidth+x)/CaseWidth) - 1; // approximation des coordonnée flottante int vx = casex + 0.5; int vy = casey + 0.5;
Ayant passé de longues heures de recherches sur internet et de calcul sur papier, je me devais de partager ce travail afin de le soumettre à la communauté pour en explorer les limites.
Je me doute bien que ce travaille a déjà du être fait, mais partout, j'ai trouvé des formule à partir du cosinus et sinus de l'angle de transformation.
Merci de m'avoir lu, et n'hésité pas à commenter et/ou tester.
Je suis actuellement en train de le tester et le transformer afin d'avoir une meilleur rapidité d’exécution et précision.
Partager