Ajout d'un zoom + déclacement sur le board
This commit is contained in:
@@ -51,4 +51,6 @@ public class Options {
|
|||||||
public static int SOUNDS_VOLUME = 60;
|
public static int SOUNDS_VOLUME = 60;
|
||||||
|
|
||||||
public static final Dimension MINIMUM_FRAME_SIZE = new Dimension(700, 700);
|
public static final Dimension MINIMUM_FRAME_SIZE = new Dimension(700, 700);
|
||||||
|
|
||||||
|
public static boolean AUTO_FOCUS = true;
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,8 @@
|
|||||||
package fr.monkhanny.dorfromantik.game;
|
package fr.monkhanny.dorfromantik.game;
|
||||||
|
|
||||||
import fr.monkhanny.dorfromantik.listeners.GameResizeListener;
|
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.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -10,6 +12,7 @@ import javax.swing.JPanel;
|
|||||||
import javax.swing.JFrame;
|
import javax.swing.JFrame;
|
||||||
import java.awt.Point;
|
import java.awt.Point;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -22,6 +25,10 @@ public class Board extends JPanel{
|
|||||||
private Game game;
|
private Game game;
|
||||||
private JFrame gameFrame;
|
private JFrame gameFrame;
|
||||||
private Tile centralTile;
|
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
|
// Constructeur avec seed
|
||||||
public Board(JFrame gameFrame, long 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
|
// Ajouter un écouteur de redimensionnement pour redessiner les tuiles
|
||||||
gameFrame.addComponentListener(new GameResizeListener(this));
|
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() {
|
this.addMouseListener(new java.awt.event.MouseAdapter() {
|
||||||
public void mousePressed(java.awt.event.MouseEvent e) {
|
public void mousePressed(java.awt.event.MouseEvent e) {
|
||||||
handleMouseClick(e);
|
handleMouseClick(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleMouseClick(java.awt.event.MouseEvent e) {
|
private void handleMouseClick(java.awt.event.MouseEvent e) {
|
||||||
|
// Récupérer les coordonnées du clic
|
||||||
Point clickedPoint = e.getPoint();
|
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) {
|
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
|
placeTileAtPosition(position); // Place une tuile à cette position
|
||||||
break; // Si une tuile est ajoutée, on peut sortir de la boucle
|
break; // Si une tuile est ajoutée, on peut sortir de la boucle
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void initializeCentralTile() {
|
private void initializeCentralTile() {
|
||||||
int centerX = gameFrame.getWidth() / 2;
|
int centerX = gameFrame.getWidth() / 2;
|
||||||
int centerY = gameFrame.getHeight() / 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.
|
* Afficher les points rouges pour indiquer les positions disponibles.
|
||||||
*
|
*
|
||||||
@@ -160,6 +200,13 @@ public class Board extends JPanel{
|
|||||||
@Override
|
@Override
|
||||||
public void paintComponent(Graphics g) {
|
public void paintComponent(Graphics g) {
|
||||||
super.paintComponent(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) {
|
for (Point position : availablePositions) {
|
||||||
g.setColor(Color.RED);
|
g.setColor(Color.RED);
|
||||||
g.fillOval(position.x - 5, position.y - 5, 10, 10); // Dessiner un point rouge
|
g.fillOval(position.x - 5, position.y - 5, 10, 10); // Dessiner un point rouge
|
||||||
|
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user