Ajout d'un zoom + déclacement sur le board

This commit is contained in:
2024-11-16 16:04:31 +01:00
parent 0d13a19519
commit 1b7c17f6a6
4 changed files with 108 additions and 3 deletions

View File

@@ -51,4 +51,6 @@ public class Options {
public static int SOUNDS_VOLUME = 60;
public static final Dimension MINIMUM_FRAME_SIZE = new Dimension(700, 700);
public static boolean AUTO_FOCUS = true;
}

View File

@@ -1,6 +1,8 @@
package fr.monkhanny.dorfromantik.game;
import fr.monkhanny.dorfromantik.listeners.GameResizeListener;
import fr.monkhanny.dorfromantik.listeners.GameZoomListener;
import fr.monkhanny.dorfromantik.listeners.GameArrowKeyListener;
import java.util.ArrayList;
import java.util.List;
@@ -10,6 +12,7 @@ import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.Point;
import java.awt.Color;
import java.awt.Graphics2D;
/**
@@ -22,6 +25,10 @@ public class Board extends JPanel{
private Game game;
private JFrame gameFrame;
private Tile centralTile;
private double zoomFactor = 1.0; // Facteur de zoom initial
private int offsetX = 0; // Décalage horizontal du plateau
private int offsetY = 0; // Décalage vertical du plateau
// Constructeur avec seed
public Board(JFrame gameFrame, long seed) {
@@ -37,25 +44,41 @@ public class Board extends JPanel{
// Ajouter un écouteur de redimensionnement pour redessiner les tuiles
gameFrame.addComponentListener(new GameResizeListener(this));
// Ajouter un écouteur de molette de souris pour gérer le zoom
gameFrame.addMouseWheelListener(new GameZoomListener(this));
// Ajouter un écouteur de clavier pour déplacer le plateau
gameFrame.addKeyListener(new GameArrowKeyListener(this));
gameFrame.setFocusable(true);
this.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(java.awt.event.MouseEvent e) {
handleMouseClick(e);
}
});
}
private void handleMouseClick(java.awt.event.MouseEvent e) {
// Récupérer les coordonnées du clic
Point clickedPoint = e.getPoint();
// Vérifiez si la position cliquée est dans la liste des positions disponibles et si la distance est suffisante
// Ajuster les coordonnées du clic en tenant compte du zoom et des déplacements
// Annuler l'effet du zoom et du déplacement
int adjustedX = (int)((clickedPoint.x - offsetX) / zoomFactor);
int adjustedY = (int)((clickedPoint.y - offsetY) / zoomFactor);
// Vérifiez si la position ajustée est dans la liste des positions disponibles et si la distance est suffisante
for (Point position : availablePositions) {
if (clickedPoint.distance(position) < 20) { // Assurez-vous que le clic est plus éloigné du point
// Vérifiez la distance entre le clic ajusté et la position
if (new Point(adjustedX, adjustedY).distance(position) < 20) {
placeTileAtPosition(position); // Place une tuile à cette position
break; // Si une tuile est ajoutée, on peut sortir de la boucle
}
}
}
private void initializeCentralTile() {
int centerX = gameFrame.getWidth() / 2;
int centerY = gameFrame.getHeight() / 2;
@@ -152,6 +175,23 @@ public class Board extends JPanel{
}
}
public void zoomIn() {
zoomFactor *= 1.1; // Augmenter le facteur de zoom
repaint();
}
public void zoomOut() {
zoomFactor /= 1.1; // Diminuer le facteur de zoom
repaint();
}
public void moveBoard(int dx, int dy) {
offsetX += dx;
offsetY += dy;
repaint();
}
/**
* Afficher les points rouges pour indiquer les positions disponibles.
*
@@ -160,11 +200,18 @@ public class Board extends JPanel{
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) 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)
// Dessiner les points rouges pour les positions disponibles
for (Point position : availablePositions) {
g.setColor(Color.RED);
g.fillOval(position.x - 5, position.y - 5, 10, 10); // Dessiner un point rouge
}
// Dessiner les tuiles existantes
for (Tile tile : tiles) {
tile.paintTileWithPosition(g, 1f);

View File

@@ -0,0 +1,32 @@
package fr.monkhanny.dorfromantik.listeners;
import fr.monkhanny.dorfromantik.game.Board;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class GameArrowKeyListener extends KeyAdapter {
private Board board;
public GameArrowKeyListener(Board board) {
this.board = board;
}
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
board.moveBoard(0, -10); // Déplacer vers le haut
break;
case KeyEvent.VK_DOWN:
board.moveBoard(0, 10); // Déplacer vers le bas
break;
case KeyEvent.VK_LEFT:
board.moveBoard(-10, 0); // Déplacer vers la gauche
break;
case KeyEvent.VK_RIGHT:
board.moveBoard(10, 0); // Déplacer vers la droite
break;
}
}
}

View File

@@ -0,0 +1,24 @@
package fr.monkhanny.dorfromantik.listeners;
import fr.monkhanny.dorfromantik.game.Board;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseWheelEvent;
public class GameZoomListener extends MouseAdapter {
private Board board;
public GameZoomListener(Board board) {
this.board = board;
}
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
// Vérifier la direction de la molette (positive = zoom arrière, negative = zoom avant)
if (e.getWheelRotation() < 0) {
board.zoomIn(); // Appeler zoomIn() si la molette tourne vers le haut
} else {
board.zoomOut(); // Appeler zoomOut() si la molette tourne vers le bas
}
}
}