Pair Programming (bamba, david, vincent ) -fix grille + rotations

This commit is contained in:
Vincent 2024-10-25 22:22:11 +02:00
parent d5825ab8f5
commit 07515d748d
25 changed files with 252 additions and 206 deletions

BIN
bin/Music/Music/audio.wav Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
bin/controller/Point.class Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -1,36 +1,34 @@
package controller; package controller;
import javax.swing.*; import javax.swing.JPanel;
import java.awt.*; import java.awt.Point;
public class CameraController { public class CameraController {
private Point mouseDragStart = null; // Stocke la position de départ du clic droit private Point mouseDragStart = null;
private Point viewOffset = new Point(0, 0); // Stocke le décalage actuel de la vue
private JPanel gridPanel;
private GameContext context; private GameContext context;
private JPanel gridPanel;
public CameraController(JPanel gridPanel, GameContext context) { public CameraController(JPanel gridPanel, GameContext context) {
this.gridPanel = gridPanel; this.gridPanel = gridPanel;
this.context = context; this.context = context;
setupMouseDragToMove(); // Initialise les écouteurs pour gérer le déplacement setupMouseDragToMove(gridPanel); // Initialise les écouteurs pour gérer le déplacement
}
public Point getViewOffset() {
return viewOffset;
} }
public void updateViewOffset(int deltaX, int deltaY) { public void updateViewOffset(int deltaX, int deltaY) {
viewOffset.translate(deltaX, deltaY); // Met à jour uniquement l'offset dans GameContext
gridPanel.setLocation(viewOffset); context.updateOffset(deltaX, deltaY);
// Repeindre la grille après mise à jour
context.repaintGrid(gridPanel);
// Debug : Affiche l'offset actuel
System.out.println("Nouvel offset dans GameContext : " + context.getOffset());
} }
private void setupMouseDragToMove() { private void setupMouseDragToMove(JPanel gridPanel) {
MousePressHandler mousePressHandler = new MousePressHandler(this, context); gridPanel.addMouseListener(new MousePressHandler(this, context));
MouseDragHandler mouseDragHandler = new MouseDragHandler(this, context); gridPanel.addMouseMotionListener(new MouseDragHandler(this, context));
gridPanel.addMouseListener(mousePressHandler);
gridPanel.addMouseMotionListener(mouseDragHandler);
} }
public void setMouseDragStart(Point point) { public void setMouseDragStart(Point point) {
@ -45,7 +43,7 @@ public class CameraController {
this.mouseDragStart = null; this.mouseDragStart = null;
} }
public JPanel getGridPanel() { public Point getViewOffset() {
return gridPanel; return context.getOffset();
} }
} }

@ -1,12 +1,12 @@
package controller; package controller;
import view.HexagonTile; import view.HexagonTile;
import java.awt.Point;
import java.awt.*;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.swing.JPanel;
public class GameContext { public class GameContext {
private Map<Point, HexagonTile> hexagonMap; // Stocke la grille private Map<Point, HexagonTile> hexagonMap; // Stocke la grille
@ -36,4 +36,30 @@ public class GameContext {
public void updateOffset(int deltaX, int deltaY) { public void updateOffset(int deltaX, int deltaY) {
offset.translate(deltaX, deltaY); offset.translate(deltaX, deltaY);
} }
// Ajout de la méthode pour recalculer les positions de la grille en fonction de l'offset
public void repaintGrid(JPanel gridPanel) {
for (Map.Entry<Point, HexagonTile> entry : hexagonMap.entrySet()) {
Point position = entry.getKey();
HexagonTile tile = entry.getValue();
// Calcule la position avec l'offset
int xOffset = position.x * (int) (50 * 3 / 2); // Ajuste la distance horizontale
int yOffset = position.y * (int) (Math.sqrt(3) * 50); // Ajuste la distance verticale
// Si la colonne est impaire, décale la tuile d'une demi-hauteur d'hexagone
if (position.x % 2 != 0) {
yOffset += (int) (Math.sqrt(3) * 50 / 2);
}
// Applique l'offset de vue
xOffset += offset.x;
yOffset += offset.y;
// Met à jour la position de l'hexagone
tile.setBounds(xOffset, yOffset, 50, 50);
}
gridPanel.revalidate();
gridPanel.repaint();
}
} }

@ -4,58 +4,120 @@ import model.Tile;
import view.HexagonTile; import view.HexagonTile;
import javax.swing.*; import javax.swing.*;
import java.awt.*; import java.awt.Point;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
public class GameController { public class GameController {
private Map<Point, HexagonTile> hexagonMap; // Carte pour stocker les tuiles par position private Map<Point, HexagonTile> hexagonMap;
private Set<Point> availablePositions; // Ensemble pour suivre les positions disponibles private Set<Point> availablePositions;
private JPanel gridPanel; private JPanel gridPanel;
private Tile nextTile;
private HexagonTile nextTilePreview;
private GameContext gameContext;
public GameController(GameContext gameContext, JPanel gridPanel, Tile nextTile, HexagonTile nextTilePreview) { public GameController(GameContext gameContext, JPanel gridPanel, Tile nextTile, HexagonTile nextTilePreview) {
this.gameContext = gameContext;
this.gridPanel = gridPanel; this.gridPanel = gridPanel;
this.hexagonMap = gameContext.getHexagonMap();
this.availablePositions = gameContext.getAvailablePositions();
this.nextTile = nextTile;
this.nextTilePreview = nextTilePreview;
// Initialiser hexagonMap et availablePositions // Mettre à jour la preview initiale
this.hexagonMap = new HashMap<>(); updatePreview();
this.availablePositions = new HashSet<>(); }
public void placeTile(Point position) {
// Vérifier si la position est disponible
if (availablePositions.contains(position)) {
HexagonTile hexTile = hexagonMap.get(position);
if (hexTile == null) {
System.out.println("Erreur: hexTile est null à la position : " + position);
return;
}
// Assigner la tuile actuelle
hexTile.setTile(nextTile);
gridPanel.revalidate();
gridPanel.repaint();
// Retirer la position des positions disponibles
availablePositions.remove(position);
// Mettre à jour les positions adjacentes
Point[] adjacentPositions = getAdjacentPositions(position);
for (Point adj : adjacentPositions) {
if (!hexagonMap.containsKey(adj)) {
availablePositions.add(adj);
addHexagonTile(adj, gridPanel, 50, null, null); // Ajouter des placeholders
}
}
// Repeindre la grille
gameContext.repaintGrid(gridPanel);
// Générer une nouvelle tuile pour la prochaine preview
generateNextTile();
}
}
public void initializeGame(CameraController cameraController) {
Tile initialTile = generateRandomTile();
int centerX = gridPanel.getPreferredSize().width / 2;
int centerY = gridPanel.getPreferredSize().height / 2;
Point initialPosition = new Point(0, 0);
initialPosition.setLocation(centerX / 50, centerY / 50);
placeInitialTile(initialPosition, cameraController, initialTile);
// Générer la première tuile pour la preview
generateNextTile();
} }
public void placeInitialTile(Point position, CameraController cameraController, Tile tile) { public void placeInitialTile(Point position, CameraController cameraController, Tile tile) {
// Place la première tuile pleine au point central addHexagonTile(position, gridPanel, 50, cameraController, tile);
addHexagonTile(position, gridPanel, 50, cameraController, tile);
availablePositions.remove(position); availablePositions.remove(position);
// Ajouter des placeholders autour de la première tuile
Point[] adjacentPositions = getAdjacentPositions(position); Point[] adjacentPositions = getAdjacentPositions(position);
for (Point adj : adjacentPositions) { for (Point adj : adjacentPositions) {
if (!hexagonMap.containsKey(adj)) { if (!hexagonMap.containsKey(adj)) {
availablePositions.add(adj); availablePositions.add(adj);
addHexagonTile(adj, gridPanel, 50, cameraController, null); // Passer `null` pour les placeholders addHexagonTile(adj, gridPanel, 50, cameraController, null);
} }
} }
} }
public void addHexagonTile(Point position, JPanel panel, int hexSize, CameraController cameraController, Tile tile) { public void addHexagonTile(Point position, JPanel panel, int hexSize, CameraController cameraController, Tile tile) {
if (position == null || panel == null) {
System.out.println("Erreur : position ou panel est null");
return;
}
int xOffset = position.x * (int) (hexSize * 3 / 2); int xOffset = position.x * (int) (hexSize * 3 / 2);
int yOffset = position.y * (int) (Math.sqrt(3) * hexSize); int yOffset = position.y * (int) (Math.sqrt(3) * hexSize);
Point viewOffset = cameraController.getViewOffset(); if (cameraController != null) {
xOffset += viewOffset.x; Point viewOffset = cameraController.getViewOffset();
yOffset += viewOffset.y; xOffset += viewOffset.x;
yOffset += viewOffset.y;
}
if (position.x % 2 != 0) { if (position.x % 2 != 0) {
yOffset += (int) (Math.sqrt(3) * hexSize / 2); yOffset += (int) (Math.sqrt(3) * hexSize / 2);
} }
HexagonTile hexTile = new HexagonTile(position); HexagonTile hexTile = new HexagonTile(position);
hexTile.setTile(tile); // Place la tuile fournie, ou null pour un placeholder if (tile != null) {
hexTile.setBounds(xOffset, yOffset, hexSize, hexSize); hexTile.setTile(tile);
} else {
System.out.println("Aucun tile n'a été fourni pour cette position : " + position);
}
// Ajout de l'écouteur pour gérer le clic sur l'hexagone hexTile.setBounds(xOffset, yOffset, hexSize, hexSize);
hexTile.addMouseListener(new HexagonMouseListener(hexTile, this, availablePositions, cameraController)); hexTile.addMouseListener(new HexagonMouseListener(hexTile, this, availablePositions));
hexagonMap.put(position, hexTile); hexagonMap.put(position, hexTile);
panel.add(hexTile); panel.add(hexTile);
@ -63,14 +125,44 @@ public class GameController {
panel.repaint(); panel.repaint();
} }
public void generateNextTile() {
// Génère une nouvelle tuile pour la prochaine pose
nextTile = new Tile();
updatePreview();
}
private void updatePreview() {
nextTilePreview.setTile(nextTile);
nextTilePreview.repaint();
}
private Point[] getAdjacentPositions(Point position) { private Point[] getAdjacentPositions(Point position) {
return new Point[]{ if (position.x % 2 == 0) {
new Point(position.x + 1, position.y), return new Point[]{
new Point(position.x - 1, position.y), new Point(position.x + 1, position.y),
new Point(position.x, position.y + 1), new Point(position.x - 1, position.y),
new Point(position.x, position.y - 1), new Point(position.x, position.y + 1),
new Point(position.x + 1, position.y - 1), new Point(position.x, position.y - 1),
new Point(position.x - 1, position.y + 1) new Point(position.x + 1, position.y - 1),
}; new Point(position.x - 1, position.y - 1)
};
} else {
return new Point[]{
new Point(position.x + 1, position.y),
new Point(position.x - 1, position.y),
new Point(position.x, position.y + 1),
new Point(position.x, position.y - 1),
new Point(position.x + 1, position.y + 1),
new Point(position.x - 1, position.y + 1)
};
}
}
private Tile generateRandomTile() {
return new Tile();
}
public Tile getNextTile() {
return nextTile;
} }
} }

@ -1,18 +1,19 @@
package controller; package controller;
import view.HexagonTile; import view.HexagonTile;
import java.awt.Point;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.Point;
import java.util.Set; import java.util.Set;
public class HexagonMouseListener extends MouseAdapter { public class HexagonMouseListener extends MouseAdapter {
private final HexagonTile hexTile; private final HexagonTile hexTile;
private final GameController gameController;
private final Set<Point> availablePositions; private final Set<Point> availablePositions;
public HexagonMouseListener(HexagonTile hexTile, GameController gameController, Set<Point> availablePositions, CameraController cameraController) { public HexagonMouseListener(HexagonTile hexTile, GameController gameController, Set<Point> availablePositions) {
this.hexTile = hexTile; this.hexTile = hexTile;
this.gameController = gameController;
this.availablePositions = availablePositions; this.availablePositions = availablePositions;
} }
@ -21,8 +22,12 @@ public class HexagonMouseListener extends MouseAdapter {
Point position = hexTile.getPosition(); Point position = hexTile.getPosition();
if (availablePositions.contains(position)) { if (availablePositions.contains(position)) {
System.out.println("Hexagone cliqué à la position : " + position); System.out.println("Hexagone cliqué à la position : " + position);
// Logique de placement de la tuile ou appel à GameController ici si nécessaire
// Par exemple, nous pourrions générer la tuile suivante directement ici // Appeler le GameController pour placer une nouvelle tuile à cet emplacement
gameController.placeTile(position);
// Générer la prochaine tuile après avoir placé celle-ci
gameController.generateNextTile();
} else { } else {
System.out.println("Position non disponible pour le placement"); System.out.println("Position non disponible pour le placement");
} }

@ -4,12 +4,8 @@ import view.*;
public class MenuController { public class MenuController {
private MenuModel model;
private MenuView view;
public MenuController(MenuModel model, MenuView view) { public MenuController(MenuModel model, MenuView view) {
this.model = model;
this.view = view;
view.getResumeButton().addActionListener(new ResListener()); view.getResumeButton().addActionListener(new ResListener());
view.getNewGameButton().addActionListener(new NewListener()); view.getNewGameButton().addActionListener(new NewListener());

@ -1,6 +1,5 @@
package controller; package controller;
import view.HexagonTile;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.Point; import java.awt.Point;
@ -9,11 +8,9 @@ import javax.swing.SwingUtilities;
public class MouseDragHandler extends MouseAdapter { public class MouseDragHandler extends MouseAdapter {
private CameraController controller; private CameraController controller;
private GameContext context;
public MouseDragHandler(CameraController controller, GameContext context) { public MouseDragHandler(CameraController controller, GameContext context) {
this.controller = controller; this.controller = controller;
this.context = context;
} }
@Override @Override
@ -23,18 +20,11 @@ public class MouseDragHandler extends MouseAdapter {
int deltaX = current.x - controller.getMouseDragStart().x; int deltaX = current.x - controller.getMouseDragStart().x;
int deltaY = current.y - controller.getMouseDragStart().y; int deltaY = current.y - controller.getMouseDragStart().y;
// Déplace chaque tuile dans le contexte de la grille // Déplacement dans CameraController
for (HexagonTile hexTile : context.getHexagonMap().values()) { controller.updateViewOffset(deltaX, deltaY);
Point currentPos = hexTile.getLocation();
hexTile.setLocation(currentPos.x + deltaX, currentPos.y + deltaY);
}
// Mettre à jour la position initiale pour le prochain déplacement // Met à jour la position de départ
controller.setMouseDragStart(current); controller.setMouseDragStart(current);
// Rafraîchir la vue
controller.getGridPanel().revalidate();
controller.getGridPanel().repaint();
} }
} }

@ -0,0 +1,31 @@
package controller;
import model.Tile;
import view.HexagonTile;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
public class MouseWheelController implements MouseWheelListener {
private HexagonTile previewTile;
private GameController gameController;
public MouseWheelController(HexagonTile previewTile, GameController gameController) {
this.previewTile = previewTile;
this.gameController = gameController;
}
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
Tile nextTile = gameController.getNextTile();
if (e.getWheelRotation() < 0) {
nextTile.rotateClockwise();
} else if (e.getWheelRotation() > 0) {
nextTile.rotateClockwise();
}
previewTile.repaint(); // Mettre à jour l'aperçu avec la nouvelle rotation
}
}

@ -6,11 +6,23 @@ public class Tile {
private TerrainType[] terrains; // 2 terrains maximum par tuile private TerrainType[] terrains; // 2 terrains maximum par tuile
private int segmentsForTerrain1; // Nombre de segments pour le premier terrain private int segmentsForTerrain1; // Nombre de segments pour le premier terrain
private static final Random random = new Random(); private static final Random random = new Random();
private int rotation;
public Tile() { public Tile() {
this.terrains = new TerrainType[2]; // Seulement deux terrains this.terrains = new TerrainType[2]; // Seulement deux terrains
generateTerrains(); generateTerrains();
assignSegments(); assignSegments();
this.rotation = 0; // Rotation initiale à 0
}
// Méthode pour tourner la tuile dans le sens des aiguilles d'une montre
public void rotateClockwise() {
rotation = (rotation + 1) % 6; // Modulo 6 pour garder une rotation entre 0 et 5
}
// Méthode pour obtenir la rotation actuelle
public int getRotation() {
return rotation;
} }
// Génère deux terrains aléatoires pour la tuile // Génère deux terrains aléatoires pour la tuile

@ -3,6 +3,7 @@ package view;
import controller.GameController; import controller.GameController;
import controller.CameraController; import controller.CameraController;
import controller.GameContext; import controller.GameContext;
import controller.MouseWheelController;
import model.Tile; import model.Tile;
import javax.swing.*; import javax.swing.*;
@ -10,8 +11,8 @@ import java.awt.*;
public class GameView extends JFrame { public class GameView extends JFrame {
private JPanel gridPanel; private JPanel gridPanel;
private Tile nextTile; private Tile nextTile; // Tuile en attente
private HexagonTile nextTilePreview; private HexagonTile nextTilePreview; // Composant pour afficher la tuile en attente
private GameController gameController; private GameController gameController;
private CameraController cameraController; private CameraController cameraController;
private GameContext gameContext; private GameContext gameContext;
@ -34,48 +35,42 @@ public class GameView extends JFrame {
add(gridPanel, BorderLayout.CENTER); add(gridPanel, BorderLayout.CENTER);
// Créer le panneau de contrôle à droite // Initialiser la tuile en attente et la preview
nextTile = new Tile();
nextTilePreview = new HexagonTile(null);
nextTilePreview.setTile(nextTile); // Lier nextTile à la preview
JPanel controlPanel = createControlPanel(); JPanel controlPanel = createControlPanel();
controlPanel.setPreferredSize(new Dimension(200, 600)); controlPanel.setPreferredSize(new Dimension(200, 600));
add(controlPanel, BorderLayout.EAST); add(controlPanel, BorderLayout.EAST);
// Initialiser les contrôleurs avec le contexte de jeu // Initialiser les contrôleurs avec le contexte de jeu
gameController = new GameController(gameContext, gridPanel, nextTile, nextTilePreview); gameController = new GameController(gameContext, gridPanel, nextTile, nextTilePreview); // Passer nextTile et nextTilePreview
cameraController = new CameraController(gridPanel, gameContext); cameraController = new CameraController(gridPanel, gameContext);
// Générer une première tuile pleine et la placer au centre // Ajouter un écouteur pour la molette de la souris
placeInitialTileWithRandomTile(); MouseWheelController wheelController = new MouseWheelController(nextTilePreview, gameController);
addMouseWheelListener(wheelController);
// Appeler l'initialisation du jeu
gameController.initializeGame(cameraController);
setVisible(true); setVisible(true);
} }
private JPanel createHexagonGrid() { private JPanel createHexagonGrid() {
JPanel panel = new JPanel(); JPanel panel = new JPanel();
panel.setLayout(null); panel.setLayout(null); // Permet de placer des composants avec des coordonnées absolues
panel.setBackground(Color.WHITE); panel.setBackground(Color.WHITE);
panel.setPreferredSize(new Dimension(800, 800)); panel.setPreferredSize(new Dimension(800, 800)); // Peut être ajusté si nécessaire
return panel; return panel;
} }
private void centerGridPanel() { private void centerGridPanel() {
int gridX = (getWidth() - gridPanel.getPreferredSize().width) / 2; int centerX = (getWidth() - gridPanel.getPreferredSize().width) / 2;
int gridY = (getHeight() - gridPanel.getPreferredSize().height) / 2; int centerY = (getHeight() - gridPanel.getPreferredSize().height) / 2;
gameContext.updateOffset(centerX, centerY);
gridPanel.setLocation(gridX, gridY); gameContext.repaintGrid(gridPanel); // Rappel pour centrer initialement les tuiles
gameContext.updateOffset(gridX, gridY); // Mettre à jour l'offset dans GameContext
}
private Tile generateRandomTile() {
return new Tile(); // Génère une tuile aléatoire avec des caractéristiques définies dans Tile.java
}
private void placeInitialTileWithRandomTile() {
// Générer une première tuile pleine de manière aléatoire
Tile initialTile = generateRandomTile();
// Utiliser `placeInitialTile` pour placer cette tuile au centre de la grille
Point initialPosition = new Point(0, 0);
gameController.placeInitialTile(initialPosition, cameraController, initialTile);
} }
private JPanel createControlPanel() { private JPanel createControlPanel() {
@ -87,7 +82,6 @@ public class GameView extends JFrame {
panel.add(new JLabel("Prochaine tuile : ")); panel.add(new JLabel("Prochaine tuile : "));
panel.add(Box.createRigidArea(new Dimension(0, 10))); panel.add(Box.createRigidArea(new Dimension(0, 10)));
nextTilePreview = new HexagonTile(null);
nextTilePreview.setPreferredSize(new Dimension(150, 150)); nextTilePreview.setPreferredSize(new Dimension(150, 150));
nextTilePreview.setBackground(Color.GRAY); nextTilePreview.setBackground(Color.GRAY);
nextTilePreview.setOpaque(true); nextTilePreview.setOpaque(true);

@ -1,16 +0,0 @@
package view;
import javax.swing.*;
import java.awt.*;
public class HexagonGridPanel extends JPanel {
public HexagonGridPanel() {
super(null); // Layout null pour gérer manuellement la position des composants
}
@Override
public Dimension getPreferredSize() {
return new Dimension(3000, 3000);
}
}

@ -27,6 +27,10 @@ public class HexagonTile extends JPanel {
repaint(); repaint();
} }
public Tile getTile() {
return tile;
}
public boolean isFilled() { public boolean isFilled() {
return this.tile != null; // Vérifie si la tuile a déjà été placée return this.tile != null; // Vérifie si la tuile a déjà été placée
} }
@ -45,8 +49,8 @@ public class HexagonTile extends JPanel {
g2d.setClip(largeHexagon); g2d.setClip(largeHexagon);
if (tile != null) { if (tile != null) {
// Dessiner les 6 segments de terrain en fonction des proportions // Dessiner les 6 segments de terrain en fonction des proportions et de la rotation
drawTerrainSegments(g2d, centerX, centerY, largeRadius); drawTerrainSegments(g2d, centerX, centerY, largeRadius, tile.getRotation());
} else { } else {
g2d.setColor(Color.LIGHT_GRAY); // Couleur par défaut pour une case vide g2d.setColor(Color.LIGHT_GRAY); // Couleur par défaut pour une case vide
g2d.fill(largeHexagon); g2d.fill(largeHexagon);
@ -59,14 +63,12 @@ public class HexagonTile extends JPanel {
g2d.draw(largeHexagon); g2d.draw(largeHexagon);
} }
// Dessiner les 6 segments de terrain avec une répartition variée // Dessiner les 6 segments de terrain avec la rotation
private void drawTerrainSegments(Graphics2D g2d, int centerX, int centerY, int radius) { private void drawTerrainSegments(Graphics2D g2d, int centerX, int centerY, int radius, int rotation) {
// Déterminer combien de segments sont attribués à chaque terrain
int segmentsTerrain1 = tile.getSegmentsForTerrain(0); int segmentsTerrain1 = tile.getSegmentsForTerrain(0);
// Dessiner les segments adjacents pour chaque terrain
for (int i = 0; i < 6; i++) { for (int i = 0; i < 6; i++) {
if (i < segmentsTerrain1) { int segmentIndex = (i + rotation) % 6; // Appliquer la rotation aux segments
if (segmentIndex < segmentsTerrain1) {
g2d.setColor(getTerrainColor(tile.getTerrain(0))); // Premier terrain g2d.setColor(getTerrainColor(tile.getTerrain(0))); // Premier terrain
} else { } else {
g2d.setColor(getTerrainColor(tile.getTerrain(1))); // Deuxième terrain g2d.setColor(getTerrainColor(tile.getTerrain(1))); // Deuxième terrain

@ -1,84 +0,0 @@
package view;
import model.Tile;
import model.TerrainType;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Path2D;
public class TileView extends JPanel {
private Tile tile;
public TileView(Tile tile) {
this.tile = tile;
setPreferredSize(new Dimension(100, 100));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
int centerX = getWidth() / 2;
int centerY = getHeight() / 2;
int largeRadius = 50;
// Créer la zone de découpe pour le grand hexagone
Shape largeHexagon = createHexagon(centerX, centerY, largeRadius);
g2d.setClip(largeHexagon);
// Diviser l'hexagone en 4 parties (quart de cercle) pour chaque terrain
drawTerrainQuadrants(g2d, centerX, centerY, largeRadius);
// Dessiner la bordure de l'hexagone
g2d.setClip(null);
g2d.setColor(Color.BLACK);
g2d.setStroke(new BasicStroke(3)); // Bordure épaisse
g2d.draw(largeHexagon);
}
// Dessiner les 4 quadrants de terrain
private void drawTerrainQuadrants(Graphics2D g2d, int centerX, int centerY, int radius) {
for (int i = 0; i < 4; i++) {
g2d.setColor(getTerrainColor(tile.getTerrain(i)));
g2d.fillArc(centerX - radius, centerY - radius, 2 * radius, 2 * radius, 90 * i, 90);
}
}
// Créer la forme hexagonale
private Shape createHexagon(int centerX, int centerY, int radius) {
Path2D hexagon = new Path2D.Double();
for (int i = 0; i < 6; i++) {
double angle = Math.toRadians(60 * i);
double x = centerX + radius * Math.cos(angle);
double y = centerY + radius * Math.sin(angle);
if (i == 0) {
hexagon.moveTo(x, y);
} else {
hexagon.lineTo(x, y);
}
}
hexagon.closePath();
return hexagon;
}
// Obtenir la couleur en fonction du type de terrain
private Color getTerrainColor(TerrainType terrain) {
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;
}
}
}