85 lines
2.3 KiB
Java
85 lines
2.3 KiB
Java
|
|
package fr.iut_fbleau.Avalam.ui;
|
|||
|
|
|
|||
|
|
import fr.iut_fbleau.Avalam.logic.GameState;
|
|||
|
|
|
|||
|
|
import javax.swing.*;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* La classe <code>BoardView</code> représente l'affichage complet du plateau Avalam.
|
|||
|
|
* Elle s’appuie sur une architecture en couches (layered pane) pour séparer proprement :
|
|||
|
|
*
|
|||
|
|
* <ul>
|
|||
|
|
* <li><b>HighlightLayer</b> : les cases jouables mises en surbrillance</li>
|
|||
|
|
* <li><b>PieceLayer</b> : les pions affichés sous forme de boutons ronds</li>
|
|||
|
|
* </ul>
|
|||
|
|
*
|
|||
|
|
* La vue ne contient pas la logique de jeu : elle la délègue entièrement
|
|||
|
|
* à un <code>InteractionController</code>.
|
|||
|
|
*
|
|||
|
|
* @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();
|
|||
|
|
}
|
|||
|
|
}
|