Séparation des classes BoardView et BackgroundLayer

This commit is contained in:
2026-02-03 09:17:10 +01:00
parent fdba5f0f2f
commit 6eb63cacaa
2 changed files with 196 additions and 192 deletions

View File

@@ -0,0 +1,37 @@
package fr.iut_fbleau.Avalam;
import javax.swing.*;
import java.awt.*;
/**
* La classe <code>BackgroundLayer</code>
*
* Sous composant de BoardView affichant limage de fond.
*/
public class BackgroundLayer extends JComponent {
private Image img;
/**
* Construit une couche de fond.
*
* @param resourcePath chemin de l'image de fond
*/
public BackgroundLayer(String resourcePath) {
img = Toolkit.getDefaultToolkit().getImage(
getClass().getClassLoader().getResource(resourcePath)
);
}
/**
* Dessine l'image de fond.
*
* @param g contexte graphique
*/
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (img != null) {
g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
}
}
}

View File

@@ -1,192 +1,159 @@
package fr.iut_fbleau.Avalam; package fr.iut_fbleau.Avalam;
import javax.swing.*; import javax.swing.*;
import java.awt.*; import java.awt.*;
/** /**
* La classe <code>BoardView</code> * La classe <code>BoardView</code>
* *
* Représente la vue principale du plateau Avalam. * Représente la vue principale du plateau Avalam.
* Elle gère : * Elle gère :
* - laffichage des tours (PieceLayer) * - laffichage des tours (PieceLayer)
* - laffichage des coups possibles (HighlightLayer) * - laffichage des coups possibles (HighlightLayer)
* - laffichage du fond graphique * - laffichage du fond graphique (BackgroundLayer)
* - les clics via InteractionController * - les clics via InteractionController
* *
* Cette classe ne contient aucune logique de règles du jeu. * Cette classe ne contient aucune logique de règles du jeu.
* *
* @version 1.0 * @version 1.0
* Date : * Date :
* Licence : * Licence :
*/ */
public class BoardView extends JLayeredPane { public class BoardView extends JLayeredPane {
//Attributs //Attributs
/** Référence au moteur Avalam. */ /** Référence au moteur Avalam. */
private AvalamBoard board; private AvalamBoard board;
/** Couche daffichage du fond. */ /** Couche daffichage du fond. */
private BackgroundLayer backgroundLayer; private BackgroundLayer backgroundLayer;
/** Couche daffichage des coups possibles. */ /** Couche daffichage des coups possibles. */
private HighlightLayer highlightLayer; private HighlightLayer highlightLayer;
/** Couche daffichage des pièces. */ /** Couche daffichage des pièces. */
private PieceLayer pieceLayer; private PieceLayer pieceLayer;
/** Contrôleur des interactions. */ /** Contrôleur des interactions. */
private InteractionController controller; private InteractionController controller;
/** Taille dun pion en pixels. */ /** Taille dun pion en pixels. */
private final int size = 50; private final int size = 50;
/** Espacement entre les cases. */ /** Espacement entre les cases. */
private final int spacing = 70; private final int spacing = 70;
/** Décalage horizontal du plateau. */ /** Décalage horizontal du plateau. */
private final int xBase = 60; private final int xBase = 60;
/** Décalage vertical du plateau. */ /** Décalage vertical du plateau. */
private final int yBase = 60; private final int yBase = 60;
/** Callback vers AvalamWindow pour mise à jour (score, tour, fin). */ /** Callback vers AvalamWindow pour mise à jour (score, tour, fin). */
private Runnable boardUpdateCallback; private Runnable boardUpdateCallback;
//Constructeur //Constructeur
/** /**
* Construit la vue du plateau. * Construit la vue du plateau.
* *
* @param board moteur du jeu * @param board moteur du jeu
* @param boardUpdateCallback callback à appeler après un coup * @param boardUpdateCallback callback à appeler après un coup
*/ */
public BoardView(AvalamBoard board, Runnable boardUpdateCallback) { public BoardView(AvalamBoard board, Runnable boardUpdateCallback) {
this.board = board; this.board = board;
this.boardUpdateCallback = boardUpdateCallback; this.boardUpdateCallback = boardUpdateCallback;
setLayout(null); setLayout(null);
// Contrôleur // Contrôleur
this.controller = new InteractionController(board, this); this.controller = new InteractionController(board, this);
// Couche fond // Couche fond
backgroundLayer = new BackgroundLayer("fr/iut_fbleau/Res/BackgroundAvalam.png"); backgroundLayer = new BackgroundLayer("fr/iut_fbleau/Res/BackgroundAvalam.png");
backgroundLayer.setBounds(0, 0, 725, 725); backgroundLayer.setBounds(0, 0, 725, 725);
add(backgroundLayer, JLayeredPane.FRAME_CONTENT_LAYER); add(backgroundLayer, JLayeredPane.FRAME_CONTENT_LAYER);
// Couche highlight // Couche highlight
highlightLayer = new HighlightLayer(xBase, yBase, spacing, size); highlightLayer = new HighlightLayer(xBase, yBase, spacing, size);
add(highlightLayer, JLayeredPane.DEFAULT_LAYER); add(highlightLayer, JLayeredPane.DEFAULT_LAYER);
// Couche pièces // Couche pièces
pieceLayer = new PieceLayer(); pieceLayer = new PieceLayer();
add(pieceLayer, JLayeredPane.PALETTE_LAYER); add(pieceLayer, JLayeredPane.PALETTE_LAYER);
setPreferredSize(new Dimension(725, 725)); setPreferredSize(new Dimension(725, 725));
refresh(); refresh();
} }
//Méthodes //Méthodes
/** /**
* Retourne le contrôleur d'interactions (utile pour simuler les clics du bot). * Retourne le contrôleur d'interactions (utile pour simuler les clics du bot).
* *
* @return contrôleur * @return contrôleur
*/ */
public InteractionController getController() { public InteractionController getController() {
return controller; return controller;
} }
/** /**
* Active/désactive les interactions utilisateur sur le plateau. * Active/désactive les interactions utilisateur sur le plateau.
* Utile pendant l'animation du bot pour éviter des clics concurrents. * Utile pendant l'animation du bot pour éviter des clics concurrents.
* *
* @param enabled true pour activer, false pour désactiver * @param enabled true pour activer, false pour désactiver
*/ */
public void setInteractionEnabled(boolean enabled) { public void setInteractionEnabled(boolean enabled) {
// Désactive la couche des pièces (boutons) principalement // Désactive la couche des pièces (boutons) principalement
pieceLayer.setEnabled(enabled); pieceLayer.setEnabled(enabled);
for (Component c : pieceLayer.getComponents()) { for (Component c : pieceLayer.getComponents()) {
c.setEnabled(enabled); c.setEnabled(enabled);
} }
} }
/** /**
* Appelé par le contrôleur après un coup. * Appelé par le contrôleur après un coup.
*/ */
public void onBoardUpdated() { public void onBoardUpdated() {
if (boardUpdateCallback != null) { if (boardUpdateCallback != null) {
boardUpdateCallback.run(); boardUpdateCallback.run();
} }
} }
/** /**
* Rafraîchit les couches visuelles. * Rafraîchit les couches visuelles.
*/ */
public void refresh() { public void refresh() {
pieceLayer.displayGrid( pieceLayer.displayGrid(
boardGrid(), boardGrid(),
xBase, yBase, spacing, size, xBase, yBase, spacing, size,
(r, c) -> controller.onPieceClicked(r, c) (r, c) -> controller.onPieceClicked(r, c)
); );
highlightLayer.setLegalMoves(controller.getLegalMoves()); highlightLayer.setLegalMoves(controller.getLegalMoves());
backgroundLayer.repaint(); backgroundLayer.repaint();
highlightLayer.repaint(); highlightLayer.repaint();
pieceLayer.repaint(); pieceLayer.repaint();
repaint(); repaint();
} }
/** /**
* Récupère la grille depuis le moteur. * Récupère la grille depuis le moteur.
* *
* @return grille 9x9 de tours * @return grille 9x9 de tours
*/ */
private Tower[][] boardGrid() { private Tower[][] boardGrid() {
Tower[][] grid = new Tower[AvalamBoard.SIZE][AvalamBoard.SIZE]; Tower[][] grid = new Tower[AvalamBoard.SIZE][AvalamBoard.SIZE];
for (int r = 0; r < AvalamBoard.SIZE; r++) { for (int r = 0; r < AvalamBoard.SIZE; r++) {
for (int c = 0; c < AvalamBoard.SIZE; c++) { for (int c = 0; c < AvalamBoard.SIZE; c++) {
grid[r][c] = board.getTowerAt(r, c); grid[r][c] = board.getTowerAt(r, c);
} }
} }
return grid; return grid;
} }
}
//Affichage
/**
* Composant affichant limage de fond.
*/
private static class BackgroundLayer extends JComponent {
private Image img;
/**
* Construit une couche de fond.
*
* @param resourcePath chemin de l'image de fond
*/
public BackgroundLayer(String resourcePath) {
img = Toolkit.getDefaultToolkit().getImage(
getClass().getClassLoader().getResource(resourcePath)
);
}
/**
* Dessine l'image de fond.
*
* @param g contexte graphique
*/
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (img != null) {
g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
}
}
}
}