package fr.iut_fbleau.Avalam.ui; import fr.iut_fbleau.Avalam.logic.GameState; import javax.swing.*; /** * La classe BoardView représente l'affichage complet du plateau Avalam. * Elle s’appuie sur une architecture en couches (layered pane) pour séparer proprement : * * * * La vue ne contient pas la logique de jeu : elle la délègue entièrement * à un InteractionController. * * @author * @version 1.0 */ public class BoardView extends JLayeredPane { /** Taille des pions affichés. */ private final int size = 50; /** Distance entre deux cases de la grille. */ private final int spacing = 70; /** Décalages pour centrer l'affichage. */ private final int xBase = 60, yBase = 60; /** Accès à l'état du jeu. */ private GameState state; /** Couche d'affichage des ronds verts. */ private HighlightLayer highlightLayer; /** Couche d'affichage des pions. */ private PieceLayer pieceLayer; /** Gestionnaire d'interactions utilisateur. */ private InteractionController controller; /** * Constructeur de la vue du plateau. * * @param state l'état du jeu Avalam */ public BoardView(GameState state) { this.state = state; setLayout(null); controller = new InteractionController(state); highlightLayer = new HighlightLayer(xBase, yBase, spacing, size); pieceLayer = new PieceLayer(); add(highlightLayer, JLayeredPane.DEFAULT_LAYER); add(pieceLayer, JLayeredPane.PALETTE_LAYER); refresh(); } /** * Met à jour l'affichage des couches en fonction de l'état actuel du jeu. */ public void refresh() { pieceLayer.displayGrid( state.getGrid(), xBase, yBase, spacing, size, // Callback appelé lorsqu’un pion est cliqué (r, c) -> { controller.onPieceClicked(r, c); highlightLayer.setLegalMoves(controller.getLegalMoves()); highlightLayer.repaint(); } ); highlightLayer.repaint(); } }