JeuWeb - Crée ton jeu par navigateur
[Truc] Carte, Hexagones et Coordonnées - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Truc] Carte, Hexagones et Coordonnées (/showthread.php?tid=4268)

Pages : 1 2 3 4 5


[Truc] Carte, Hexagones et Coordonnées - Roworll - 15-10-2010

Ca fait quelque temps que j'avance trèèèès lentement sur différents système de carte au format hexagonal.
A l'époque, j'avais déjà parlé d'un système de coordonnées basé sur trois valeurs (x/y/z).
Je profite d'un creux dans mon après midi de boulot pour expliquer rapidement de quoi il en retourne. Je m'excuse par avance de ma méconnaissance du vocabulaire mathématique qui fera certainement défaut dans les explications suivantes. Je laisse aux puristes le soin de rectifier mes approximations linguistiques et syntaxiques.

Le système à trois coordonnées utilise les trois axes d'un hexagone pour le positionner sur la carte. Le plus souvent, on utilise un système de coordonnées x/y pour affecter des coordonnées aux hexagones. En fonction de l'orientation, ça peut donner un truc comme ça.

[Image: hex_xy.jpg]

Rien à dire sur la visualisation mais sur les travaux annexes, c'est plutôt compliqué sans surcharger de tests. De plus, en fonction de la méthode choisie, il sera peut être nécessaire de connaître l'orientation de la carte pour faire les bons calculs.

Par exemple
Comment tracer une ligne d'un hexagone A vers un hexagone B ?
Comment savoir facilement si un ennemi est à portée ?
A quelle distance est un hexagone donné ?
Comment afficher ma carte avec un champ de vision de X hexagones ?

Une solution simple sur j'ai trouvée au détour du net est de passer par ces fameuses triples coordonnées. Les hexagones sont alors référencées de la manière suivante

[Image: hex_xyz.jpg]
[Image: hex_xyz_repere.jpg]

Chaque hexagone est repéré grâce à trois coordonnées (x,y,z).
Si au départ cela semble compliquer un peu les choses, au final, cela s'avère plutôt utile.

Note : En fonction du modèle de représentation des coordonnées choisis, la validité d'un hexagone peut se déterminer selon des formules simples.
Dans le 1er schéma, X+Y-Z doit être égale à 0
Dans le 2e X-Y+Z doit être égale à 0.

Les avantages de cette modélisation sont évidents lorsqu'on doit travailler avec les coordonnées.
Reprenons les questions du début. Dans les exemples suivant, les coordonnées x1/y1/z1 représentent ma position et x2/y2/z2 celle que je veux tester

Comment tracer une ligne d'un hexagone A vers un hexagone B ?
Il suffit de faire évoluer les coordonnées du point de départ vers le point d'arrivée en modifiant à chaque pas les deux plus grand écart en valeur absolue.
Pour aller de 1,1,0 vers -1,3,4
1er Déplacement
L'écart absolu entre [1,1,0] et [-1,3,4] donne [2,2,4]. A supposer que l'on teste dans l'ordre x->y->z, les deux axes a modifier seront x (-1) et z (+1). J'arrive alors en 0,1,1
2e Déplacement
L'écart absolu entre [0,1,1] et [-1,3,4] donne [1,2,3]. Les deux axes a modifier seront y (+1) et z (+1). J'arrive en 0,2,2
3e Déplacement
L'écart absolu entre [0,2,2] et [-1,3,4] donne [1,1,2]. Les deux axes a modifier seront encore une fois x (-1) et z (+1). J'arrive en -1,2,3
etc

Comment savoir facilement si un ennemi est à portée ?
L'ennemi est à portée si le plus grand écart entre ses coordonnées x/y/z et les mienne est inférieur ou égal à ma portée
Code :
max(abs(x1-x2),abs(y1-y2), abs(z1-z2)) <= portée

A quelle distance est un hexagone donné ?
Même formule que précédemment
Code :
max(abs(x1-x2), abs(y1-y2), abs(z1-z2)) = Distance de la cible

Comment afficher ma carte avec un champ de vision de X hexagones ?
Soit V mon rayon de vision, une simple requête SQL me donne le résultat
Code :
SELECT * from carte where
x BETWEEN x1 - V AND x1 + V AND
y BETWEEN y1 - V AND y1 + V AND
z BETWEEN z1 - V AND z1 + V

Bref, cela simplifie largement bon nombre de calculs.

Et pour l'affichage
Étonnamment, c'est aussi très simple.
Pas de décalage à gérer

Dans un affichage avec la pointe de l'hexagone en haut (partie gauche des dessins)
position x = Y * [3/4 Largeur de l'hexagone]
position y = X + Z * [1/2 hauteur de l'hexagone]

Dans un affichage avec un bord en haut, il suffit d'inverser
position x = X + Z * [1/2 largeur de l'hexagone]
position y = Y * [3/4 hauteur de l'hexagone]

Il vous suffit simplement d'appliquer un offset sur ces coordonnées pour bien placer votre carte.



RE: [Truc] Carte, Hexagones et Coordonnées - popayan - 15-10-2010

Juste une erreur dans la partie

SELECT * from carte where
x BETWEEN x1 - V AND x1 + V AND
x BETWEEN x1 - V AND x1 + V AND
x BETWEEN x1 - V AND x1 + V

Sinon, dommage que tu postes ca maintenant, c'est un truc dont j'avais besoin il y a 6mois! Et après quelques recherches, j'en étais arrivé au même résultat Smile


RE: [Truc] Carte, Hexagones et Coordonnées - niahoo - 15-10-2010

Hello, merci pour ça c'est très interessant !

(par contre je tique un peu sur « Note : Les coordonnées d'un hexagone ne sont valide que si X-Y-Z=0. Tout résultat dérogeant à cette règle indique un hexagone invalide, du moins que une représentation 2D. » )


RE: [Truc] Carte, Hexagones et Coordonnées - Ter Rowan - 15-10-2010

(15-10-2010, 04:49 PM)niahoo a écrit : Hello, merci pour ça c'est très interessant !

(par contre je tique un peu sur « Note : Les coordonnées d'un hexagone ne sont valide que si X-Y-Z=0. Tout résultat dérogeant à cette règle indique un hexagone invalide, du moins que une représentation 2D. » )

tout pareil tant pour le merci que pour tic tac toc


RE: [Truc] Carte, Hexagones et Coordonnées - popayan - 15-10-2010

ca me parait simple: la combinaison (1,1,1) n'existe pas ou (2,3,-1) etc...


RE: [Truc] Carte, Hexagones et Coordonnées - Ter Rowan - 16-10-2010

bah non, -2 1 3 ca existe et ca fait pas 0


RE: [Truc] Carte, Hexagones et Coordonnées - popayan - 16-10-2010

en passant par des valeurs absolues, je crois que c'est mieux!


RE: [Truc] Carte, Hexagones et Coordonnées - ToraTora - 03-04-2011

Bonjour tout le monde,

est ce que quelqu'un aurait plus de détails sur cette partie :

Citation :Et pour l'affichage
Étonnamment, c'est aussi très simple.
Pas de décalage à gérer
...
Dans un affichage avec un bord en haut, il suffit d'inverser
position x = X + Z * [1/2 largeur de l'hexagone]
position y = Y * [3/4 hauteur de l'hexagone]

Je ne comprends pas comment afficher correctement ma carte.
Est ce qu'il faut faire 2 boucles For imbriquées ?


Merci pour votre aide ! Smile


RE: [Truc] Carte, Hexagones et Coordonnées - ToraTora - 06-04-2011

Je bloque toujours sur l'affichage,

n'etant pas trop sur de comment faire ça, est ce que quelqu'un pourrait me dire si je suis sur la bonne piste avec ce bout de code ?


for($x = 0; $x < 10; $x++ ){
for($y = 0; $y < 10; $y++){
for($z = 0; $z < 10; $z++){
if (!($x - $y + $z)){
$posX = $x *1.5*$n;
$posY = $y *sin(deg2rad(60))*2*$n + ($x%2)*sin(deg2rad(60))*$n;
print '<div class="tile" style="left: '.$posX.'px; top: '.$posY.'px;">';
print $x.'/'.$y.'/'.$z.'<br />';
print '</div>';
}
}
}
}
Résultat :

[Image: bugpr.png]

Ca ne ressemble pas trop au 1er schéma :p
Merci pour votre aide !


RE: [Truc] Carte, Hexagones et Coordonnées - Roworll - 06-04-2011

En fait, les formules ne sont pas tout a fait completes.
Elles varient selon l'orientation qu'on donne aux différents axes.
J'essayerai de remettre le post original à jour avec de meilleurs explications quand j'aurai le temps.

Dans ton cas, tu peux utiliser le bloc suivant pour la validité des hexagones et la définition des positions X/Y à l'affichage
Code PHP :
<?php 
$hw
=40; // largeur en pixels de l'image de l'hexagone
$hh=35; // hauteur en pixels de l'image de l'hexagone
for($x = 0; $x < 10; $x++ ){
for(
$y = 0; $y < 10; $y++){
for(
$z = 0; $z < 10; $z++){
if ((
$x - $y - $z)==0){
$posX = $y *($hw*(3/4));
$posY = ($z + $x) *($hh/2);
print
'<div class="tile" style="left: '.$posX.'px; top: '.$posY.'px;">';
print
$x.'/'.$y.'/'.$z.'';
print
'</div>';
}
}
}
}