Ajoute de l'arret de la musique en fin de partie + arret propre de l'ordonanceur

This commit is contained in:
ROGER
2025-05-16 17:10:15 +02:00
parent 2fec9fc96e
commit 27862eb3cd
8 changed files with 56 additions and 52 deletions

View File

@@ -4,8 +4,10 @@
package org; package org;
import org.Controllers.IO; import org.Controllers.IO;
import org.Controllers.TetrisBandeauControleur;
import org.Models.Grille; import org.Models.Grille;
import org.Models.Jeu; import org.Models.Jeu;
import org.Models.Musique;
import org.Views.VueTetris; import org.Views.VueTetris;
public class App { public class App {
@@ -18,7 +20,9 @@ public class App {
// Models // Models
Grille grille = new Grille(20, 10); Grille grille = new Grille(20, 10);
Jeu jeu = new Jeu(grille); Musique musique = new Musique();
musique.start();
Jeu jeu = new Jeu(grille,musique);
// Views // Views
VueTetris vueTetris = new VueTetris(grille, jeu); VueTetris vueTetris = new VueTetris(grille, jeu);
@@ -26,5 +30,7 @@ public class App {
// Controllers // Controllers
IO io = new IO(jeu); IO io = new IO(jeu);
vueTetris.addKeyListener(io); vueTetris.addKeyListener(io);
new TetrisBandeauControleur(vueTetris.getVueBandeauControle(), musique);//Création d'un controleur de bandeau avec la musique instanciée
} }
} }

View File

@@ -12,17 +12,11 @@ public class TetrisBandeauControleur {
private Musique musique; private Musique musique;
private VueBandeauControle vueControle; private VueBandeauControle vueControle;
public TetrisBandeauControleur(VueBandeauControle vueControle) { public TetrisBandeauControleur(VueBandeauControle vueControle, Musique musique) {
this.vueControle = vueControle; this.vueControle = vueControle;
this.musique = new Musique(); this.musique = musique;
musique.start();// demarer musique
// action play/pause // action play/pause
this.vueControle.getPauseButton().addActionListener(new ActionListener() { this.vueControle.getPauseButton().addActionListener(e -> switchPlayPause());
@Override
public void actionPerformed(ActionEvent e) {
switchPlayPause();
}
});
vueControle.getQuitterButton().addActionListener(e -> { vueControle.getQuitterButton().addActionListener(e -> {
System.out.println("Fermeture de l'application..."); System.out.println("Fermeture de l'application...");
System.exit(0); System.exit(0);

View File

@@ -9,6 +9,7 @@ import org.Models.Pieces.PieceL;
public class Jeu extends Observable implements Runnable { public class Jeu extends Observable implements Runnable {
private Grille grille; private Grille grille;
private Ordonnanceur ordonnanceur; private Ordonnanceur ordonnanceur;
private Musique musique;
private PieceCourante pieceSuivante; private PieceCourante pieceSuivante;
private int pieceSuivanteX; private int pieceSuivanteX;
@@ -19,8 +20,9 @@ public class Jeu extends Observable implements Runnable {
public boolean jeuEnCours = true; public boolean jeuEnCours = true;
public Jeu(Grille grille) { public Jeu(Grille grille, Musique musique) {
this.grille = grille; this.grille = grille;
this.musique = musique;
this.grille.setPieceCourante(getNouvellePiece()); this.grille.setPieceCourante(getNouvellePiece());
this.pieceSuivante = getNouvellePiece(); this.pieceSuivante = getNouvellePiece();
@@ -65,6 +67,10 @@ public class Jeu extends Observable implements Runnable {
public void finPartie() { public void finPartie() {
this.jeuEnCours = false; this.jeuEnCours = false;
ordonnanceur.interrupt(); ordonnanceur.interrupt();
if (musique != null) {
System.out.println("Arret musique");
musique.arreterMusique();
}
setChanged(); setChanged();
notifyObservers(); notifyObservers();
} }
@@ -72,6 +78,9 @@ public class Jeu extends Observable implements Runnable {
@Override @Override
public void run() { public void run() {
// TODO: game logic here // TODO: game logic here
if (!jeuEnCours) {
return;
}
if (estFinPartie()) { if (estFinPartie()) {
finPartie(); finPartie();

View File

@@ -7,42 +7,44 @@ import java.io.InputStream;
public class Musique extends Thread { public class Musique extends Thread {
private Player player; private Player player;
private boolean stop = false; private volatile boolean stop = false;
private boolean enPause = false; private volatile boolean enPause = false;
public void run() { public void run() {
while (!stop) {
try { try {
while (!stop) {
if (!enPause) { if (!enPause) {
InputStream musique = getClass().getResourceAsStream("/TetrisMusic.mp3"); try (InputStream musique = getClass().getResourceAsStream("/TetrisMusic.mp3")) {
if (musique == null) { if (musique == null) {
System.err.println("Erreur : le fichier musique.mp3 est introuvable."); System.err.println("Erreur : le fichier musique.mp3 est introuvable.");
return; return;
} }
BufferedInputStream buffer = new BufferedInputStream(musique); BufferedInputStream buffer = new BufferedInputStream(musique);
player = new Player(buffer); this.player = new Player(buffer);
System.out.println("Lecture de la musique...");
player.play(); player.play();
} else {
Thread.sleep(1000); // Attendre 1 seconde avant de vérifier à nouveau
}
} catch (Exception e) { } catch (Exception e) {
System.err.println("Erreur lors de la lecture de la musique : " + e.getMessage()); System.err.println("Erreur lors de la lecture de la musique : " + e.getMessage());
} }
}
}
public void basculePlayPause() {
if (enPause) {
enPause = false;
} else { } else {
enPause = true; Thread.sleep(1000); // Attendre 1 seconde avant de vérifier à nouveau
if (player != null) {
player.close();
} }
} }
} catch (InterruptedException e) {
System.err.println("Musique interrompue : " + e.getMessage());
}
System.out.println("Fin du thread de musique.");
}
public void basculePlayPause() {
enPause = !enPause;
if (enPause && player != null) {
System.out.println("Musique en pause.");
player.close();
}
} }
public void arreterMusique() { public void arreterMusique() {
System.out.println("Arrêt de la musique.");
stop = true; stop = true;
if (player != null) { if (player != null) {
player.close(); player.close();

View File

@@ -18,15 +18,13 @@ public class Ordonnanceur extends Thread {
@Override @Override
public void run() { public void run() {
while (estActif) { while (!Thread.currentThread().isInterrupted()) {
try { try {
Thread.sleep(pause); Thread.sleep(pause);
runnable.run(); runnable.run();
} catch (InterruptedException e) { } catch (InterruptedException e) {
if (!estActif) {
break; break;
} }
} }
} }
}
} }

View File

@@ -33,8 +33,6 @@ public class VueBandeauControle extends JPanel {
// NEXT PIECE // NEXT PIECE
nextPiecePanel = new JPanel(); nextPiecePanel = new JPanel();
// nextPiecePanel.setPreferredSize(new Dimension(100, 100));
// nextPiecePanel.setMaximumSize(new Dimension(100, 100));
nextPiecePanel.setBackground(Color.LIGHT_GRAY); nextPiecePanel.setBackground(Color.LIGHT_GRAY);
nextPiecePanel.setAlignmentX(Component.CENTER_ALIGNMENT); nextPiecePanel.setAlignmentX(Component.CENTER_ALIGNMENT);
initierNextPiecePanel(); initierNextPiecePanel();
@@ -44,9 +42,9 @@ public class VueBandeauControle extends JPanel {
quitterButton = new JButton("QUITTER"); quitterButton = new JButton("QUITTER");
Dimension buttonSize = new Dimension(85, 30); Dimension buttonSize = new Dimension(85, 30);
Insets margeBoutton = new Insets(2, 2, 2, 2); Insets margeBoutton = new Insets(2, 2, 2, 2);
// pauseButton.setPreferredSize(buttonSize); pauseButton.setPreferredSize(buttonSize);
pauseButton.setMargin(margeBoutton); pauseButton.setMargin(margeBoutton);
// quitterButton.setPreferredSize(buttonSize); quitterButton.setPreferredSize(buttonSize);
quitterButton.setMargin(margeBoutton); quitterButton.setMargin(margeBoutton);
JPanel boutonsPanel = new JPanel(); JPanel boutonsPanel = new JPanel();
boutonsPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 0)); boutonsPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 0));

View File

@@ -26,22 +26,14 @@ public class VueGrille extends JPanel implements Observer, Runnable {
private int nbColonnes; private int nbColonnes;
private JPanel[][] casesGrille; private JPanel[][] casesGrille;
//private Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
//private double tailleJFrameX = screenSize.getHeight() / 2;
//private double tailleJFrameY = screenSize.getHeight();
public VueGrille(Grille grille, Jeu jeu) { public VueGrille(Grille grille, Jeu jeu) {
this.grille = grille; this.grille = grille;
this.jeu = jeu; this.jeu = jeu;
this.nbLignes = grille.getNbLignes(); this.nbLignes = grille.getNbLignes();
this.nbColonnes = grille.getNbColonnes(); this.nbColonnes = grille.getNbColonnes();
setLayout(new BorderLayout()); setLayout(new BorderLayout());
grillePanel = new JPanel(new GridLayoutCarre(nbLignes,nbColonnes)); grillePanel = new JPanel(new GridLayoutCarre(nbLignes,nbColonnes)); //pour que les cases soient carrés
add(grillePanel, BorderLayout.CENTER); add(grillePanel, BorderLayout.CENTER);
//setSize((int) tailleJFrameX, (int) tailleJFrameY);
//System.err.println("taille " + tailleJFrameX + " " + tailleJFrameY);
//add(this.grillePanel, BorderLayout.CENTER);
//initialiserVueGrille();
casesGrille = new JPanel[nbLignes][nbColonnes]; casesGrille = new JPanel[nbLignes][nbColonnes];
for (int i = 0; i < nbLignes; i++) { for (int i = 0; i < nbLignes; i++) {
for (int j = 0; j < nbColonnes; j++) { for (int j = 0; j < nbColonnes; j++) {

View File

@@ -13,13 +13,14 @@ public class VueTetris extends JFrame {
public static double tailleJFrameX = screenSize.getHeight() / 2; public static double tailleJFrameX = screenSize.getHeight() / 2;
public static double tailleJFrameY = screenSize.getHeight() / 2; public static double tailleJFrameY = screenSize.getHeight() / 2;
private VueGrille vueGrille; private VueGrille vueGrille;
private VueBandeauControle vueControle;
public VueTetris(Grille grille, Jeu jeu) { public VueTetris(Grille grille, Jeu jeu) {
super("Tetris"); super("Tetris");
VueGrille vueGrille = new VueGrille(grille, jeu); this.vueGrille = new VueGrille(grille, jeu);
VueBandeauControle vueControle = new VueBandeauControle(); this.vueControle = new VueBandeauControle();
TetrisBandeauControleur controleur = new TetrisBandeauControleur(vueControle); //TetrisBandeauControleur controleur = new TetrisBandeauControleur(vueControle);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout()); setLayout(new BorderLayout());
@@ -44,4 +45,8 @@ public class VueTetris extends JFrame {
// Utilisation de la pièce L // Utilisation de la pièce L
vueControle.afficherPieceSuivante(jeu.getPieceSuivante()); vueControle.afficherPieceSuivante(jeu.getPieceSuivante());
} }
public VueBandeauControle getVueBandeauControle() {
return this.vueControle;
}
} }