diff --git a/src/fr/monkhanny/dorfromantik/game/Board.java b/src/fr/monkhanny/dorfromantik/game/Board.java index 9e2c482..561ea36 100644 --- a/src/fr/monkhanny/dorfromantik/game/Board.java +++ b/src/fr/monkhanny/dorfromantik/game/Board.java @@ -49,6 +49,7 @@ public class Board extends JPanel{ private int currentScore; private Database database; private RemainingTilesIndicator remainingTilesIndicator; + private ScoreDisplay scoreDisplay; // Constructeur avec seed @@ -61,6 +62,8 @@ public class Board extends JPanel{ this.game = new Game(seed); this.scoreManager = new ScoreManager(biomeGroups); + Font scoreFont = Fonts.SCORE.getFont(30f); // Remplacez par votre logique de chargement de police + scoreDisplay = new ScoreDisplay(scoreFont, 0, 40); // Position fixe for (Biome biome : Biome.values()) { biomeGroups.put(biome, new BiomeGroup()); @@ -137,45 +140,49 @@ public class Board extends JPanel{ if (Options.isPaused) { return; } - - // Calculer les dimensions totales du plateau (largeur et hauteur des tuiles) - int totalWidth = 0; - int totalHeight = 0; - - // Calculer la largeur et la hauteur totale de toutes les tuiles + + // Calculer les limites du plateau (minX, minY, maxX, maxY) + int minX = Integer.MAX_VALUE; + int minY = Integer.MAX_VALUE; + int maxX = Integer.MIN_VALUE; + int maxY = Integer.MIN_VALUE; + for (Tile tile : tiles) { - totalWidth = Math.max(totalWidth, tile.getXCoord() + tile.getRadius()); - totalHeight = Math.max(totalHeight, tile.getYCoord() + tile.getRadius()); + minX = Math.min(minX, tile.getXCoord() - tile.getRadius()); + minY = Math.min(minY, tile.getYCoord() - tile.getRadius()); + maxX = Math.max(maxX, tile.getXCoord() + tile.getRadius()); + maxY = Math.max(maxY, tile.getYCoord() + tile.getRadius()); } - - // Ajouter une petite marge pour les bords - totalWidth += 50; // Marge pour éviter que les tuiles ne soient collées au bord - totalHeight += 50; // Marge pour éviter que les tuiles ne soient collées au bord - - // Calculer le facteur de zoom pour que toutes les tuiles tiennent sur l'écran + + // Ajouter une marge aux dimensions calculées + int margin = 50; + minX -= margin; + minY -= margin; + maxX += margin; + maxY += margin; + + // Calculer les dimensions totales avec la marge + int totalWidth = maxX - minX; + int totalHeight = maxY - minY; + + // Calculer le facteur de zoom pour que tout tienne dans la fenêtre double horizontalZoom = (double) getWidth() / totalWidth; double verticalZoom = (double) getHeight() / totalHeight; - - // Choisir le zoom le plus petit pour éviter que les tuiles ne sortent de l'écran + + // Choisir le plus petit facteur de zoom pour s'assurer que tout est visible zoomFactor = Math.min(horizontalZoom, verticalZoom); - - // Ajuster les offsets pour centrer les tuiles après le dézoom - adjustOffsets(totalWidth, totalHeight); - - // Recalculer les positions disponibles et redessiner le plateau + + // Ajuster les offsets pour centrer les tuiles + int centerX = minX + totalWidth / 2; + int centerY = minY + totalHeight / 2; + + offsetX = getWidth() / 2 - (int) (centerX * zoomFactor); + offsetY = getHeight() / 2 - (int) (centerY * zoomFactor); + + // Redessiner le plateau avec les nouveaux paramètres repaint(); } - private void adjustOffsets(int totalWidth, int totalHeight) { - // Calculer les décalages nécessaires pour centrer le plateau - int targetOffsetX = (int) ((getWidth() - totalWidth * zoomFactor) / 2); - int targetOffsetY = (int) ((getHeight() - totalHeight * zoomFactor) / 2); - - // Appliquer les nouveaux offsets - setOffsetX(targetOffsetX); - setOffsetY(targetOffsetY); - } - public void handleMouseClick(java.awt.event.MouseEvent e) { if (Options.isPaused) { @@ -255,6 +262,7 @@ public class Board extends JPanel{ return false; } + // Vérifie si deux tuiles sont connectées par un même biome private boolean areTilesConnected(Tile tile1, Tile tile2) { for (TileOrientation orientation : TileOrientation.values()) { @@ -270,6 +278,7 @@ public class Board extends JPanel{ private void calculateCurrentScore() { scoreManager.updateScore(); // Met à jour le score currentScore = scoreManager.getCurrentScore(); // Récupère le score actuel + scoreDisplay.setScore(currentScore); // Met à jour l'affichage du score } public int getCurrentScore() { @@ -421,6 +430,11 @@ public class Board extends JPanel{ super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; + int scoreX = (getWidth() - 110) / 2; + scoreDisplay.setPosition(scoreX, 40); + + scoreDisplay.draw(g); + // Appliquer l'échelle de zoom et le déplacement g2d.scale(zoomFactor, zoomFactor); // Appliquer le zoom g2d.translate(offsetX / zoomFactor, offsetY / zoomFactor); // Appliquer le déplacement (en tenant compte du zoom) @@ -449,18 +463,6 @@ public class Board extends JPanel{ g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f)); // Rétablir l'opacité } - // Obtenez la police SCORE avec une taille ajustée (par exemple, 30 points) - Font scoreFont = Fonts.SCORE.getFont(30f); // Vous pouvez ajuster la taille ici - g.setFont(scoreFont); - - // Calculer la position du score (avec zoom et décalage) - g.setColor(Color.BLACK); - int scoreX = (int) ((getWidth() / (2 * zoomFactor) - offsetX / zoomFactor) - 20); - int scoreY = (int) (40 / zoomFactor - offsetY / zoomFactor); - - // Dessiner le texte du score - g.drawString("Score : " + currentScore, scoreX, scoreY); - if (nextTile != null) { // Calculer la position correcte de la nextTile (en tenant compte du zoom et des décalages) int nextTileX = 0; // Position x dans l'espace global diff --git a/src/fr/monkhanny/dorfromantik/game/ScoreDisplay.java b/src/fr/monkhanny/dorfromantik/game/ScoreDisplay.java new file mode 100644 index 0000000..777abbe --- /dev/null +++ b/src/fr/monkhanny/dorfromantik/game/ScoreDisplay.java @@ -0,0 +1,32 @@ +package fr.monkhanny.dorfromantik.game; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics; + +public class ScoreDisplay { + private int score; + private Font font; + private int x, y; // Position du score + + public ScoreDisplay(Font font, int x, int y) { + this.font = font; + this.x = x; + this.y = y; + } + + public void setScore(int score) { + this.score = score; + } + + public void setPosition(int x, int y) { + this.x = x; + this.y = y; + } + + public void draw(Graphics g) { + g.setFont(font); + g.setColor(Color.BLACK); + g.drawString("Score: " + score, x, y); + } +}