Files
BUT3ProjetJeuGroupe/fr/iut_fbleau/Avalam/BoardView.java

167 lines
4.4 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 :
* - laffichage des tours (PieceLayer)
* - laffichage des coups possibles (HighlightLayer)
* - laffichage 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 dun 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 linterface (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 laffichage 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 dune image.
*
* @param resourcePath chemin de limage
*/
public BackgroundLayer(String resourcePath) {
img = Toolkit.getDefaultToolkit().getImage(
getClass().getClassLoader().getResource(resourcePath)
);
}
/**
* Dessine limage de fond.
*/
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (img != null) {
g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
}
}
}
}