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));
}