From 788bcfe6f913e32caeb0f28ddfc0501d577ed11a Mon Sep 17 00:00:00 2001 From: Moncef STITI Date: Wed, 4 Dec 2024 14:48:07 +0100 Subject: [PATCH] Ajout d'un visualisateur de tuiles restantes --- src/fr/monkhanny/dorfromantik/Options.java | 2 +- src/fr/monkhanny/dorfromantik/game/Board.java | 11 +++ .../game/RemainingTilesIndicator.java | 91 +++++++++++++++++++ 3 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 src/fr/monkhanny/dorfromantik/game/RemainingTilesIndicator.java diff --git a/src/fr/monkhanny/dorfromantik/Options.java b/src/fr/monkhanny/dorfromantik/Options.java index a85cf05..ccf5aaa 100644 --- a/src/fr/monkhanny/dorfromantik/Options.java +++ b/src/fr/monkhanny/dorfromantik/Options.java @@ -58,7 +58,7 @@ public class Options { public static boolean AUTO_FOCUS = false; - public static final int MAX_TILE_NUMBER = 5; + public static final int MAX_TILE_NUMBER = 50; public static boolean FULL_SCREEN = false; diff --git a/src/fr/monkhanny/dorfromantik/game/Board.java b/src/fr/monkhanny/dorfromantik/game/Board.java index 2a7537c..c2b4409 100644 --- a/src/fr/monkhanny/dorfromantik/game/Board.java +++ b/src/fr/monkhanny/dorfromantik/game/Board.java @@ -49,6 +49,8 @@ public class Board extends JPanel{ private ScoreManager scoreManager; private int currentScore; private Database database; + private RemainingTilesIndicator remainingTilesIndicator; + // Constructeur avec seed public Board(JFrame gameFrame, long seed) { @@ -85,6 +87,8 @@ public class Board extends JPanel{ gameFrame.addKeyListener(new PauseGame(gameFrame, game)); gameFrame.setFocusable(true); + this.remainingTilesIndicator = new RemainingTilesIndicator(Options.MAX_TILE_NUMBER); + this.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved(java.awt.event.MouseEvent e) { @@ -322,6 +326,8 @@ public class Board extends JPanel{ if (tiles.size() < Options.MAX_TILE_NUMBER) { // Vérifiez si la nextTile existe, sinon on ignore if (nextTile != null) { + remainingTilesIndicator.setRemainingTiles(Options.MAX_TILE_NUMBER - tiles.size()); + // Place la nextTile à la position choisie nextTile.setPosition(position.x, position.y); addTile(nextTile); // Ajoute la nextTile au tableau des tuiles @@ -456,6 +462,11 @@ public class Board extends JPanel{ // Dessiner la nextTile à sa position d'origine (0,0) nextTile.drawTileAt(g, nextTileX, nextTileY, 1f); + int indicatorX = getWidth() - 70; // Position x de l'indicateur + int indicatorY = getHeight() - 670; // Positionner la pile près du bas + + remainingTilesIndicator.draw(g2d, indicatorX, indicatorY); + // Rétablir les transformations pour les autres éléments (tuiles existantes, etc.) g2d.translate(offsetX / zoomFactor, offsetY / zoomFactor); // Re-appliquer le décalage g2d.scale(zoomFactor, zoomFactor); // Re-appliquer le zoom diff --git a/src/fr/monkhanny/dorfromantik/game/RemainingTilesIndicator.java b/src/fr/monkhanny/dorfromantik/game/RemainingTilesIndicator.java new file mode 100644 index 0000000..0bbcda1 --- /dev/null +++ b/src/fr/monkhanny/dorfromantik/game/RemainingTilesIndicator.java @@ -0,0 +1,91 @@ +package fr.monkhanny.dorfromantik.game; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Polygon; +import java.awt.RenderingHints; +import java.awt.RadialGradientPaint; + +public class RemainingTilesIndicator { + private int remainingTiles; + private int maxTiles; + private final int maxHeight; + + public RemainingTilesIndicator(int maxTiles) { + this.maxTiles = maxTiles; + this.remainingTiles = maxTiles; + this.maxHeight = 0; + } + + public void setRemainingTiles(int remainingTiles) { + this.remainingTiles = Math.max(0, Math.min(remainingTiles, maxTiles)); + } + + public void draw(Graphics g, int x, int y) { + Graphics2D g2d = (Graphics2D) g; + int tileWidth = 50; // Largeur de l'assiette + int tileHeight = 12; // Hauteur de l'assiette + int gap = 1; // Écart entre les tuiles + + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setStroke(new BasicStroke(2)); // Appliquer un contour légèrement plus épais + + // Calcul de la hauteur totale de la pile + int totalHeight = maxTiles * (tileHeight + gap); + + // Dessiner chaque hexagone, à partir du bas de la fenêtre + for (int i = 0; i < remainingTiles; i++) { + int currentY = y + (maxTiles - remainingTiles + i) * (tileHeight + gap); // Positionnement fixe + + Polygon polygon = createHexagon(x, currentY, tileWidth, tileHeight); // Créer un hexagone + + // Appliquer un dégradé radial avec des couleurs bleu moyen et plus foncé + RadialGradientPaint gradient = new RadialGradientPaint( + x + tileWidth / 2, currentY + tileHeight / 2, tileWidth / 2, + new float[]{0.0f, 1.0f}, new Color[]{new Color(70, 130, 180), new Color(30, 60, 100)} // Bleu moyen au bleu foncé + ); + g2d.setPaint(gradient); + g2d.fillPolygon(polygon); // Remplir avec le dégradé + + // Contour solide autour de l'hexagone, en bleu foncé + g2d.setColor(new Color(10, 30, 60)); // Contour bleu foncé + g2d.drawPolygon(polygon); // Dessiner le contour + } + + // Affichage du nombre de tuiles restantes en haut de la pile + g2d.setColor(Color.BLACK); // Couleur du texte + g2d.setFont(g2d.getFont().deriveFont(22f)); // Taille de la police + String text = String.valueOf(remainingTiles); // Nombre de tuiles restantes + int textWidth = g2d.getFontMetrics().stringWidth(text); // Largeur du texte + int textX = x + (tileWidth - textWidth) / 2; // Centrer le texte horizontalement + int textY = y + (maxTiles - remainingTiles) * (tileHeight + gap) - 10; // Position juste au-dessus du premier hexagone + + g2d.drawString(text, textX, textY); // Dessiner le texte + + g2d.dispose(); + } + + public int getTotalHeight() { + int tileHeight = 12; // Hauteur de l'assiette + int gap = 1; // Espace entre les tuiles + return remainingTiles * (tileHeight + gap); + } + + + // Méthode pour créer un hexagone + private Polygon createHexagon(int x, int y, int width, int height) { + Polygon hexagon = new Polygon(); + + // Calcul des 6 points de l'hexagone + hexagon.addPoint(x, y); // Point gauche supérieur + hexagon.addPoint(x + width / 2, y - height / 2); // Point supérieur central + hexagon.addPoint(x + width, y); // Point droit supérieur + hexagon.addPoint(x + width, y + height); // Point droit inférieur + hexagon.addPoint(x + width / 2, y + height + height / 2); // Point inférieur central + hexagon.addPoint(x, y + height); // Point gauche inférieur + + return hexagon; + } +}