package linea; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Jeu implements KeyListener, ActionListener { protected JFrame fenetre; protected JPanel conteneurPrincipal; protected CardLayout layout; // Instances du jeu protected ZoneDessin ecran = new ZoneDessin(); protected MenuPrincipal menu; protected Cercle demiCercleAvant = new Cercle(90, -180); protected Cercle demiCercleArriere = new Cercle(90, 180); protected Ligne laligne = new Ligne(); protected Timer horloge; 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); } public void demarrer() { fenetre = new JFrame("Linea"); layout = new CardLayout(); conteneurPrincipal = new JPanel(layout); // 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"); // Configuration de la fenêtre fenetre.setContentPane(conteneurPrincipal); fenetre.pack(); fenetre.setLocationRelativeTo(null); // Centrer à l'écran fenetre.setVisible(true); fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Timer (40ms = 25 fps) horloge = new Timer(40, this); // 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(); } @Override public void actionPerformed(ActionEvent e) { // CORRECTION ICI : Appel de la bonne méthode de ZoneDessin ecran.traiterBoucleAnimation(); // 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) { gameOver(); } } public void gameOver() { 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) {} }