package linea; import java.awt.*; import java.awt.event.*; import java.util.Random; 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 Random random = new Random(); protected int prochainBonusScore; protected int prochainMalusScore; protected int utilisateurIdConnecte = -1; protected String identifiantUtilisateurConnecte; public int idCampagneActive = 0; public int difficulteActive = 0; 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); 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); } 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); ecran.setVictoire(false); score = 0; labScore.setText("

score : 0

"); this.prochainBonusScore = 100 + random.nextInt(26); this.prochainMalusScore = 100 + random.nextInt(26); } @Override public void actionPerformed(ActionEvent e) { ecran.traiterBoucleAnimation(); score++; if (score == prochainBonusScore) { double xSpawn = 810; double yLigne = laligne.getHauteurLigneA(xSpawn); if (yLigne != -1) { double yOffset = random.nextBoolean() ? -30 : 30; double yBonus = yLigne + yOffset; Bonus bonus = new Bonus(xSpawn, yBonus, laligne.vitesseDefilement); ecran.ajouterObjet(bonus); this.prochainBonusScore = score + 40 + random.nextInt(21); } } if (score == prochainMalusScore) { double xSpawn = 810; double yLigne = laligne.getHauteurLigneA(xSpawn); if (yLigne != -1) { double yOffset = random.nextBoolean() ? -30 : 30; double yMalus = yLigne + yOffset; Malus malus = new Malus(xSpawn, yMalus, laligne.vitesseDefilement); ecran.ajouterObjet(malus); this.prochainMalusScore = score + 40 + random.nextInt(21); } } for (int i = ecran.listeObjets.size() - 1; i >= 0; i--) { ObjetGraphique obj = ecran.listeObjets.get(i); if (obj instanceof Bonus || obj instanceof Malus) { double dx = obj.getX() - demiCercleAvant.getX(); double dy = obj.getY() - demiCercleAvant.getY(); double dist = Math.sqrt(dx * dx + dy * dy); if (dist < demiCercleAvant.getRayon()) { if (obj instanceof Bonus) { double newRayon = demiCercleAvant.getRayon() + 3; demiCercleAvant.setRayon(newRayon); demiCercleArriere.setRayon(newRayon); } else { double newRayon = demiCercleAvant.getRayon() - 3; if (newRayon < 10) newRayon = 10; demiCercleAvant.setRayon(newRayon); demiCercleArriere.setRayon(newRayon); } ecran.listeObjets.remove(i); } } } 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()); if (distance > demiCercleAvant.getRayon()) { gameOver(); } } else { victoire(); } } public void victoire() { horloge.stop(); ecran.setVictoire(true); int dureePartie = score / 25; bdd.enregistrerPartie(dureePartie, idCampagneActive, difficulteActive, score, utilisateurIdConnecte); } public void gameOver() { horloge.stop(); ecran.setGameOver(true); int dureePartie = score / 25; 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) { } }