From 70a5fecf0914a98d3142d00af2aa3f97f550e510 Mon Sep 17 00:00:00 2001 From: Moncef STITI Date: Sat, 16 Nov 2024 16:59:09 +0100 Subject: [PATCH] =?UTF-8?q?Am=C3=A9lioration=20de=20l'effet=20de=20focus?= =?UTF-8?q?=20sur=20une=20Tile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/monkhanny/dorfromantik/game/Board.java | 44 ++++++++++ .../game/TilePanningTransition.java | 28 ++++++ .../listeners/TilePanningActionListener.java | 86 +++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 TestV2/src/fr/monkhanny/dorfromantik/game/TilePanningTransition.java create mode 100644 TestV2/src/fr/monkhanny/dorfromantik/listeners/TilePanningActionListener.java diff --git a/TestV2/src/fr/monkhanny/dorfromantik/game/Board.java b/TestV2/src/fr/monkhanny/dorfromantik/game/Board.java index 421fff7..78869f8 100644 --- a/TestV2/src/fr/monkhanny/dorfromantik/game/Board.java +++ b/TestV2/src/fr/monkhanny/dorfromantik/game/Board.java @@ -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.Options; import java.util.ArrayList; import java.util.List; @@ -172,9 +173,52 @@ public class Board extends JPanel{ calculateAvailablePositions(newTile); // Calculer de nouvelles positions disponibles repaint(); // Re-dessiner le plateau } + + autoReFocus(newTile); // Réinitialiser le zoom et le déplacement } } + public void autoReFocus(Tile newlyPlacedTile) { + if (Options.AUTO_FOCUS) { + // Récupérer les coordonnées de la nouvelle tuile + int newlyPlacedTileX = newlyPlacedTile.getXCoord(); + int newlyPlacedTileY = newlyPlacedTile.getYCoord(); + + // Calculer les décalages nécessaires pour centrer la tuile + // Nous utilisons la largeur et la hauteur du panneau de jeu (getWidth et getHeight) + // Divisé par 2 pour centrer la nouvelle tuile dans la fenêtre. + int targetOffsetX = (int) ((getWidth() - newlyPlacedTile.getRadius() * 2) / 2 - newlyPlacedTileX); + int targetOffsetY = (int) ((getHeight() - newlyPlacedTile.getRadius() * 2) / 2 - newlyPlacedTileY); + + TilePanningTransition panningTransition = new TilePanningTransition(this, targetOffsetX, targetOffsetY, 20, 20); + panningTransition.start(); + } + } + + public double getZoomFactor() { + return zoomFactor; + } + + public void setZoomFactor(double zoomFactor) { + this.zoomFactor = zoomFactor; + } + + public int getOffsetX() { + return offsetX; + } + + public void setOffsetX(int offsetX) { + this.offsetX = offsetX; + } + + public int getOffsetY() { + return offsetY; + } + + public void setOffsetY(int offsetY) { + this.offsetY = offsetY; + } + public void zoomIn() { zoomFactor *= 1.1; // Augmenter le facteur de zoom repaint(); diff --git a/TestV2/src/fr/monkhanny/dorfromantik/game/TilePanningTransition.java b/TestV2/src/fr/monkhanny/dorfromantik/game/TilePanningTransition.java new file mode 100644 index 0000000..62507e4 --- /dev/null +++ b/TestV2/src/fr/monkhanny/dorfromantik/game/TilePanningTransition.java @@ -0,0 +1,28 @@ +package fr.monkhanny.dorfromantik.game; + +import fr.monkhanny.dorfromantik.listeners.TilePanningActionListener; + +import javax.swing.Timer; + +public class TilePanningTransition { + private Board board; + private int targetOffsetX, targetOffsetY; + private int speed; + private int steps; + + public TilePanningTransition(Board board, int targetOffsetX, int targetOffsetY, int speed, int steps) { + this.board = board; + this.targetOffsetX = targetOffsetX; + this.targetOffsetY = targetOffsetY; + this.speed = speed; + this.steps = steps; + } + + public void start() { + // Créer un listener d'animation + TilePanningActionListener listener = new TilePanningActionListener(board, targetOffsetX, targetOffsetY, speed, steps); + + // Démarrer l'animation si aucune n'est en cours + listener.startAnimation(); + } +} diff --git a/TestV2/src/fr/monkhanny/dorfromantik/listeners/TilePanningActionListener.java b/TestV2/src/fr/monkhanny/dorfromantik/listeners/TilePanningActionListener.java new file mode 100644 index 0000000..c4ff3b4 --- /dev/null +++ b/TestV2/src/fr/monkhanny/dorfromantik/listeners/TilePanningActionListener.java @@ -0,0 +1,86 @@ +package fr.monkhanny.dorfromantik.listeners; + +import fr.monkhanny.dorfromantik.game.Board; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class TilePanningActionListener implements ActionListener { + private Board board; + private int targetOffsetX, targetOffsetY; + private int speed; // Vitesse de la transition + private int steps; // Nombre d'étapes pour l'animation + private Timer timer; + + // Indicateur pour vérifier si l'animation est en cours + private static boolean isAnimating = false; + + // Variables pour suivre l'état de l'animation + private int currentStep = 0; + + public TilePanningActionListener(Board board, int targetOffsetX, int targetOffsetY, int speed, int steps) { + this.board = board; + this.targetOffsetX = targetOffsetX; + this.targetOffsetY = targetOffsetY; + this.speed = speed; + this.steps = steps; + } + + @Override + public void actionPerformed(ActionEvent e) { + int currentOffsetX = board.getOffsetX(); + int currentOffsetY = board.getOffsetY(); + + // Si l'animation a atteint la cible (exactement) + if (currentStep >= steps) { + board.setOffsetX(targetOffsetX); + board.setOffsetY(targetOffsetY); + stopAnimation(); + } else { + // Calculer le delta pour chaque étape + int deltaX = (targetOffsetX - currentOffsetX) / (steps - currentStep); + int deltaY = (targetOffsetY - currentOffsetY) / (steps - currentStep); + + // Appliquer la transition progressivement + board.setOffsetX(currentOffsetX + deltaX); + board.setOffsetY(currentOffsetY + deltaY); + board.repaint(); // Re-dessiner le plateau + + // Augmenter le compteur d'étapes + currentStep++; + } + } + + // Lancer l'animation + public void startAnimation() { + if (isAnimating) { + stopCurrentAnimation(); + } + + isAnimating = true; + + // Réinitialiser les étapes + currentStep = 0; + + // Créer et démarrer le timer pour l'animation + this.timer = new Timer(1000 / 60, this); // 60 FPS + timer.start(); + } + + // Arrêter l'animation proprement + private void stopAnimation() { + if (timer != null) { + timer.stop(); // Arrêter le timer + } + isAnimating = false; // Réinitialiser l'indicateur d'animation + } + + // Annuler l'animation en cours + private void stopCurrentAnimation() { + if (timer != null) { + timer.stop(); // Arrêter le timer de l'animation en cours + } + isAnimating = false; // Réinitialiser l'animation + } +}