167 lines
4.4 KiB
Java
167 lines
4.4 KiB
Java
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 <code>BoardView</code>
|
||
*
|
||
* 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);
|
||
}
|
||
}
|
||
}
|
||
}
|