Ajout d'un visualisateur de tuiles restantes

This commit is contained in:
2024-12-04 14:48:07 +01:00
parent 5a9ecd2da0
commit 788bcfe6f9
3 changed files with 103 additions and 1 deletions

View File

@@ -58,7 +58,7 @@ public class Options {
public static boolean AUTO_FOCUS = false; 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; public static boolean FULL_SCREEN = false;

View File

@@ -49,6 +49,8 @@ public class Board extends JPanel{
private ScoreManager scoreManager; private ScoreManager scoreManager;
private int currentScore; private int currentScore;
private Database database; private Database database;
private RemainingTilesIndicator remainingTilesIndicator;
// Constructeur avec seed // Constructeur avec seed
public Board(JFrame gameFrame, long seed) { public Board(JFrame gameFrame, long seed) {
@@ -85,6 +87,8 @@ public class Board extends JPanel{
gameFrame.addKeyListener(new PauseGame(gameFrame, game)); gameFrame.addKeyListener(new PauseGame(gameFrame, game));
gameFrame.setFocusable(true); gameFrame.setFocusable(true);
this.remainingTilesIndicator = new RemainingTilesIndicator(Options.MAX_TILE_NUMBER);
this.addMouseMotionListener(new MouseMotionAdapter() { this.addMouseMotionListener(new MouseMotionAdapter() {
@Override @Override
public void mouseMoved(java.awt.event.MouseEvent e) { public void mouseMoved(java.awt.event.MouseEvent e) {
@@ -322,6 +326,8 @@ public class Board extends JPanel{
if (tiles.size() < Options.MAX_TILE_NUMBER) { if (tiles.size() < Options.MAX_TILE_NUMBER) {
// Vérifiez si la nextTile existe, sinon on ignore // Vérifiez si la nextTile existe, sinon on ignore
if (nextTile != null) { if (nextTile != null) {
remainingTilesIndicator.setRemainingTiles(Options.MAX_TILE_NUMBER - tiles.size());
// Place la nextTile à la position choisie // Place la nextTile à la position choisie
nextTile.setPosition(position.x, position.y); nextTile.setPosition(position.x, position.y);
addTile(nextTile); // Ajoute la nextTile au tableau des tuiles 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) // Dessiner la nextTile à sa position d'origine (0,0)
nextTile.drawTileAt(g, nextTileX, nextTileY, 1f); 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.) // Rétablir les transformations pour les autres éléments (tuiles existantes, etc.)
g2d.translate(offsetX / zoomFactor, offsetY / zoomFactor); // Re-appliquer le décalage g2d.translate(offsetX / zoomFactor, offsetY / zoomFactor); // Re-appliquer le décalage
g2d.scale(zoomFactor, zoomFactor); // Re-appliquer le zoom g2d.scale(zoomFactor, zoomFactor); // Re-appliquer le zoom

View File

@@ -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;
}
}