2 Commits

Author SHA1 Message Date
25f8dcdc76 Fond avalam board sans .class 2025-11-27 14:06:21 -05:00
823b0fcae0 Fond avalam board 2025-11-27 14:06:05 -05:00

View File

@@ -12,20 +12,21 @@ import java.awt.*;
* Elle gère :
* - laffichage des tours (PieceLayer)
* - laffichage des coups possibles (HighlightLayer)
* - un fond graphique personnalisé
* - les clics via InteractionController
*
* Toute la logique de jeu est déléguée au moteur AvalamBoard
* et au contrôleur InteractionController.
*/
public class BoardView extends JLayeredPane {
/** Référence au moteur Avalam */
private AvalamBoard board;
/** Couche daffichage du fond */
private BackgroundLayer backgroundLayer;
/** Couche daffichage des rond verts */
private HighlightLayer highlightLayer;
/** Couche daffichage des tours */
/** Couche daffichage des pièces */
private PieceLayer pieceLayer;
/** Contrôleur des interactions */
@@ -37,14 +38,11 @@ public class BoardView extends JLayeredPane {
private final int xBase = 60;
private final int yBase = 60;
/** Callback vers AvalamWindow pour mises à jour (score, tour, fin de partie) */
/** Callback vers AvalamWindow pour mises à jour (score, tour, fin) */
private Runnable boardUpdateCallback;
/**
* Constructeur de la vue du plateau.
*
* @param board moteur Avalam utilisé pour afficher la grille
* @param boardUpdateCallback callback appelé après chaque coup
* Constructeur.
*/
public BoardView(AvalamBoard board, Runnable boardUpdateCallback) {
this.board = board;
@@ -52,28 +50,29 @@ public class BoardView extends JLayeredPane {
setLayout(null);
// Contrôleur
// --- Contrôleur ---
this.controller = new InteractionController(board, this);
// Couche Highlight
// --- 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
// --- Couche des pièces ---
pieceLayer = new PieceLayer();
add(pieceLayer, JLayeredPane.PALETTE_LAYER);
setPreferredSize(new Dimension(800, 800));
setPreferredSize(new Dimension(725, 725));
refresh();
}
/**
* Appelée par InteractionController quand un coup est joué.
* Permet à AvalamWindow de rafraîchir :
* - scores
* - affichage du joueur courant
* - détection fin de partie
* Appelé par le contrôleur après un coup.
*/
public void onBoardUpdated() {
if (boardUpdateCallback != null) {
@@ -82,27 +81,26 @@ public class BoardView extends JLayeredPane {
}
/**
* Met à jour toutes les couches visuelles.
* Rafraîchit les couches visuelles.
*/
public void refresh() {
// Mise à jour des pièces
pieceLayer.displayGrid(
boardGrid(),
xBase, yBase, spacing, size,
(r, c) -> controller.onPieceClicked(r, c)
);
// Mise à jour des highlights
highlightLayer.setLegalMoves(controller.getLegalMoves());
backgroundLayer.repaint();
highlightLayer.repaint();
pieceLayer.repaint();
repaint();
}
/**
* Renvoie la grille de tours depuis AvalamBoard.
* Récupère la grille depuis le moteur.
*/
private Tower[][] boardGrid() {
Tower[][] grid = new Tower[AvalamBoard.SIZE][AvalamBoard.SIZE];
@@ -112,7 +110,27 @@ public class BoardView extends JLayeredPane {
grid[r][c] = board.getTowerAt(r, c);
}
}
return grid;
}
/**
* Composant affichant limage de fond.
*/
private static class BackgroundLayer extends JComponent {
private Image img;
public BackgroundLayer(String resourcePath) {
img = Toolkit.getDefaultToolkit().getImage(
getClass().getClassLoader().getResource(resourcePath)
);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (img != null) {
g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
}
}
}
}