Files
BUT3ProjetJeuGroupe/fr/iut_fbleau/Avalam/AvalamPanel.java
2025-11-20 13:25:09 -05:00

185 lines
5.6 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 javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
/**
* La classe <code>AvalamPanel</code> gère l'affichage graphique du plateau Avalam.
*
* Elle a pour rôle :
* - de charger la configuration initiale du plateau depuis le fichier Plateau.txt
* - d'afficher les pions sous forme de boutons ronds cliquables
* - de gérer leur positionnement visuel sur une fenêtre Swing
*
* À ce stade, les clics ne modifient pas le modèle (aucune règle appliquée),
* ils servent seulement à confirmer que la sélection fonctionne.
*
* @version 1.0
* @author ---
*/
public class AvalamPanel extends JPanel {
/** Grille du plateau contenant des objets Tower ou null (case vide). */
private Tower[][] grid = new Tower[9][9];
/** Taille visuelle dun pion. */
private final int pionTaille = 50;
/** Distance entre deux pions. */
private final int pas = 70;
/** Décalage horizontal pour centrer le plateau. */
private final int xBase = 60;
/** Décalage vertical pour centrer le plateau. */
private final int yBase = 60;
/**
* Constructeur.
* Initialise le layout, charge le plateau et affiche les pions.
*/
public AvalamPanel() {
setLayout(null);
chargerPlateau();
afficherPions();
}
/**
* Charge la grille du plateau depuis le fichier Plateau.txt (matrice du plateau).
*
* 0 → case vide
* 1 → pion du joueur 1 (couleur YELLOW)
* 2 → pion du joueur 2 (couleur RED)
*/
private void chargerPlateau() {
try {
File f = new File("fr/iut_fbleau/Res/Plateau.txt");
BufferedReader br = new BufferedReader(new FileReader(f));
String line;
int row = 0;
while ((line = br.readLine()) != null && row < 9) {
String[] parts = line.split(",");
for (int col = 0; col < 9; col++) {
int valeur = Integer.parseInt(parts[col]);
if (valeur == 1) grid[row][col] = new Tower(Color.YELLOW);
else if (valeur == 2) grid[row][col] = new Tower(Color.RED);
else grid[row][col] = null;
}
row++;
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Ajoute graphiquement les pions sur le plateau.
* Chaque pion est représenté par un bouton rond Swing.
*/
private void afficherPions() {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
Tower t = grid[i][j];
if (t != null) {
// Conversion couleur Avalam → couleur Swing
java.awt.Color swingColor = t.getColor().getSwingColor();
JButton pion = creerBoutonRond(swingColor);
int x = xBase + j * pas;
int y = yBase + i * pas;
pion.setBounds(x, y, pionTaille, pionTaille);
int finalI = i;
int finalJ = j;
// !!!TEMPORAIRE!!! permet de voir quel endroit cliqué
pion.addActionListener(e ->
JOptionPane.showMessageDialog(null,
"Tu as cliqué sur (" + finalI + ", " + finalJ + ")")
);
add(pion);
}
}
}
}
/**
* Crée un bouton rond représentant un pion.
*
* Un effet d'assombrissement est appliqué au survol pour un meilleur feedback visuel.
*
* @param couleurSwing la couleur Swing du pion
* @return un bouton circulaire
*/
private JButton creerBoutonRond(java.awt.Color couleurSwing) {
JButton bouton = new JButton() {
/** Indique si la souris survole le bouton. */
private boolean hover = false;
{
setBorderPainted(false);
setContentAreaFilled(false);
setFocusPainted(false);
setOpaque(false);
// Gestion du survol
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
hover = true;
repaint();
}
@Override
public void mouseExited(MouseEvent e) {
hover = false;
repaint();
}
});
}
/**
* Dessine le pion sous forme de cercle.
*/
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(hover ? couleurSwing.darker() : couleurSwing);
g2.fillOval(0, 0, getWidth(), getHeight());
g2.dispose();
}
/**
* Rend le clique précis au cercle (pas carré).
*/
@Override
public boolean contains(int x, int y) {
double dx = x - getWidth() / 2.0;
double dy = y - getHeight() / 2.0;
return dx * dx + dy * dy <= (getWidth() / 2.0) * (getWidth() / 2.0);
}
};
bouton.setPreferredSize(new Dimension(pionTaille, pionTaille));
return bouton;
}
}