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; protected ZoneDessin ecran = new ZoneDessin(); // MENUS protected MenuLogin menuLogin; protected MenuPrincipal menu; protected MenuCampagne menuCampagne; protected MenuLeaderboard menuLeaderboard; protected Cercle demiCercleAvant; protected Cercle demiCercleArriere; protected Ligne laligne = new Ligne(); protected Timer horloge; protected JLabel labScore; protected int score; //base de données protected GestionnaireBDD bdd = new GestionnaireBDD(); protected int utilisateurIdConnecte = -1; protected String identifiantUtilisateurConnecte; public int idCampagneActive = 0; // Retient la campagne (1 = Autoroute, etc.) public int difficulteActive = 0; // Retient la difficulté (1=Facile, 2=Moyen, 3=Difficile) public Jeu(){ score = 0; labScore = new JLabel("

score : 0

"); labScore.setBounds(20, 540, 200, 50); ecran.add(labScore); } public void demarrer() { fenetre = new JFrame("Linea"); layout = new CardLayout(); conteneurPrincipal = new JPanel(layout); score = 0; bdd.initialiserBaseDeDonnees(); // Instanciation de tous les menus menuLogin = new MenuLogin(this); menu = new MenuPrincipal(this); menuCampagne = new MenuCampagne(this); menuLeaderboard = new MenuLeaderboard(this); // Initialisation initiale resetPartie(6,20); // On ajoute l'action au bouton "Retour" de la ZoneDessin (Game Over) ecran.btnRetour.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { afficherMenuPrincipal(); } }); ecran.addKeyListener(this); // Ajout des panneaux au CardLayout conteneurPrincipal.add(menuLogin, "LOGIN"); conteneurPrincipal.add(menu, "MENU"); conteneurPrincipal.add(menuCampagne, "CAMPAGNE"); conteneurPrincipal.add(menuLeaderboard, "LEADERBOARD"); conteneurPrincipal.add(ecran, "JEU"); fenetre.setContentPane(conteneurPrincipal); fenetre.pack(); fenetre.setLocationRelativeTo(null); fenetre.setVisible(true); // Ajout d'un écouteur pour fermer la connexion BDD en quittant fenetre.addWindowListener(new java.awt.event.WindowAdapter() { @Override public void windowClosing(java.awt.event.WindowEvent windowEvent) { System.out.println("Fermeture de l'application, fermeture de la connexion BDD."); bdd.fermerConnexion(); } }); fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void setUtilisateurConnecte(int id, String identifiant) { this.utilisateurIdConnecte = id; this.identifiantUtilisateurConnecte = identifiant; } public void afficherLeaderboard() { menuLeaderboard.rafraichirLeaderboard(); layout.show(conteneurPrincipal, "LEADERBOARD"); } public void afficherMenuCampagne() { layout.show(conteneurPrincipal, "CAMPAGNE"); } public void afficherMenuPrincipal() { layout.show(conteneurPrincipal, "MENU"); } public void lancerNiveau(int numeroNiveau) { this.difficulteActive = numeroNiveau; if (idCampagneActive == 1) { CampagneAutoroute campagne = new CampagneAutoroute(this); campagne.lancerNiveau(numeroNiveau); } else if (idCampagneActive == 2) { CampagneEspace campagne = new CampagneEspace(this); campagne.lancerNiveauLune(numeroNiveau); } else if (idCampagneActive == 3) { CampagneOcean campagne = new CampagneOcean(this); campagne.lancerNiveau(numeroNiveau); } else { lancerPartie(); } } public void lancerPartie() { layout.show(conteneurPrincipal, "JEU"); ecran.setFocusable(true); ecran.requestFocusInWindow(); horloge.start(); } public void resetPartie(double vitesse, double pente) { resetPartie(vitesse, pente, 50); // Valeur par défaut pour les segments } public void resetPartie(double vitesse, double pente, int segments) { if(horloge != null) { horloge.stop(); } horloge = new Timer(40, this); demiCercleAvant = new Cercle(90, -180); demiCercleArriere = new Cercle(90, 180); laligne = new Ligne(vitesse, pente, segments); demiCercleArriere.setCouleur(new Color(0.8f, 0.0f, 0.0f)); demiCercleAvant.setCouleur(new Color(1.0f, 0.2f, 0.2f)); ecran.viderObjets(); ecran.ajouterObjet(demiCercleArriere); ecran.ajouterObjet(demiCercleAvant); ecran.ajouterObjet(laligne); ecran.setGameOver(false); score = 0; labScore.setText("

score : 0

"); } @Override public void actionPerformed(ActionEvent e) { ecran.traiterBoucleAnimation(); score ++; labScore.setText("

score : " + score+"

"); // Gestion collision simple double hauteurLigne = laligne.getHauteurLigneA(400); if (hauteurLigne != -1) { // calcule de la distance entre le centre du cercle et la ligne double distance = Math.abs(hauteurLigne - demiCercleAvant.getY()); // Si cette distance est strictement supérieure au rayon du bouclier, // cela signifie que la ligne est sortie de la bulle ! if (distance > demiCercleAvant.getRayon()) { gameOver(); } } else { // Si on arrive au bout de la ligne gameOver(); } } public void gameOver() { horloge.stop(); ecran.setGameOver(true); // Affiche "Game Over" et le bouton Retour int dureePartie = score / 25; // Exemple : 25 frames par seconde // On utilise nos deux variables pour la sauvegarde ! // L'appel est maintenant plus robuste grâce au nouveau GestionnaireBDD bdd.enregistrerPartie(dureePartie, idCampagneActive, difficulteActive, score, utilisateurIdConnecte); } // Gestion touches... @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == 38) { demiCercleAvant.Monter(); demiCercleArriere.Monter(); } } @Override public void keyReleased(KeyEvent e) { if (e.getKeyCode() == 38) { demiCercleAvant.ArreterMonter(); demiCercleArriere.ArreterMonter(); } } @Override public void keyTyped(KeyEvent e) {} }