Placement de tuiles avec les cliques
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user