2025-11-22 11:56:51 -05:00
|
|
|
|
package fr.iut_fbleau.Avalam.ui;
|
|
|
|
|
|
|
2025-11-25 16:02:23 -05:00
|
|
|
|
import fr.iut_fbleau.Avalam.AvalamBoard;
|
|
|
|
|
|
import fr.iut_fbleau.Avalam.Tower;
|
2025-11-22 11:56:51 -05:00
|
|
|
|
|
|
|
|
|
|
import javax.swing.*;
|
2025-11-25 16:02:23 -05:00
|
|
|
|
import java.awt.*;
|
2025-11-22 11:56:51 -05:00
|
|
|
|
|
|
|
|
|
|
/**
|
2025-11-25 16:02:23 -05:00
|
|
|
|
* BoardView est la vue principale du plateau Avalam.
|
2025-11-22 11:56:51 -05:00
|
|
|
|
*
|
2025-11-25 16:02:23 -05:00
|
|
|
|
* Elle gère :
|
|
|
|
|
|
* - l’affichage des tours (PieceLayer)
|
|
|
|
|
|
* - l’affichage des coups possibles (HighlightLayer)
|
2025-11-27 14:06:05 -05:00
|
|
|
|
* - un fond graphique personnalisé
|
2025-11-25 16:02:23 -05:00
|
|
|
|
* - les clics via InteractionController
|
2025-11-22 11:56:51 -05:00
|
|
|
|
*/
|
|
|
|
|
|
public class BoardView extends JLayeredPane {
|
|
|
|
|
|
|
2025-11-25 16:02:23 -05:00
|
|
|
|
/** Référence au moteur Avalam */
|
|
|
|
|
|
private AvalamBoard board;
|
2025-11-22 11:56:51 -05:00
|
|
|
|
|
2025-11-27 14:06:05 -05:00
|
|
|
|
/** Couche d’affichage du fond */
|
|
|
|
|
|
private BackgroundLayer backgroundLayer;
|
|
|
|
|
|
|
2025-11-25 16:02:23 -05:00
|
|
|
|
/** Couche d’affichage des rond verts */
|
2025-11-22 11:56:51 -05:00
|
|
|
|
private HighlightLayer highlightLayer;
|
|
|
|
|
|
|
2025-11-27 14:06:05 -05:00
|
|
|
|
/** Couche d’affichage des pièces */
|
2025-11-22 11:56:51 -05:00
|
|
|
|
private PieceLayer pieceLayer;
|
|
|
|
|
|
|
2025-11-25 16:02:23 -05:00
|
|
|
|
/** Contrôleur des interactions */
|
2025-11-22 11:56:51 -05:00
|
|
|
|
private InteractionController controller;
|
|
|
|
|
|
|
2025-11-25 16:02:23 -05:00
|
|
|
|
/** Décalages et dimensions pour l'affichage */
|
|
|
|
|
|
private final int size = 50;
|
|
|
|
|
|
private final int spacing = 70;
|
|
|
|
|
|
private final int xBase = 60;
|
|
|
|
|
|
private final int yBase = 60;
|
|
|
|
|
|
|
2025-11-27 14:06:05 -05:00
|
|
|
|
/** Callback vers AvalamWindow pour mises à jour (score, tour, fin) */
|
2025-11-25 16:02:23 -05:00
|
|
|
|
private Runnable boardUpdateCallback;
|
|
|
|
|
|
|
2025-11-22 11:56:51 -05:00
|
|
|
|
/**
|
2025-11-27 14:06:05 -05:00
|
|
|
|
* Constructeur.
|
2025-11-22 11:56:51 -05:00
|
|
|
|
*/
|
2025-11-25 16:02:23 -05:00
|
|
|
|
public BoardView(AvalamBoard board, Runnable boardUpdateCallback) {
|
|
|
|
|
|
this.board = board;
|
|
|
|
|
|
this.boardUpdateCallback = boardUpdateCallback;
|
|
|
|
|
|
|
2025-11-22 11:56:51 -05:00
|
|
|
|
setLayout(null);
|
|
|
|
|
|
|
2025-11-27 14:06:05 -05:00
|
|
|
|
// --- Contrôleur ---
|
2025-11-25 16:02:23 -05:00
|
|
|
|
this.controller = new InteractionController(board, this);
|
2025-11-22 11:56:51 -05:00
|
|
|
|
|
2025-11-27 14:06:05 -05:00
|
|
|
|
// --- 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 ---
|
2025-11-22 11:56:51 -05:00
|
|
|
|
highlightLayer = new HighlightLayer(xBase, yBase, spacing, size);
|
|
|
|
|
|
add(highlightLayer, JLayeredPane.DEFAULT_LAYER);
|
2025-11-25 16:02:23 -05:00
|
|
|
|
|
2025-11-27 14:06:05 -05:00
|
|
|
|
// --- Couche des pièces ---
|
2025-11-25 16:02:23 -05:00
|
|
|
|
pieceLayer = new PieceLayer();
|
2025-11-22 11:56:51 -05:00
|
|
|
|
add(pieceLayer, JLayeredPane.PALETTE_LAYER);
|
|
|
|
|
|
|
2025-11-27 14:06:05 -05:00
|
|
|
|
setPreferredSize(new Dimension(725, 725));
|
2025-11-25 16:02:23 -05:00
|
|
|
|
|
2025-11-22 11:56:51 -05:00
|
|
|
|
refresh();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2025-11-27 14:06:05 -05:00
|
|
|
|
* Appelé par le contrôleur après un coup.
|
2025-11-25 16:02:23 -05:00
|
|
|
|
*/
|
|
|
|
|
|
public void onBoardUpdated() {
|
|
|
|
|
|
if (boardUpdateCallback != null) {
|
|
|
|
|
|
boardUpdateCallback.run();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2025-11-27 14:06:05 -05:00
|
|
|
|
* Rafraîchit les couches visuelles.
|
2025-11-22 11:56:51 -05:00
|
|
|
|
*/
|
|
|
|
|
|
public void refresh() {
|
|
|
|
|
|
|
|
|
|
|
|
pieceLayer.displayGrid(
|
2025-11-25 16:02:23 -05:00
|
|
|
|
boardGrid(),
|
|
|
|
|
|
xBase, yBase, spacing, size,
|
|
|
|
|
|
(r, c) -> controller.onPieceClicked(r, c)
|
2025-11-22 11:56:51 -05:00
|
|
|
|
);
|
|
|
|
|
|
|
2025-11-25 16:02:23 -05:00
|
|
|
|
highlightLayer.setLegalMoves(controller.getLegalMoves());
|
|
|
|
|
|
|
2025-11-27 14:06:05 -05:00
|
|
|
|
backgroundLayer.repaint();
|
2025-11-22 11:56:51 -05:00
|
|
|
|
highlightLayer.repaint();
|
2025-11-25 16:02:23 -05:00
|
|
|
|
pieceLayer.repaint();
|
|
|
|
|
|
repaint();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2025-11-27 14:06:05 -05:00
|
|
|
|
* Récupère la grille depuis le moteur.
|
2025-11-25 16:02:23 -05:00
|
|
|
|
*/
|
|
|
|
|
|
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;
|
2025-11-22 11:56:51 -05:00
|
|
|
|
}
|
2025-11-27 14:06:05 -05:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Composant affichant l’image 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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-11-22 11:56:51 -05:00
|
|
|
|
}
|