revert Merge branch 'main' of https://grond.iut-fbleau.fr/stiti/SAE31_2024
This commit is contained in:
2024-11-16 18:45:51 +01:00
parent 6232e6f93e
commit e9a5543328
26 changed files with 437 additions and 74 deletions

View File

@@ -4,10 +4,12 @@ import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class GameView extends JFrame {
private final Board board;
private final int hexRadius = 60;
private final int hexWidth = (int) (Math.sqrt(3) * hexRadius); // Largeur d'un hexagone
private final int hexHeight = 2 * hexRadius; // Hauteur d'un hexagone
private Board board;
private int hexRadius = 30; // Rayon du grand hexagone
// Dimensions calculées des hexagones
private int hexWidth = (int) (1.5 * hexRadius); // Largeur de l'hexagone
private int hexHeight = (int) (Math.sqrt(3) * hexRadius); // Hauteur de l'hexagone
public GameView(Board board) {
this.board = board;
@@ -16,24 +18,18 @@ public class GameView extends JFrame {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
// Gestion des clics de souris pour placer une tuile
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
handleMouseClick(e.getPoint());
handleMouseClick(e.getX(), e.getY());
}
});
}
private void handleMouseClick(Point clickPoint) {
// Calcul de la position en coordonnées hexagonales
Point hexPosition = calculateHexCoordinates(clickPoint);
// Vérifie si la position est libre
if (!board.isPositionOccupied(hexPosition)) {
Tile newTile = new Tile(Terrain.FORET); // Exemple : tuile de forêt
board.addTile(hexPosition, newTile);
repaint();
}
public void showBoard() {
setVisible(true);
repaint();
}
@Override
@@ -41,54 +37,99 @@ public class GameView extends JFrame {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
// Dessiner toutes les tuiles placées
// Dessiner toutes les tuiles du plateau
for (Point position : board.getTiles().keySet()) {
Tile tile = board.getTile(position);
int x = calculateScreenX(position);
int y = calculateScreenY(position);
drawLargeHexagon(g2d, x, y, tile);
drawLargeHexagon(g2d, position.x, position.y, tile);
}
}
private void drawLargeHexagon(Graphics2D g2d, int x, int y, Tile tile) {
Polygon hexagon = new Polygon();
for (int i = 0; i < 6; i++) {
double angle = Math.toRadians(60 * i);
int px = x + (int) (Math.cos(angle) * hexRadius);
int py = y + (int) (Math.sin(angle) * hexRadius);
hexagon.addPoint(px, py);
}
private void drawLargeHexagon(Graphics2D g2d, int centerX, int centerY, Tile tile) {
// Couleurs des triangles
Color color1 = getColorForTerrain(tile.getTerrain());
Color color2 = color1.darker(); // Variante plus sombre pour contraste
g2d.setColor(getColorForTerrain(tile.getTerrain()));
g2d.fillPolygon(hexagon);
g2d.setColor(Color.BLACK);
g2d.drawPolygon(hexagon);
// Dessiner les 6 triangles pour former l'hexagone
for (int i = 0; i < 6; i++) {
// Dessiner chaque triangle équilatéral avec sa couleur associée
drawTriangle(g2d, centerX, centerY, i, hexRadius, i % 2 == 0 ? color1 : color2);
}
}
private void drawTriangle(Graphics2D g2d, int centerX, int centerY, int triangleIndex, int radius, Color color) {
// Orientation de chaque triangle (décalage de 60° par rapport à chaque triangle)
double angle = Math.toRadians(60 * triangleIndex);
// Calcul des points de chaque triangle autour du centre du grand hexagone
int x1 = centerX + (int) (Math.cos(angle) * radius);
int y1 = centerY + (int) (Math.sin(angle) * radius);
int x2 = centerX + (int) (Math.cos(angle + Math.toRadians(60)) * radius);
int y2 = centerY + (int) (Math.sin(angle + Math.toRadians(60)) * radius);
int x3 = centerX + (int) (Math.cos(angle + Math.toRadians(120)) * radius);
int y3 = centerY + (int) (Math.sin(angle + Math.toRadians(120)) * radius);
// Créer un polygone pour dessiner le triangle
Polygon triangle = new Polygon();
triangle.addPoint(centerX, centerY); // Centre de l'hexagone
triangle.addPoint(x1, y1); // Premier sommet
triangle.addPoint(x2, y2); // Deuxième sommet
triangle.addPoint(x3, y3); // Troisième sommet
// Remplir le triangle avec la couleur
g2d.setColor(color);
g2d.fillPolygon(triangle);
}
private Color getColorForTerrain(Terrain terrain) {
return switch (terrain) {
case MER -> Color.BLUE;
case CHAMP -> Color.YELLOW;
case FORET -> new Color(34, 139, 34);
case PRE -> Color.GREEN;
case MONTAGNE -> Color.GRAY;
};
switch (terrain) {
case MER:
return Color.BLUE;
case CHAMP:
return Color.YELLOW;
case PRE:
return Color.GREEN;
case FORET:
return new Color(34, 139, 34); // Vert foncé
case MONTAGNE:
return Color.GRAY;
default:
return Color.WHITE;
}
}
private Point calculateHexCoordinates(Point clickPoint) {
int col = (int) Math.round((clickPoint.x - hexWidth / 2.0) / (1.5 * hexRadius));
int row = (int) Math.round((clickPoint.y - hexHeight / 2.0 - (col % 2) * hexHeight / 4.0) / hexHeight);
return new Point(col, row);
}
private int calculateScreenX(Point position) {
int col = position.x;
return (int) (col * 1.5 * hexRadius + hexWidth / 2.0);
}
private int calculateScreenY(Point position) {
int col = position.x;
int row = position.y;
return (int) (row * hexHeight + (col % 2) * hexHeight / 2.0 + hexHeight / 2.0);
}
}
private void handleMouseClick(int mouseX, int mouseY) {
// Calcul des coordonnées de la grille de manière à respecter la structure hexagonale
// Calcul de la colonne et de la ligne en fonction de la taille des hexagones
int gridX = (int) (mouseX / (hexWidth * 0.75)); // Calcul de la colonne
// Calcul de la ligne en fonction de la hauteur des hexagones
int gridY = (int) (mouseY / hexHeight); // Calcul de la ligne
// Détecter si c'est une rangée paire ou impaire et appliquer un décalage
if (gridY % 2 != 0) { // Si la ligne est impaire
gridX += 1; // Décalage horizontal pour les rangées impaires
}
// Calculer les coordonnées X et Y en pixels
int finalX = (int) (gridX * hexWidth * 0.75); // Calcul des coordonnées X
int finalY = gridY * hexHeight; // Calcul des coordonnées Y
// Créer un objet Point avec les coordonnées finales
Point position = new Point(finalX, finalY);
// Vérifier si la position est déjà occupée par une autre tuile
if (!board.isPositionOccupied(position)) {
// Créer une nouvelle tuile (ici, une tuile de forêt)
Tile newTile = new Tile(Terrain.FORET);
// Ajouter la tuile sur le plateau
board.addTile(position, newTile);
// Rafraîchir l'affichage
repaint();
}
}
}