08-06-2007, 02:29 PM
khiguard, si tu parviens à trouver un moteur de placement générique (c'est à dire avec une dimension de tuiles dynamiques et pas fonction de la taille de tes images) de tuiles hexa EN 3D ISO sans utiliser la trigo, je suis preneur C'est faisable si tu utilise des tailles fixes. Mais pas autrement, je crois (et ici, je rappelle que l'objectif était d'expliquer la logique du placement des tuiles, pas de donner un code tout fait. Personnellement, si j'utilisais la 3Diso avec des hexotuiles, je n'utiliserais pas non plus de trigo dans mes calculs de placement, même avec du zoom car il serait plus rapide d'utiliser des coef de grossissement mais il faut impérativement savoir comment ça marche). Si en parlant de moteur simple, tu penses à la 2D, c'est vrai que ça marche nickel. Mais la principale difficulté d'une carte composée d'hexotuiles isométriques n'est pas vraiment leur forme hexagonale, mais surtout l'isométrie qui complique considérablement les calculs (on a des positions négatives en abscisses, par exemple).
Personnellement, j'ai aussi raisonné en lignes et en colonnes. Après, il faut simplement tenir compte de l'aspect crénelé d'une carte hexagonale (en 2D ou en 3D iso) et donc décaler une tuile sur deux (en iso, celà revient à affecter un coef de décalage au côté dentelé).
Teclis, je ne capte pas bien pourquoi tu veux absolument laisser toutes les numéros de ligne et de colonne à 0 . Je rappelle ma formule (sans le décalage correctif pour placer la carte au centre, pour ne pas compliquer, c'est à dire qu'ici, la moitié de la carte sera à gauche de l'axe vertical ayant pour abscisse 0) :
posX et posY correspondent aux positions absolues des images de tuiles en pixels (c'est à dire des rectangle dont l'origine est en haut à gauche).
X et Y sont les numéros respectifs des lignes et colonnes, commencés à 0 (en gros, c'est tes variables j et i dans ta boucle).
n, enfin, est la longueur d'un côté en vue de dessus (2D), sachant que tous les côtés sont égaux (si tu observes bien mes schémas, tu ne peux pas le louper). CETTE VALEUR RESTE LA MEME LORSQUE LA FIGURE SUBI LA TRANSFORMATION ISO. C'est une valeur théorique qui suppose d'utiliser la trigonométrie mais on peut simplifier les calculs.
ici, n vaut 20.
Donc, première tuile de la première ligne :
X = 0, Y = 0.
posX = 0
posY = 0
la deuxième tuile de la première ligne
X = 1, Y = 0.
posX = 8.96
posY = 16.92
Et ainsi de suite... (je ne vais pas tout faire, parce que j'ai fait le truc à la calculette (donc, si il y a une erreur, c'est manuel). Mais ça a l'air logique.
Et pour ceux qui n'aiment pas la trigo, voilà ce que peut donner ma formule un peu dégraissée, avec une base n=20.
posX = X*33.5 - (Y+arrondi.sup(X/2))*24.5
posY = (Y+arrondi.sup(X/2))*12.2 + X*4.7
C'est tout de suite vachement moins indigeste, comme ça... (h) Mais c'est légèrement plus imprécis, évidemment.
Pour X=1 et Y=0, on a donc :
posX = 9
posY = 16.9
@+
Personnellement, j'ai aussi raisonné en lignes et en colonnes. Après, il faut simplement tenir compte de l'aspect crénelé d'une carte hexagonale (en 2D ou en 3D iso) et donc décaler une tuile sur deux (en iso, celà revient à affecter un coef de décalage au côté dentelé).
Teclis, je ne capte pas bien pourquoi tu veux absolument laisser toutes les numéros de ligne et de colonne à 0 . Je rappelle ma formule (sans le décalage correctif pour placer la carte au centre, pour ne pas compliquer, c'est à dire qu'ici, la moitié de la carte sera à gauche de l'axe vertical ayant pour abscisse 0) :
Code :
posX = X*(sin(75)+sin(45))*n - (Y+arrondi.sup(X/2))*(sin(15) + sin(75))*n
posY = (Y+arrondi.sup(X/2))*(sin(75)+sin(15))*n/2 + X*sin(13.5)*n
X et Y sont les numéros respectifs des lignes et colonnes, commencés à 0 (en gros, c'est tes variables j et i dans ta boucle).
n, enfin, est la longueur d'un côté en vue de dessus (2D), sachant que tous les côtés sont égaux (si tu observes bien mes schémas, tu ne peux pas le louper). CETTE VALEUR RESTE LA MEME LORSQUE LA FIGURE SUBI LA TRANSFORMATION ISO. C'est une valeur théorique qui suppose d'utiliser la trigonométrie mais on peut simplifier les calculs.
ici, n vaut 20.
Donc, première tuile de la première ligne :
X = 0, Y = 0.
posX = 0
posY = 0
la deuxième tuile de la première ligne
X = 1, Y = 0.
posX = 8.96
posY = 16.92
Et ainsi de suite... (je ne vais pas tout faire, parce que j'ai fait le truc à la calculette (donc, si il y a une erreur, c'est manuel). Mais ça a l'air logique.
Et pour ceux qui n'aiment pas la trigo, voilà ce que peut donner ma formule un peu dégraissée, avec une base n=20.
posX = X*33.5 - (Y+arrondi.sup(X/2))*24.5
posY = (Y+arrondi.sup(X/2))*12.2 + X*4.7
C'est tout de suite vachement moins indigeste, comme ça... (h) Mais c'est légèrement plus imprécis, évidemment.
Pour X=1 et Y=0, on a donc :
posX = 9
posY = 16.9
@+