Placement de tuiles avec les cliques

This commit is contained in:
2024-11-16 15:28:50 +01:00
parent 980b9c4aa8
commit 0d13a19519

View File

@@ -7,14 +7,17 @@ import java.util.List;
import java.util.Random; import java.util.Random;
import java.awt.Graphics; import java.awt.Graphics;
import javax.swing.JPanel; import javax.swing.JPanel;
import java.awt.Graphics;
import javax.swing.JFrame; import javax.swing.JFrame;
import java.awt.Point;
import java.awt.Color;
/** /**
* Représente le plateau de jeu. * Représente le plateau de jeu.
*/ */
public class Board extends JPanel{ public class Board extends JPanel{
private List<Tile> tiles; private List<Tile> tiles;
private List<Point> availablePositions;
private Random random; private Random random;
private Game game; private Game game;
private JFrame gameFrame; private JFrame gameFrame;
@@ -24,6 +27,7 @@ public class Board extends JPanel{
public Board(JFrame gameFrame, long seed) { public Board(JFrame gameFrame, long seed) {
this.gameFrame = gameFrame; this.gameFrame = gameFrame;
this.tiles = new ArrayList<>(); this.tiles = new ArrayList<>();
this.availablePositions = new ArrayList<>();
this.random = new Random(seed); this.random = new Random(seed);
this.game = new Game(seed); this.game = new Game(seed);
@@ -32,8 +36,25 @@ 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));
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) {
Point clickedPoint = e.getPoint();
// Vérifiez si la position cliqué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
placeTileAtPosition(position); // Place une tuile à cette position
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;
@@ -41,6 +62,9 @@ public class Board extends JPanel{
this.centralTile = new Tile(this, centerX, centerY, 50); this.centralTile = new Tile(this, centerX, centerY, 50);
addTile(centralTile); addTile(centralTile);
// Calculer les positions disponibles autour de la tuile centrale
calculateAvailablePositions(centralTile);
} }
public void repositionCentralTile() { public void repositionCentralTile() {
@@ -63,12 +87,87 @@ public class Board extends JPanel{
return game; return game;
} }
/**
* Calcule les positions disponibles autour de la tuile donnée.
* Les points rouges seront générés autour de cette tuile.
*
* @param tile La tuile pour laquelle on calcule les positions disponibles
*/
private void calculateAvailablePositions(Tile tile) {
int tileX = tile.getXCoord();
int tileY = tile.getYCoord();
int radius = (int) (tile.getRadius() * 1.72); // Utiliser un rayon uniforme pour toutes les directions
public void paintComponent(Graphics g) { // Définir les directions possibles autour de la tuile (6 directions pour une tuile hexagonale)
super.paintComponent(g); Point[] directions = {
for (Tile tile : tiles) { new Point(0, -radius), // Nord
tile.paintTileWithPosition(g,1f); new Point((int)(radius * Math.sqrt(3) / 2), -radius / 2), // Nord-Est (ajuster horizontalement)
new Point((int)(radius * Math.sqrt(3) / 2), radius / 2), // Sud-Est (ajuster horizontalement)
new Point(0, radius), // Sud
new Point(-(int)(radius * Math.sqrt(3) / 2), radius / 2), // Sud-Ouest (ajuster horizontalement)
new Point(-(int)(radius * Math.sqrt(3) / 2), -radius / 2) // Nord-Ouest (ajuster horizontalement)
};
// Calculer les positions disponibles autour de la tuile
for (Point direction : directions) {
Point newPoint = new Point(tileX + direction.x, tileY + direction.y);
if (!isTileAtPosition(newPoint)) {
availablePositions.add(newPoint); // Ajouter la position si une tuile n'est pas déjà là
} }
} }
} }
/**
* Vérifie si une tuile existe déjà à la position donnée.
*
* @param position La position à vérifier
* @return true si une tuile est présente à cette position, false sinon
*/
private boolean isTileAtPosition(Point position) {
for (Tile t : tiles) {
if (t.getXCoord() == position.x && t.getYCoord() == position.y) {
return true;
}
}
return false;
}
/**
* Lorsqu'un utilisateur clique, ajoute une nouvelle tuile à la position sélectionnée.
*
* @param position La position où ajouter la tuile
*/
public void placeTileAtPosition(Point position) {
// Vérifie si la position est disponible et que la tuile n'est pas déjà placée à cet endroit
if (availablePositions.contains(position) && !isTileAtPosition(position)) {
Tile newTile = new Tile(this, position.x, position.y, 50);
// Vérifier que la tuile ne se chevauche pas avec l'ancienne tuile
if (!isTileAtPosition(new Point(newTile.getXCoord(), newTile.getYCoord()))) {
addTile(newTile);
calculateAvailablePositions(newTile); // Calculer de nouvelles positions disponibles
repaint(); // Re-dessiner le plateau
}
}
}
/**
* Afficher les points rouges pour indiquer les positions disponibles.
*
* @param g Le contexte graphique
*/
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
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);
}
}
}