From 27f8f60bed5c862b6025e58df5004ec4e9334b70 Mon Sep 17 00:00:00 2001 From: matthew-java Date: Tue, 10 Feb 2026 15:44:59 +0100 Subject: [PATCH] -implementation menu --- src/linea/Cercle.java | 2 +- src/linea/Jeu.java | 181 +++++++++++++---------------------- src/linea/MenuPrincipal.java | 52 ++++++++++ src/linea/ZoneDessin.java | 2 +- 4 files changed, 123 insertions(+), 114 deletions(-) create mode 100644 src/linea/MenuPrincipal.java diff --git a/src/linea/Cercle.java b/src/linea/Cercle.java index 4f4f66f..5dbbcb5 100644 --- a/src/linea/Cercle.java +++ b/src/linea/Cercle.java @@ -31,7 +31,7 @@ public class Cercle extends ObjetGraphique{ // il s'agit plutôt d'arcs de cercl protected double pas = 0.2; // Valeur de la force (norme) appliquée lorsque le joueur appuie sur up - protected double impulsion = 25; + protected double impulsion = 20; //------------------------------------------------------------------------- diff --git a/src/linea/Jeu.java b/src/linea/Jeu.java index f2b7af8..0c826fb 100644 --- a/src/linea/Jeu.java +++ b/src/linea/Jeu.java @@ -1,146 +1,81 @@ package linea; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; +import java.awt.event.*; +import javax.swing.*; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.Timer; +public class Jeu implements KeyListener, ActionListener { + protected JFrame fenetre; + protected JPanel conteneurPrincipal; + protected CardLayout layout; -public class Jeu implements KeyListener, ActionListener{ - //------------------------------------------------------------------------- - // PROPRIETES - //------------------------------------------------------------------------- - - // Ecran : instance de ZoneDessin, qui contiendra tous les objets graphiques - // et les animera + // Instances du jeu protected ZoneDessin ecran = new ZoneDessin(); - - // Le cercle : en fait 2 demis-cercles, un qui passera sous la ligne - // un qui passera dessus - protected Cercle demiCercleAvant = new Cercle(90,-180); // celui qui est sur la ligne - protected Cercle demiCercleArriere = new Cercle(90,180); // celui qui est derrière la ligne - Ligne laligne = new Ligne(); - - // A FAIRE : ajouter les objets graphiques manquants, s'il y en a + protected MenuPrincipal menu; + + protected Cercle demiCercleAvant = new Cercle(90, -180); + protected Cercle demiCercleArriere = new Cercle(90, 180); + protected Ligne laligne = new Ligne(); - // Timer : un objet qui émet des événements à un intervalle choisi, - // il sert à donner le pas de l'animation protected Timer horloge; - - // Une variable qui contiendra le score - protected double score=0; - - // un label qui servira à afficher le score - protected JLabel labScore; - - - //------------------------------------------------------------------------- - // METHODES - //------------------------------------------------------------------------- - - //------------------------------------------------------------------------- - // Constructeur de la classe - //------------------------------------------------------------------------- - public Jeu(){ - // Gestion du score : a réactiver en fin de TP, inutile au début + protected JLabel labScore; + + public Jeu() { + // Initialisation du score (comme dans le fichier original) labScore = new JLabel(); labScore.setText("

score : 0

"); labScore.setBounds(20, 0, 200, 50); - ecran.add(labScore); - } - - - //------------------------------------------------------------------------- - // Méthodes qu'il faut implémenter pour être - // conforme à un KeyListener - //------------------------------------------------------------------------- - - //------------------------------------------------------------------------- - // Appui sur une touche - // -> l'événement est émis lorsqu'on appuie, puis selon le rythme de - // répétition du clavier - //------------------------------------------------------------------------- - @Override - public void keyPressed(KeyEvent e){ - //keyCode 38 : up - // keyCode 40 : down - int keyCode = e.getKeyCode(); - - if (keyCode==38){ // touche "flèche vers le haut" - // On demande aux deux demi-cercle de "monter" - demiCercleAvant.Monter(); - demiCercleArriere.Monter(); - } + ecran.add(labScore); } - //------------------------------------------------------------------------- - // Relâchement de la touche - //------------------------------------------------------------------------- - @Override - public void keyReleased(KeyEvent e){ - // keyCode 38 : up - // keyCode 40 : down - int keyCode = e.getKeyCode(); - - if (keyCode==38){ - // On demande aux deux demi-cercle "d'arrêter de monter" - demiCercleAvant.ArreterMonter(); - demiCercleArriere.ArreterMonter(); - } - } + public void demarrer() { + fenetre = new JFrame("Linea"); + layout = new CardLayout(); + conteneurPrincipal = new JPanel(layout); - //------------------------------------------------------------------------- - // Une méthode que nous n'utilisons pas - //------------------------------------------------------------------------- - @Override - public void keyTyped(KeyEvent e) { - // TODO Auto-generated method stub - - } - - //------------------------------------------------------------------------- - // Démarrage du jeu : - // création de diverses instances et - //------------------------------------------------------------------------- - public void demarrer(){ - // Création d'une fenêtre - JFrame fenetre = new JFrame(); + // Création du menu en lui passant l'instance actuelle de Jeu + menu = new MenuPrincipal(this); + // Configuration de la zone de dessin ecran.ajouterObjet(demiCercleArriere); ecran.ajouterObjet(demiCercleAvant); ecran.ajouterObjet(laligne); + ecran.addKeyListener(this); // Le jeu écoute le clavier + // Ajout des "cartes" au conteneur principal + conteneurPrincipal.add(menu, "MENU"); + conteneurPrincipal.add(ecran, "JEU"); - // on indique que c'est le jeu qui traitera les appuis sur une touche - ecran.addKeyListener(this); - ecran.setFocusable(true); - fenetre.setContentPane(ecran); + // Configuration de la fenêtre + fenetre.setContentPane(conteneurPrincipal); fenetre.pack(); - fenetre.setLocation(100, 100); + fenetre.setLocationRelativeTo(null); // Centrer à l'écran fenetre.setVisible(true); fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - // Démarrage du timer, qui rythmera l'animation + // Timer (40ms = 25 fps) horloge = new Timer(40, this); - horloge.start(); + // Couleurs demiCercleArriere.setCouleur(new Color(0.8f, 0.0f, 0.0f)); demiCercleAvant.setCouleur(new Color(1.0f, 0.2f, 0.2f)); } + // Méthode appelée par le bouton PLAY du menu + public void lancerPartie() { + layout.show(conteneurPrincipal, "JEU"); + ecran.setFocusable(true); + ecran.requestFocusInWindow(); // Indispensable pour capter le clavier + horloge.start(); + } - //------------------------------------------------------------------------- - // Méthode appelée lorsqu'un événement timer se produit - //------------------------------------------------------------------------- @Override public void actionPerformed(ActionEvent e) { + // CORRECTION ICI : Appel de la bonne méthode de ZoneDessin ecran.traiterBoucleAnimation(); - double yLigne = laligne.getHauteurLigneA(400); + // Logique de collision (réintégrée depuis le fichier original) + double yLigne = laligne.getHauteurLigneA(400); // 400 est une valeur arbitraire pour tester au centre double yCercle = demiCercleAvant.getY(); if (Math.abs(yLigne - yCercle) > 30) { @@ -149,8 +84,30 @@ public class Jeu implements KeyListener, ActionListener{ } public void gameOver() { - horloge.stop(); // On arrête le Timer - ecran.setGameOver(true); // On prévient la zone de dessin + horloge.stop(); + ecran.setGameOver(true); } - -} + + // --- Gestion du Clavier --- + + @Override + public void keyPressed(KeyEvent e) { + int keyCode = e.getKeyCode(); + if (keyCode == 38) { // Flèche HAUT + demiCercleAvant.Monter(); + demiCercleArriere.Monter(); + } + } + + @Override + public void keyReleased(KeyEvent e) { + int keyCode = e.getKeyCode(); + if (keyCode == 38) { + demiCercleAvant.ArreterMonter(); + demiCercleArriere.ArreterMonter(); + } + } + + @Override + public void keyTyped(KeyEvent e) {} +} \ No newline at end of file diff --git a/src/linea/MenuPrincipal.java b/src/linea/MenuPrincipal.java new file mode 100644 index 0000000..184828d --- /dev/null +++ b/src/linea/MenuPrincipal.java @@ -0,0 +1,52 @@ +package linea; + +import java.awt.*; +import javax.swing.*; + +public class MenuPrincipal extends JPanel{ + private JButton btnPlay; + private JButton btnSettings; + private JButton btnQuit; + + + public MenuPrincipal(Jeu jeu) { + setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + setBackground(new Color(45, 45, 45)); // Gris foncé + + // Titre + JLabel titre = new JLabel("LINEA"); + titre.setForeground(Color.WHITE); + titre.setFont(new Font("SansSerif", Font.BOLD, 60)); + titre.setAlignmentX(Component.CENTER_ALIGNMENT); + + // Boutons + btnPlay = creerBouton("PLAY"); + btnSettings = creerBouton("SETTINGS"); + btnQuit = creerBouton("QUIT"); + + // Actions + btnPlay.addActionListener(e -> jeu.lancerPartie()); + btnSettings.addActionListener(e -> JOptionPane.showMessageDialog(this, "Options bientôt disponibles !")); + btnQuit.addActionListener(e -> System.exit(0)); + + // Mise en page (espacement) + add(Box.createVerticalGlue()); + add(titre); + add(Box.createRigidArea(new Dimension(0, 50))); + add(btnPlay); + add(Box.createRigidArea(new Dimension(0, 15))); + add(btnSettings); + add(Box.createRigidArea(new Dimension(0, 15))); + add(btnQuit); + add(Box.createVerticalGlue()); + } + + private JButton creerBouton(String texte) { + JButton b = new JButton(texte); + b.setFont(new Font("SansSerif", Font.PLAIN, 20)); + b.setAlignmentX(Component.CENTER_ALIGNMENT); + b.setMaximumSize(new Dimension(200, 50)); + b.setFocusable(false); // Pour ne pas voler le focus du clavier plus tard + return b; + } +} diff --git a/src/linea/ZoneDessin.java b/src/linea/ZoneDessin.java index 0b95dee..b642e17 100644 --- a/src/linea/ZoneDessin.java +++ b/src/linea/ZoneDessin.java @@ -32,7 +32,7 @@ public class ZoneDessin extends JPanel { // hérite d'une classe du frameWork st // on prépare la zone d'affichage setLayout(new BorderLayout()); setPreferredSize(new Dimension(800, 600)); - setBackground(new Color(220,170,0)); + setBackground(new Color(100,100,100)); }