package fr.iut_fbleau.Avalam; import fr.iut_fbleau.Avalam.AvalamBoard; import fr.iut_fbleau.Avalam.Tower; import javax.swing.*; import java.awt.*; /** * La classe BoardView * * Représente la vue principale du plateau Avalam. * Elle gère : * - l’affichage des tours (PieceLayer) * - l’affichage des coups possibles (HighlightLayer) * - l’affichage du fond graphique * - la gestion des interactions via InteractionController * * Cette classe ne contient aucune logique de jeu. */ public class BoardView extends JLayeredPane { //Attributs /** Référence au moteur du jeu Avalam. */ private AvalamBoard board; /** Couche graphique du fond du plateau. */ private BackgroundLayer backgroundLayer; /** Couche graphique des déplacements possibles. */ private HighlightLayer highlightLayer; /** Couche graphique des pièces (tours). */ private PieceLayer pieceLayer; /** Contrôleur des interactions utilisateur. */ private InteractionController controller; /** Taille d’un pion en pixels. */ private final int size = 50; /** Espacement entre deux cases du plateau. */ private final int spacing = 70; /** Décalage horizontal du plateau. */ private final int xBase = 60; /** Décalage vertical du plateau. */ private final int yBase = 60; /** Callback vers AvalamWindow pour mettre à jour l’interface (score, tour, fin). */ private Runnable boardUpdateCallback; //Constructeur /** * Construit la vue du plateau Avalam. * * @param board moteur du jeu Avalam * @param boardUpdateCallback fonction de rappel après un coup */ public BoardView(AvalamBoard board, Runnable boardUpdateCallback) { this.board = board; this.boardUpdateCallback = boardUpdateCallback; setLayout(null); // --- Contrôleur --- this.controller = new InteractionController(board, this); // --- Couche fond --- backgroundLayer = new BackgroundLayer("fr/iut_fbleau/Res/BackgroundAvalam.png"); backgroundLayer.setBounds(0, 0, 725, 725); add(backgroundLayer, JLayeredPane.FRAME_CONTENT_LAYER); // --- Couche highlight --- highlightLayer = new HighlightLayer(xBase, yBase, spacing, size); add(highlightLayer, JLayeredPane.DEFAULT_LAYER); // --- Couche des pièces --- pieceLayer = new PieceLayer(); add(pieceLayer, JLayeredPane.PALETTE_LAYER); setPreferredSize(new Dimension(725, 725)); refresh(); } //Méthodes /** * Appelé par le contrôleur après un coup. */ public void onBoardUpdated() { if (boardUpdateCallback != null) { boardUpdateCallback.run(); } } /** * Rafraîchit l’affichage du plateau. */ public void refresh() { pieceLayer.displayGrid( boardGrid(), xBase, yBase, spacing, size, (r, c) -> controller.onPieceClicked(r, c) ); highlightLayer.setLegalMoves(controller.getLegalMoves()); backgroundLayer.repaint(); highlightLayer.repaint(); pieceLayer.repaint(); repaint(); } /** * Récupère la grille actuelle du moteur de jeu. * * @return grille 9x9 de tours */ private Tower[][] boardGrid() { Tower[][] grid = new Tower[AvalamBoard.SIZE][AvalamBoard.SIZE]; for (int r = 0; r < AvalamBoard.SIZE; r++) { for (int c = 0; c < AvalamBoard.SIZE; c++) { grid[r][c] = board.getTowerAt(r, c); } } return grid; } //Affichage /** * Classe interne représentant la couche graphique du fond. */ private static class BackgroundLayer extends JComponent { private Image img; /** * Construit une couche de fond à partir d’une image. * * @param resourcePath chemin de l’image */ public BackgroundLayer(String resourcePath) { img = Toolkit.getDefaultToolkit().getImage( getClass().getClassLoader().getResource(resourcePath) ); } /** * Dessine l’image de fond. */ @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (img != null) { g.drawImage(img, 0, 0, getWidth(), getHeight(), this); } } } }