import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class GameView extends JFrame { private Board board; private int hexRadius = 30; // Rayon du grand hexagone // Dimensions calculées des hexagones private int hexWidth = (int) (1.5 * hexRadius); // Largeur de l'hexagone private int hexHeight = (int) (Math.sqrt(3) * hexRadius); // Hauteur de l'hexagone public GameView(Board board) { this.board = board; setTitle("Dorfromantik - Plateau"); setSize(800, 800); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); // Gestion des clics de souris pour placer une tuile addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { handleMouseClick(e.getX(), e.getY()); } }); } public void showBoard() { setVisible(true); repaint(); } @Override public void paint(Graphics g) { super.paint(g); Graphics2D g2d = (Graphics2D) g; // Dessiner toutes les tuiles du plateau for (Point position : board.getTiles().keySet()) { Tile tile = board.getTile(position); drawLargeHexagon(g2d, position.x, position.y, tile); } } private void drawLargeHexagon(Graphics2D g2d, int centerX, int centerY, Tile tile) { // Couleurs des triangles Color color1 = getColorForTerrain(tile.getTerrain()); Color color2 = color1.darker(); // Variante plus sombre pour contraste // Dessiner les 6 triangles pour former l'hexagone for (int i = 0; i < 6; i++) { // Dessiner chaque triangle équilatéral avec sa couleur associée drawTriangle(g2d, centerX, centerY, i, hexRadius, i % 2 == 0 ? color1 : color2); } } private void drawTriangle(Graphics2D g2d, int centerX, int centerY, int triangleIndex, int radius, Color color) { // Orientation de chaque triangle (décalage de 60° par rapport à chaque triangle) double angle = Math.toRadians(60 * triangleIndex); // Calcul des points de chaque triangle autour du centre du grand hexagone int x1 = centerX + (int) (Math.cos(angle) * radius); int y1 = centerY + (int) (Math.sin(angle) * radius); int x2 = centerX + (int) (Math.cos(angle + Math.toRadians(60)) * radius); int y2 = centerY + (int) (Math.sin(angle + Math.toRadians(60)) * radius); int x3 = centerX + (int) (Math.cos(angle + Math.toRadians(120)) * radius); int y3 = centerY + (int) (Math.sin(angle + Math.toRadians(120)) * radius); // Créer un polygone pour dessiner le triangle Polygon triangle = new Polygon(); triangle.addPoint(centerX, centerY); // Centre de l'hexagone triangle.addPoint(x1, y1); // Premier sommet triangle.addPoint(x2, y2); // Deuxième sommet triangle.addPoint(x3, y3); // Troisième sommet // Remplir le triangle avec la couleur g2d.setColor(color); g2d.fillPolygon(triangle); } private Color getColorForTerrain(Terrain terrain) { switch (terrain) { case MER: return Color.BLUE; case CHAMP: return Color.YELLOW; case PRE: return Color.GREEN; case FORET: return new Color(34, 139, 34); // Vert foncé case MONTAGNE: return Color.GRAY; default: return Color.WHITE; } } private void handleMouseClick(int mouseX, int mouseY) { // Calcul des coordonnées de la grille de manière à respecter la structure hexagonale // Calcul de la colonne et de la ligne en fonction de la taille des hexagones int gridX = (int) (mouseX / (hexWidth * 0.75)); // Calcul de la colonne // Calcul de la ligne en fonction de la hauteur des hexagones int gridY = (int) (mouseY / hexHeight); // Calcul de la ligne // Détecter si c'est une rangée paire ou impaire et appliquer un décalage if (gridY % 2 != 0) { // Si la ligne est impaire gridX += 1; // Décalage horizontal pour les rangées impaires } // Calculer les coordonnées X et Y en pixels int finalX = (int) (gridX * hexWidth * 0.75); // Calcul des coordonnées X int finalY = gridY * hexHeight; // Calcul des coordonnées Y // Créer un objet Point avec les coordonnées finales Point position = new Point(finalX, finalY); // Vérifier si la position est déjà occupée par une autre tuile if (!board.isPositionOccupied(position)) { // Créer une nouvelle tuile (ici, une tuile de forêt) Tile newTile = new Tile(Terrain.FORET); // Ajouter la tuile sur le plateau board.addTile(position, newTile); // Rafraîchir l'affichage repaint(); } } }