diff --git a/app/src/main/java/org/App.java b/app/src/main/java/org/App.java index 9a1d66a..91ce1f8 100644 --- a/app/src/main/java/org/App.java +++ b/app/src/main/java/org/App.java @@ -31,7 +31,7 @@ public class App { IO io = new IO(jeu); vueTetris.addKeyListener(io); - new TetrisBandeauControleur(vueTetris.getVueBandeauControle(), musique, grille);// Création d'un controleur de + new TetrisBandeauControleur(vueTetris.getVueBandeauControle(), musique, grille);// Création d'un controleur de // bandeau avec la musique // instanciée } diff --git a/app/src/main/java/org/Controllers/TetrisBandeauControleur.java b/app/src/main/java/org/Controllers/TetrisBandeauControleur.java index ea193ca..55cb2f7 100644 --- a/app/src/main/java/org/Controllers/TetrisBandeauControleur.java +++ b/app/src/main/java/org/Controllers/TetrisBandeauControleur.java @@ -4,24 +4,30 @@ import org.Models.Grille; import org.Models.Musique; import org.Views.VueBandeauControle; +import javax.swing.*; + public class TetrisBandeauControleur { private boolean partieEnPause = false; private boolean partieTerminee = false; private Musique musique; private VueBandeauControle vueControle; private Grille grille; + private JButton aideButton; public TetrisBandeauControleur(VueBandeauControle vueControle, Musique musique, Grille grille) { this.vueControle = vueControle; this.musique = musique; this.grille = grille; // action play/pause + //Listener pour le bouton play/pause this.vueControle.getPauseButton().addActionListener(e -> switchPlayPause()); + //Listener pour le bouton quitter this.vueControle.getQuitterButton().addActionListener(e -> { System.out.println("Fermeture de l'application..."); System.exit(0); }); - + //Listener pour le bouton aide + this.vueControle.getAideButton().addActionListener(e -> afficherAide()); } public void switchPlayPause() { @@ -42,4 +48,21 @@ public class TetrisBandeauControleur { System.out.println("Partie terminée"); } + public void afficherAide() { + String messageAide = "Utilisez les flèches du clavier pour déplacer la pièce courante :\n" + + "Flèche gauche : Déplacer à gauche\n" + + "Flèche droite : Déplacer à droite\n" + + "Flèche bas : Accélérer la chute\n" + + "R : Faire pivoter la pièce sens horaire\n" + + "E : Faire pivoter la pièce sens anti horaire\n" + + "Espace : Hard drop\n"; + if (!grille.estEnPause()) { + grille.setEnPause(true); + musique.basculePlayPause(); + JOptionPane.showMessageDialog(vueControle,messageAide, "Aide", JOptionPane.INFORMATION_MESSAGE); + grille.setEnPause(false); + musique.basculePlayPause(); + } + } + } diff --git a/app/src/main/java/org/Models/Grille.java b/app/src/main/java/org/Models/Grille.java index c42b922..e11a819 100644 --- a/app/src/main/java/org/Models/Grille.java +++ b/app/src/main/java/org/Models/Grille.java @@ -350,8 +350,14 @@ public class Grille extends Observable { // TODO: ?? implements Runnable { public int getScore(){ return score; } + public void setScore(int score) { + this.score = score; + } public int getNbLignesSupprimees() { return nbLignesSupprimees; } + public void setNbLignesSupprimees(int nbLignesSupprimees) { + this.nbLignesSupprimees = nbLignesSupprimees; + } } \ No newline at end of file diff --git a/app/src/main/java/org/Models/Jeu.java b/app/src/main/java/org/Models/Jeu.java index 3d5dda5..eda8c0d 100644 --- a/app/src/main/java/org/Models/Jeu.java +++ b/app/src/main/java/org/Models/Jeu.java @@ -23,7 +23,6 @@ public class Jeu extends Observable implements Runnable { private PieceCourante pieceSuivante; private int pieceSuivanteX; private int pieceSuivanteY; - public boolean jeuEnCours = true; public Jeu(Grille grille, Musique musique) { @@ -102,8 +101,9 @@ public class Jeu extends Observable implements Runnable { public boolean estFinPartie() { for (Point caseColoree : this.grille.motifPieceCouranteColoriee()) { if (this.grille.getCase(caseColoree.y, caseColoree.x)) { - new VueGameOver(grille.getScore(),e -> System.exit(0),e->{ - System.out.println("Début d'une nouvelle partie"); + VueGameOver gameOver = new VueGameOver(grille.getScore(),e -> System.exit(0),()->{ + System.out.println("\"rejouer\"clique"); + reinitialiserPartie(); }); return true; } @@ -123,6 +123,33 @@ public class Jeu extends Observable implements Runnable { notifyObservers(); } + public void reinitialiserPartie(){ + this.grille.initGrille(); + this.grille.setPieceCourante(getNouvellePiece()); + this.grille.setScore(0); + this.grille.setNbLignesSupprimees(0); + this.pieceSuivante= getNouvellePiece(); + this.jeuEnCours = true; + this.ordonnanceur = new Ordonnanceur(this, 1000); + this.ordonnanceur.start(); + setChanged(); + notifyObservers(); + } + + public void pauseJeu(){ + grille.setEnPause(true); + if (musique != null) { + musique.basculePlayPause(); + } + } + + public void reprendreJeu(){ + grille.setEnPause(false); + if (musique != null) { + musique.basculePlayPause(); + } + } + @Override public void run() { // TODO: game logic here diff --git a/app/src/main/java/org/Views/VueBandeauControle.java b/app/src/main/java/org/Views/VueBandeauControle.java index 311c269..c06be57 100644 --- a/app/src/main/java/org/Views/VueBandeauControle.java +++ b/app/src/main/java/org/Views/VueBandeauControle.java @@ -14,6 +14,7 @@ public class VueBandeauControle extends JPanel implements Observer { private JLabel scoreLabel; private JPanel nextPiecePanel; private JButton pauseButton; + private JButton aideButton; private JPanel[][] caseNextPiece = new JPanel[4][4]; private JLabel nbLigneLabel; private JButton quitterButton; @@ -53,13 +54,29 @@ public class VueBandeauControle extends JPanel implements Observer { quitterButton.setPreferredSize(buttonSize); quitterButton.setMargin(margeBoutton); JPanel boutonsPanel = new JPanel(); - boutonsPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 0)); + //boutonsPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 0)); + boutonsPanel.setLayout(new BoxLayout(boutonsPanel, BoxLayout.X_AXIS)); boutonsPanel.setOpaque(false); boutonsPanel.add(pauseButton); + boutonsPanel.add(Box.createRigidArea(new Dimension(10, 0))); boutonsPanel.add(quitterButton); pauseButton.setFocusable(false); quitterButton.setFocusable(false); + // AIDE BUTTON + aideButton = new JButton("?"); + aideButton.setToolTipText("AFFICHER L'AIDE"); + aideButton.setPreferredSize(new Dimension(45, 20)); + aideButton.setFocusable(false); + JPanel footerPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 10, 5)); + footerPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 40)); + footerPanel.setOpaque(false); + footerPanel.add(aideButton); + + + + + add(Box.createVerticalStrut(20)); add(scoreLabel); add(Box.createVerticalStrut(20)); @@ -68,6 +85,9 @@ public class VueBandeauControle extends JPanel implements Observer { add(nextPiecePanel); add(Box.createVerticalStrut(20)); add(boutonsPanel); + add(Box.createVerticalGlue()); //force le JPanel à prendre toute la hauteur + + add(footerPanel); // setVisible(true); jeu.addObserver(this); @@ -129,6 +149,10 @@ public class VueBandeauControle extends JPanel implements Observer { nextPiecePanel.repaint(); } + public JButton getAideButton() { + return aideButton; + } + @Override public void update(Observable o, Object arg) { if (o instanceof Jeu) { diff --git a/app/src/main/java/org/Views/VueGameOver.java b/app/src/main/java/org/Views/VueGameOver.java index e76a619..5e7028d 100644 --- a/app/src/main/java/org/Views/VueGameOver.java +++ b/app/src/main/java/org/Views/VueGameOver.java @@ -8,7 +8,7 @@ public class VueGameOver extends JFrame { private JButton quitterButton; private JButton rejouerButton; - public VueGameOver(int score, ActionListener quitterListener, ActionListener rejouerListener) { + public VueGameOver(int score, ActionListener quitterListener, Runnable rejouerListener) { setTitle("FIN DE PARTIE"); setSize(400,400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); @@ -31,7 +31,10 @@ public class VueGameOver extends JFrame { //mise en forme boutons quitterButton.addActionListener(quitterListener); - rejouerButton.addActionListener(rejouerListener); + rejouerButton.addActionListener(e -> { + dispose(); + rejouerListener.run(); + }); buttonPanel.add(quitterButton); buttonPanel.add(rejouerButton); panel.add(buttonPanel, BorderLayout.SOUTH);