Comment faire un plateau hexagonale ?

oberown Messages postés 88 Date d'inscription mercredi 10 mars 2004 Statut Membre Dernière intervention 5 juillet 2005 - 23 juin 2004 à 23:15
Pratana Messages postés 77 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 19 avril 2018 - 15 nov. 2004 à 21:35
Dans les jeux de type wargame souvent les cases sont de forme hexagonale (6 côtés).
Quand on créé un plateau style damier, ou échiquier les cases sont des carrés, et on utilise un tableau deux dimensions.

Comment fait-on pour faire un plateau héxagonal en code ?

Sachant qu'il existe six directions devant, derriere, devant droite, devant gauche, arriere droit, arriere gauche.

Quand on fait un damier, c'est tres simple de se déplacer.
Comment bien modéliser et faire des déplacement dans une carte à hexagone ?

Exemple d'hexagone

Merci pour tous

4 réponses

Pratana Messages postés 77 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 19 avril 2018
15 nov. 2004 à 21:11
voici comment je fais y a peu etre mieux (surement)

* j'utilise une image 96*96 pixel d'un hexagone (cest facile) pour les cases. de préférence en GIF car ca gere la couleure transparente.
* j'utilise un tableau de toute cases avec des variable comme : locX et locY (les coordonnées) et posX et posY pour la distance en pixel pour le positionnement sur le bord de l'écran
la carte est pré calculé :

//charger la carte
nbCase =  -1;
//rentrer les coordonnées des cases
maxX = 16;
maxY = 8; 	// ! ne pas oublier de mettre des nombres pair pour la hauteur !
for (int i=0; i < maxY; i++)
{
   for (int j=0; j < maxX; j++)
     {

nbCase++;
Plateau[nbCase].locX = i;
Plateau[nbCase].locY = j;
plateau[nbCase].posY = 32 + (locY * 32);
plateau[nbCase].posX = 8 + (locX * 96) + (locY % 2) * 48;

  }
}


ps : le signe % c'est le modulo

--------------------------
Pour retrouver la case de destination, il faut connaitre la case de départ et savoir la direction. maxX et maxY sont les dimension de votre carte. METTEZ DES VALEURES PAIR car pour des valeure impaire, ceci ne marche plus. un malin pourra changer le code:

public int getPosition(int pos, int dir)
{
//retrouve le numero de la case d'arrivée suivant la case de départ et la direction
//retourne -1 si on ne peut pas se deplacer dans cette direction
int maxCase = maxX * maxY;
int a = pos;
switch (dir)
{
case 1:	//nord-est
//System.out.println("nord-est");
a = pos - 1 + (pos % 2) * maxY * 2 ;
if( pos % (maxY * 2) == 0 ){return -1;}
break;
case 2:	//sud-est
//System.out.println("sud-est");
a = pos + 1 + (pos % 2) * maxY * 2 ;
if( (pos + 1) % (maxY * 2) == 0 ){return -1;}
break;
case 3:	//sud
//System.out.println("sud");
a = pos + 2;
if( (pos + 1) % (maxY * 2) == 0){return -1;	}
if( (pos + 2) % (maxY * 2) == 0){return -1;	}
break;
case 4:	//sud-ouest
//System.out.println("sud-ouest");
a = pos  - (Math.abs(pos - 1) % 2) * maxY * 2 ;
if( (pos + 1) % (maxY * 2) == 0){return -1;	}
break;
case 5:	//nord-ouest
//System.out.println("nord-ouest");
a = pos  - (Math.abs(pos - 1) % 2) * maxY * 2 ;
if( pos % (maxY * 2) == 0){return -1;	}
break;
case 6:	//nord
//System.out.println("nord");
a = pos - 2;
if( pos % (maxY * 2) == 0){return -1;	}
if( (pos - 1) % (maxY * 2) == 0){return -1;	}
break;
}
if( a >= 0 && a < maxCase){return a;}	//si le calcul dépassse le total de case
return -1;
}

cela doit retourner le numéro de la case d'arrivée.

-----------------------------------------------------------
Pour savoir par contre ou on est si on clic sur la carte, c'est un peu plus compliqué mais j'utilise une astuce de mon cru :
écoutez bien j'en suis trés fier :

je fais le calcul de toutes les distances des centres des l'héxagones de chaque case avec les coordonnées de l'endroit ou l'on clique sur l'écran (bien sur par rapport à l'origine de la carte et pas de l'écran). puis je classe le tableau de ces distances par ordre croissant et je prend la distance la plus courte. Ce qui me permet de savoir sur quel case je suis.
en fait cela a l'énorme avantage de savoir aussi si je clique sur le contour d'une case !
dans l'image on voit "colons de cathane" qui utilise les intersections des cases et pas vraiment le centre. avec mon astuce c'est trés facile de savoir si je clique sur l'intersection des hexagones car si je prend les 2 distances les plus courtes, cela signifie que je clique entre ces 2 hexagnes. on peut meme savoir si on clique sur les 3 hexagones ou sur aucune case car si la distance la plus courte dépasse de 1,5 x le rayon de l'hexagone.
c'est compliqué, hein?
la distance de 2 points c'est évidement :
racine ( (x1 - x2)carré + (Y1 - Y2)carré )

je peux vous montrer des codes sinons mais cest en VB !

----------------------------
reste à afficher la carte :
passer en revu le tableau des hexagones et imprimer l'image suivant les coordonnées locX et locY déja pré-calculé, pour peu qu'on gère la transparence, cela ne pose pas de probleme.
peignez dans l'ordre et ca devrait se chevaucher sans probleme.

personnelement jai noté :
direction = 1 nord-est
direction = 2 sud est
direction = 3 sud
direction = 4 sud ouest
direction = 5 nord ouest
direction = 6 nord
sinon tu codes autrement.

NOTE : ESCUSEZ MOI C'EST DU JAVA, mais convertir en C devrais pas etre trop difficile !
j'epere avoir été clair (mais je crois pas) bonne chance
---------------------------------------
C est pas une balle dans le bras qui me fera plier le genou...
0
Pratana Messages postés 77 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 19 avril 2018
15 nov. 2004 à 21:34
voici ce que ca peut donner et comment cest calculé
0
Pratana Messages postés 77 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 19 avril 2018
15 nov. 2004 à 21:35
je réésaye
0
Pratana Messages postés 77 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 19 avril 2018
15 nov. 2004 à 21:35
c'est loupé pour l'image, désolé !
-----------------------------------------------------------
C est pas une balle dans le bras qui me fera plier le genou...
0
Rejoignez-nous