Files
Tetris/app/src/main/java/org/Views/VueGrille.java

154 lines
4.8 KiB
Java

package org.Views;
import javax.swing.*;
import org.Models.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.util.Observable;
import java.util.Observer;
@SuppressWarnings("deprecation")
public class VueGrille extends JPanel implements Observer, Runnable {
private JPanel grillePanel;
private Grille grille;
private Jeu jeu;
private Ordonnanceur ordonnanceur;
private boolean afficherFenetreFinPartie = false;
private int nbLignes;
private int nbColonnes;
private JPanel[][] casesGrille;
public VueGrille(Grille grille, Jeu jeu) {
this.grille = grille;
this.jeu = jeu;
this.nbLignes = grille.getNbLignes();
this.nbColonnes = grille.getNbColonnes();
setLayout(new BorderLayout());
initialiserVueGrille();
grille.addObserver(this);
jeu.addObserver(this);
this.ordonnanceur = new Ordonnanceur(this, 1000);
ordonnanceur.start();
}
public void resizeCases() {
int largeurPanel = grillePanel.getWidth();
int hauteurPanel = grillePanel.getHeight();
if (largeurPanel == 0 || hauteurPanel == 0) {
return;
}
int taille = Math.min(largeurPanel, hauteurPanel);
grillePanel.setPreferredSize(new Dimension(taille, taille));
grillePanel.setMaximumSize(new Dimension(taille, taille));
grillePanel.setMinimumSize(new Dimension(taille, taille));
grillePanel.setSize(new Dimension(taille, taille));
int tailleCaseX = largeurPanel / nbColonnes;
int tailleCaseY = hauteurPanel / nbLignes;
int tailleCase = Math.min(tailleCaseX, tailleCaseY);
Dimension taillePreferee = new Dimension(tailleCase, tailleCase);
for (int i = 0; i < nbLignes; i++) {
for (int j = 0; j < nbColonnes; j++) {
casesGrille[i][j].setPreferredSize(taillePreferee);
}
}
grillePanel.revalidate();
grillePanel.repaint();
}
private void initialiserVueGrille() {
grillePanel = new JPanel(new GridLayoutCarre(nbLignes, nbColonnes)); // pour que les cases soient carrés
add(grillePanel, BorderLayout.CENTER);
casesGrille = new JPanel[nbLignes][nbColonnes];
for (int i = 0; i < nbLignes; i++) {
for (int j = 0; j < nbColonnes; j++) {
JPanel caseG = new JPanel() {
@Override
public Dimension getPreferredSize() {
return super.getPreferredSize();
}
};
caseG.setBackground(Color.WHITE);
caseG.setBorder(BorderFactory.createLineBorder(Color.GRAY));
casesGrille[i][j] = caseG;
grillePanel.add(caseG);
}
}
}
public synchronized void updateGrille() {
for (int i = 0; i < nbLignes; i++) {
for (int j = 0; j < nbColonnes; j++) {
JPanel caseG = casesGrille[i][j];
if (grille.getGrille()[i][j]) {
caseG.setBackground(Color.BLUE);
} else {
caseG.setBackground(Color.WHITE);
}
}
}
// dessiner la pièce courante
if (jeu != null) {
PieceCourante piece = grille.getPieceCourante();
int posX = grille.getPieceCouranteX();
int posY = grille.getPieceCouranteY();
boolean[][] motif = piece.getMotif();
for (int i = 0; i < motif.length; i++) {
for (int j = 0; j < motif[i].length; j++) {
if (motif[i][j]) {
int grilleX = posX + j;
int grilleY = posY + i;
if (grilleY >= 0 && grilleY < nbLignes &&
grilleX >= 0 && grilleX < nbColonnes) {
JPanel caseG = casesGrille[grilleY][grilleX];
caseG.setBackground(Color.RED);
}
}
}
}
}
repaint();
}
private void afficherFinPartie() {
System.err.println("FIN PARTIE"); // TODO : gerer affichage ?
}
/**
* * Met à jour la vue de la grille lorsque l'état de la grille change.
*/
@Override
public void update(Observable o, Object arg) {
if (o instanceof Grille) {
updateGrille();
}
if (o instanceof Jeu && !afficherFenetreFinPartie) {
if (!this.jeu.jeuEnCours) {
afficherFenetreFinPartie = true;
afficherFinPartie();
}
}
}
/**
* * Met à jour la vue de la grille périodiquement selon l'ordonnaceur.
*/
@Override
public void run() {
updateGrille();
}
}