Ajouts d'un dezoom avec la touche espace

This commit is contained in:
2024-11-16 17:09:31 +01:00
parent 70a5fecf09
commit 2c5764e60a
2 changed files with 86 additions and 0 deletions

View File

@@ -3,6 +3,7 @@ package fr.monkhanny.dorfromantik.game;
import fr.monkhanny.dorfromantik.listeners.GameResizeListener;
import fr.monkhanny.dorfromantik.listeners.GameZoomListener;
import fr.monkhanny.dorfromantik.listeners.GameArrowKeyListener;
import fr.monkhanny.dorfromantik.listeners.GameSpaceKeyListener;
import fr.monkhanny.dorfromantik.Options;
import java.util.ArrayList;
@@ -52,6 +53,8 @@ public class Board extends JPanel{
gameFrame.addKeyListener(new GameArrowKeyListener(this));
gameFrame.setFocusable(true);
gameFrame.addKeyListener(new GameSpaceKeyListener(this));
this.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(java.awt.event.MouseEvent e) {
handleMouseClick(e);
@@ -60,6 +63,68 @@ public class Board extends JPanel{
});
}
public void handleSpaceKeyPress() {
// 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
for (Tile tile : tiles) {
totalWidth = Math.max(totalWidth, tile.getXCoord() + tile.getRadius());
totalHeight = Math.max(totalHeight, 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
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
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
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);
}
private void adjustZoomAndPosition() {
// Calculer la largeur et la hauteur totales des tuiles (en fonction du nombre de tuiles)
int totalWidth = 0;
int totalHeight = 0;
// Trouver la plus grande étendue de tuiles sur l'axe X et Y
for (Tile tile : tiles) {
totalWidth = Math.max(totalWidth, tile.getXCoord() + tile.getRadius());
totalHeight = Math.max(totalHeight, tile.getYCoord() + tile.getRadius());
}
// Définir l'offset pour centrer les tuiles sur le plateau après le dézoom
int targetOffsetX = (int) ((getWidth() - totalWidth * zoomFactor) / 2);
int targetOffsetY = (int) ((getHeight() - totalHeight * zoomFactor) / 2);
// Appliquer ces nouveaux offsets
setOffsetX(targetOffsetX);
setOffsetY(targetOffsetY);
}
private void handleMouseClick(java.awt.event.MouseEvent e) {
// Récupérer les coordonnées du clic
Point clickedPoint = e.getPoint();

View File

@@ -0,0 +1,21 @@
package fr.monkhanny.dorfromantik.listeners;
import fr.monkhanny.dorfromantik.game.Board;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class GameSpaceKeyListener extends java.awt.event.KeyAdapter {
private Board board;
public GameSpaceKeyListener(Board board) {
this.board = board;
}
@Override
public void keyPressed(java.awt.event.KeyEvent e) {
if (e.getKeyCode() == java.awt.event.KeyEvent.VK_SPACE) {
board.handleSpaceKeyPress(); // Appeler la méthode dans Board pour dézoomer
}
}
}