diff --git a/src/linea/FondAutoroute.java b/src/linea/FondAutoroute.java index 81fc97b..8ed3bf4 100644 --- a/src/linea/FondAutoroute.java +++ b/src/linea/FondAutoroute.java @@ -6,13 +6,18 @@ import java.awt.Graphics; public class FondAutoroute extends ObjetGraphique { private double decalage = 0; + // On ajoute une variable pour mémoriser la vitesse + private double vitesseDefilement; - public FondAutoroute() { + // On modifie le constructeur pour accepter la vitesse + public FondAutoroute(double vitesse) { super(); + this.vitesseDefilement = vitesse; } @Override void Afficher(Graphics g) { + // ... (Garde exactement ton code d'affichage actuel avec les couleurs et les boucles for) ... // Ciel de nuit urbaine g.setColor(new Color(20, 20, 45)); g.fillRect(0, 0, 800, 50); @@ -34,9 +39,11 @@ public class FondAutoroute extends ObjetGraphique { @Override void Animer() { - decalage += 5.0; + // On utilise la vitesse dynamique au lieu du 5.0 fixe + decalage += vitesseDefilement; + if (decalage >= 120) { - decalage = 0; // Boucle infinie + decalage = 0; } } } \ No newline at end of file diff --git a/src/linea/GestionnaireBDD.java b/src/linea/GestionnaireBDD.java new file mode 100644 index 0000000..110798c --- /dev/null +++ b/src/linea/GestionnaireBDD.java @@ -0,0 +1,95 @@ +package linea; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Statement; + +public class GestionnaireBDD { + + private Connection conn = null; + private static final String DB_FILE = "linea_scores.db"; + + /** + * Le constructeur établit la connexion et crée la table si elle n'existe pas. + */ + public GestionnaireBDD() { + try { + // URL de connexion pour SQLite + String url = "jdbc:sqlite:" + DB_FILE; + // Établir la connexion + conn = DriverManager.getConnection(url); + System.out.println("Connexion à la base de données SQLite établie."); + // S'assurer que la table pour les scores existe + creerTableSiNecessaire(); + } catch (SQLException e) { + System.err.println("Erreur de connexion à la base de données : " + e.getMessage()); + } + } + + /** + * Crée la table 'parties' si elle n'est pas déjà présente dans la base de données. + */ + private void creerTableSiNecessaire() { + String sql = "CREATE TABLE IF NOT EXISTS parties (\n" + + " id INTEGER PRIMARY KEY AUTOINCREMENT,\n" + + " duree_secondes INTEGER NOT NULL,\n" + + " campagne_id INTEGER NOT NULL,\n" + + " difficulte_id INTEGER NOT NULL,\n" + + " score INTEGER NOT NULL,\n" + + " date_partie TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n" + + ");"; + + // 'try-with-resources' assure que le Statement est bien fermé + try (Statement stmt = conn.createStatement()) { + stmt.execute(sql); + } catch (SQLException e) { + System.err.println("Erreur lors de la création de la table : " + e.getMessage()); + } + } + + /** + * Enregistre les informations d'une partie terminée dans la base de données. + * Utilise un PreparedStatement pour la sécurité et la performance. + * + * @param dureePartie Durée du jeu en secondes. + * @param idCampagne ID de la campagne jouée. + * @param idDifficulte ID de la difficulté choisie. + * @param score Score final du joueur. + */ + public void enregistrerPartie(int dureePartie, int idCampagne, int idDifficulte, int score) { + if (conn == null) { + System.err.println("Impossible d'enregistrer la partie : pas de connexion à la BDD."); + return; + } + + String sql = "INSERT INTO parties(duree_secondes, campagne_id, difficulte_id, score) VALUES(?,?,?,?)"; + + try (PreparedStatement pstmt = conn.prepareStatement(sql)) { + pstmt.setInt(1, dureePartie); + pstmt.setInt(2, idCampagne); + pstmt.setInt(3, idDifficulte); + pstmt.setInt(4, score); + pstmt.executeUpdate(); + System.out.println("Partie enregistrée avec succès ! Score : " + score); + } catch (SQLException e) { + System.err.println("Erreur lors de l'enregistrement de la partie : " + e.getMessage()); + } + } + + /** + * Ferme la connexion à la base de données. + * Il est important d'appeler cette méthode à la fermeture de l'application. + */ + public void fermerConnexion() { + try { + if (conn != null && !conn.isClosed()) { + conn.close(); + System.out.println("Connexion à la base de données fermée."); + } + } catch (SQLException ex) { + System.err.println("Erreur lors de la fermeture de la connexion BDD : " + ex.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/linea/Jeu.java b/src/linea/Jeu.java index 2808b0d..39415b8 100644 --- a/src/linea/Jeu.java +++ b/src/linea/Jeu.java @@ -22,6 +22,12 @@ public class Jeu implements KeyListener, ActionListener { protected JLabel labScore; protected int score; + //base de données + protected GestionnaireBDD bdd = new GestionnaireBDD(); + + 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

"); @@ -59,6 +65,16 @@ public class Jeu implements KeyListener, ActionListener { 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); } @@ -71,9 +87,15 @@ public class Jeu implements KeyListener, ActionListener { } public void lancerNiveau(int numeroNiveau) { - System.out.println("Lancement du niveau " + numeroNiveau); - // Ici tu pourras configurer la difficulté selon le niveau - lancerPartie(); + this.difficulteActive = numeroNiveau; + + if (idCampagneActive == 1) { + CampagneAutoroute campagne = new CampagneAutoroute(this); + campagne.lancerNiveau(numeroNiveau); + } + else { + lancerPartie(); // Partie classique par défaut + } } public void lancerPartie() { @@ -137,6 +159,12 @@ public class Jeu implements KeyListener, ActionListener { 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); } // Gestion touches... diff --git a/src/linea/Ligne.java b/src/linea/Ligne.java index ceea564..2f35099 100644 --- a/src/linea/Ligne.java +++ b/src/linea/Ligne.java @@ -11,8 +11,11 @@ public class Ligne extends ObjetGraphique{// Hérite de la classe ObjetGraphique //------------------------------------------------------------------------- // PROPRIETES - //------------------------------------------------------------------------- - + //------------------------------------------------------------------------- + + protected double vitesseDefilement = 5.0; + + // nb de Segments qui composent la ligne protected int nbSegments = 400; @@ -34,25 +37,25 @@ public class Ligne extends ObjetGraphique{// Hérite de la classe ObjetGraphique //------------------------------------------------------------------------- // Constructeur de la classe - //------------------------------------------------------------------------- - public Ligne(){ - // Valeurs initiales pour la position de la Ligne + //------------------------------------------------------------------------- + public Ligne() { + // Par défaut, si on ne précise rien, on met vitesse 5 et pente 30 + this(5.0, 30.0); + } + + public Ligne(double vitesse, double penteMax) { + this.vitesseDefilement = vitesse; + this.inclinaisonMax = penteMax; + double x = 400; double y = 200; + double dx = 0, dy = 0; - double xCourant = x; - double yCourant = y; - double dx = 0,dy=0; + Segment s = new Segment(x, y, dx, dy); + listSegments.add(s); - - // Création de la liste de segments qui composent la ligne - Segment s = new Segment(xCourant,yCourant,dx,dy); - - - for (int i=0; i 600) { @@ -61,7 +64,7 @@ public class Ligne extends ObjetGraphique{// Hérite de la classe ObjetGraphique s = new Segment(x,y,dx,dy); s.setCouleur(new Color(0.2f,0.2f,0.2f)); - + x+=dx; y+=dy; listSegments.add(s); @@ -100,17 +103,13 @@ public class Ligne extends ObjetGraphique{// Hérite de la classe ObjetGraphique //------------------------------------------------------------------------- @Override void Animer() { - // On déplace chaque segment vers la gauche (vitesse arbitraire de 5) - double vitesseDefilement = 5.0; - - // On met à jour le x de la ligne (utilisé pour le calcul de position) this.x -= vitesseDefilement; - // On répercute sur chaque segment for (Segment s : listSegments) { s.setX(s.getX() - vitesseDefilement); } } + public double getHauteurLigneA(double xCercle) { for (Segment s : listSegments) { // Si le segment couvre la position X du cercle diff --git a/src/linea/MenuCampagne.java b/src/linea/MenuCampagne.java index e412a01..d9ec272 100644 --- a/src/linea/MenuCampagne.java +++ b/src/linea/MenuCampagne.java @@ -73,10 +73,20 @@ public class MenuCampagne extends JPanel { btnRetour.addActionListener(e -> jeu.afficherMenuPrincipal()); - java.awt.event.ActionListener ouvrirNiveaux = e -> cartes.show(panneauCartes, "NIVEAUX"); - btnC1.addActionListener(ouvrirNiveaux); - btnC2.addActionListener(ouvrirNiveaux); - btnC3.addActionListener(ouvrirNiveaux); + btnC1.addActionListener(e -> { + jeu.idCampagneActive = 1; // On retient qu'on joue à la campagne 1 (Autoroute) + cartes.show(panneauCartes, "NIVEAUX"); // On affiche Facile/Moyen/Difficile + }); + + btnC2.addActionListener(e -> { + jeu.idCampagneActive = 2; + cartes.show(panneauCartes, "NIVEAUX"); + }); + + btnC3.addActionListener(e -> { + jeu.idCampagneActive = 3; + cartes.show(panneauCartes, "NIVEAUX"); + }); btnRetourCampagnes.addActionListener(e -> cartes.show(panneauCartes, "LISTE"));