diff --git a/projet_linea/README.md b/projet_linea/README.md index 7c03a53..c54ad50 100644 --- a/projet_linea/README.md +++ b/projet_linea/README.md @@ -1,18 +1,78 @@ -## Getting Started +🚀 ZENITH FLUX — Montez plus haut -Welcome to the VS Code Java world. Here is a guideline to help you get started to write Java code in Visual Studio Code. +ZENITH FLUX est un jeu d’adresse et de précision développé en Java dans le cadre du module Projet Dev - CPI2 2026. +Le joueur doit maintenir un anneau en lévitation le long d’une trajectoire en mouvement, en défiant la gravité pour atteindre le score le plus élevé. -## Folder Structure +🎯 Concept du jeu -The workspace contains two folders by default, where: +Le gameplay repose sur un principe simple mais exigeant : -- `src`: the folder to maintain sources -- `lib`: the folder to maintain dependencies +⚖️ Gravité constante : l’anneau est continuellement attiré vers le bas +🚀 Impulsion verticale : le joueur doit compenser cette chute avec précision +🎯 Suivi de trajectoire : rester aligné avec une ligne brisée en mouvement +📈 Progression : difficulté croissante à travers plusieurs niveaux (stages) -Meanwhile, the compiled output files will be generated in the `bin` folder by default. +👉 Le défi : tenir le plus longtemps possible sans sortir de la trajectoire -> If you want to customize the folder structure, open `.vscode/settings.json` and update the related settings there. +🎮 Fonctionnalités +✔️ Gameplay dynamique basé sur la physique +✔️ Système de niveaux configurables +✔️ Sauvegarde des performances (score, durée, progression) +✔️ Interface simple et immersive +✔️ Expérience complète : introduction, montée en difficulté, fin de partie +👥 Équipe de développement -## Dependency Management +Projet réalisé par : -The `JAVA PROJECTS` view allows you to manage your dependencies. More details can be found [here](https://github.com/microsoft/vscode-java-dependency#manage-dependencies). +Constant Eloundou +Lucas Lample +Ismaël Boubacar +Théo Mouniapin +🛠️ Technologies utilisées +Langage : Java (Programmation Orientée Objet) +Architecture : UML (Diagrammes de classes, séquences, activités) +Base de données : SQLite +💾 Persistance des données +📊 Historique des parties : +Date +Durée +Score +Niveau atteint +🧩 Configuration des niveaux : +Paramétrage dynamique des stages +Modification possible sans recompiler le jeu +📦 Contenu du dépôt + +Ce dépôt contient : + +📁 Code source Java (documenté avec JavaDoc) +📊 Diagrammes UML complets +📝 Rapport de projet (organisation, tâches, contributions) +▶️ Exécutable (.jar) prêt à être lancé +📖 Guide utilisateur (installation et commandes) +🚀 Installation et lancement +🔧 Prérequis +Java JDK/JRE 17 ou supérieur +📥 Cloner le projet +git clone https://github.com/votre-repo/zenith-flux.git +cd zenith-flux +▶️ Lancer le jeu +java -jar ZenithFlux.jar +📅 Planning de développement +Semaine Objectif +1 - 2 Prise en main du projet + prototype +3 - 5 Développement intensif + fonctionnalités avancées +6 Finalisation, optimisation et soutenance +🧠 Points forts du projet +Architecture propre et modulaire +Séparation claire entre logique, données et affichage +Utilisation concrète d’une base de données +Projet complet : de la conception à la livraison +⚖️ Licence + +Projet réalisé dans un cadre pédagogique (CPI2 2026). +Usage académique uniquement. + +❤️ Remerciements + +Merci à tous les encadrants et contributeurs du projet. \ No newline at end of file diff --git a/projet_linea/UserScoreBDD.db b/projet_linea/UserScoreBDD.db deleted file mode 100644 index e03e6f5..0000000 Binary files a/projet_linea/UserScoreBDD.db and /dev/null differ diff --git a/projet_linea/bin/Background.class b/projet_linea/bin/Background.class index 121fc1c..3a23fc0 100644 Binary files a/projet_linea/bin/Background.class and b/projet_linea/bin/Background.class differ diff --git a/projet_linea/bin/BonusMalus.class b/projet_linea/bin/BonusMalus.class index e172971..45db39f 100644 Binary files a/projet_linea/bin/BonusMalus.class and b/projet_linea/bin/BonusMalus.class differ diff --git a/projet_linea/bin/BoutonScoresUtilisateur$1.class b/projet_linea/bin/BoutonScoresUtilisateur$1.class index 8703d7b..aa7e8f0 100644 Binary files a/projet_linea/bin/BoutonScoresUtilisateur$1.class and b/projet_linea/bin/BoutonScoresUtilisateur$1.class differ diff --git a/projet_linea/bin/BoutonScoresUtilisateur.class b/projet_linea/bin/BoutonScoresUtilisateur.class index a70cc61..7efbf48 100644 Binary files a/projet_linea/bin/BoutonScoresUtilisateur.class and b/projet_linea/bin/BoutonScoresUtilisateur.class differ diff --git a/projet_linea/bin/BoutonsManager$1.class b/projet_linea/bin/BoutonsManager$1.class index 4706546..ab54c0c 100644 Binary files a/projet_linea/bin/BoutonsManager$1.class and b/projet_linea/bin/BoutonsManager$1.class differ diff --git a/projet_linea/bin/BoutonsManager.class b/projet_linea/bin/BoutonsManager.class index 4e6e27f..87e6721 100644 Binary files a/projet_linea/bin/BoutonsManager.class and b/projet_linea/bin/BoutonsManager.class differ diff --git a/projet_linea/bin/CadreDeConnexion.class b/projet_linea/bin/CadreDeConnexion.class index 2e7a734..cc0b0d2 100644 Binary files a/projet_linea/bin/CadreDeConnexion.class and b/projet_linea/bin/CadreDeConnexion.class differ diff --git a/projet_linea/bin/Cercle.class b/projet_linea/bin/Cercle.class index 9899856..4895faf 100644 Binary files a/projet_linea/bin/Cercle.class and b/projet_linea/bin/Cercle.class differ diff --git a/projet_linea/bin/GestionAudio.class b/projet_linea/bin/GestionAudio.class index 5af7c65..578299c 100644 Binary files a/projet_linea/bin/GestionAudio.class and b/projet_linea/bin/GestionAudio.class differ diff --git a/projet_linea/bin/Jeu.class b/projet_linea/bin/Jeu.class index fe5b39d..7f4e328 100644 Binary files a/projet_linea/bin/Jeu.class and b/projet_linea/bin/Jeu.class differ diff --git a/projet_linea/bin/Ligne.class b/projet_linea/bin/Ligne.class index ad4a75b..e668ad7 100644 Binary files a/projet_linea/bin/Ligne.class and b/projet_linea/bin/Ligne.class differ diff --git a/projet_linea/bin/LineaAppli.class b/projet_linea/bin/LineaAppli.class index ed2bb20..531b1f9 100644 Binary files a/projet_linea/bin/LineaAppli.class and b/projet_linea/bin/LineaAppli.class differ diff --git a/projet_linea/bin/MenuPrincipal.class b/projet_linea/bin/MenuPrincipal.class index c64e464..00eb76f 100644 Binary files a/projet_linea/bin/MenuPrincipal.class and b/projet_linea/bin/MenuPrincipal.class differ diff --git a/projet_linea/bin/NiveauxDataConnect.class b/projet_linea/bin/NiveauxDataConnect.class index 07337fa..3ab23fd 100644 Binary files a/projet_linea/bin/NiveauxDataConnect.class and b/projet_linea/bin/NiveauxDataConnect.class differ diff --git a/projet_linea/bin/ObjetGraphique.class b/projet_linea/bin/ObjetGraphique.class index 088d49f..325acf6 100644 Binary files a/projet_linea/bin/ObjetGraphique.class and b/projet_linea/bin/ObjetGraphique.class differ diff --git a/projet_linea/bin/Segment.class b/projet_linea/bin/Segment.class index d0718db..7d9bff8 100644 Binary files a/projet_linea/bin/Segment.class and b/projet_linea/bin/Segment.class differ diff --git a/projet_linea/bin/ZoneDessin.class b/projet_linea/bin/ZoneDessin.class index 7a83ceb..a0a61a2 100644 Binary files a/projet_linea/bin/ZoneDessin.class and b/projet_linea/bin/ZoneDessin.class differ diff --git a/projet_linea/bin/bddInit.class b/projet_linea/bin/bddInit.class index b9a410e..22b4134 100644 Binary files a/projet_linea/bin/bddInit.class and b/projet_linea/bin/bddInit.class differ diff --git a/projet_linea/bin/images/icone.png b/projet_linea/bin/images/icone.png new file mode 100644 index 0000000..d728eca Binary files /dev/null and b/projet_linea/bin/images/icone.png differ diff --git a/projet_linea/bin/musiques/son_ZENITH_FLUX.wav b/projet_linea/bin/musiques/son_ZENITH_FLUX.wav new file mode 100644 index 0000000..5017092 Binary files /dev/null and b/projet_linea/bin/musiques/son_ZENITH_FLUX.wav differ diff --git a/projet_linea/src/CadreDeConnexion.java b/projet_linea/src/CadreDeConnexion.java index 81e618a..f0988c4 100644 --- a/projet_linea/src/CadreDeConnexion.java +++ b/projet_linea/src/CadreDeConnexion.java @@ -27,6 +27,10 @@ public class CadreDeConnexion extends JFrame { // S'assure que la structure de la base existe même avant la connexion/création de compte GestionBDD.creerTableUtilisateurSiAbsente(); GestionBDD.creerTableScoreSiAbsente(); + + String musiqueZENITH = "musiques/son_ZENITH_FLUX.wav"; + + GestionAudio.jouerMusique(musiqueZENITH); // Image de fond de la page de connexion Background panelBackground = null; diff --git a/projet_linea/src/GestionAudio.java b/projet_linea/src/GestionAudio.java index e9c7624..e5a9dbb 100644 --- a/projet_linea/src/GestionAudio.java +++ b/projet_linea/src/GestionAudio.java @@ -21,6 +21,10 @@ public class GestionAudio { // Méthode pour jouer la musique //------------------------------------------------------------------------------ public static void jouerMusique(String cheminDansSrc){ + if (cheminDansSrc == null || cheminDansSrc.isEmpty()) { + return; + } + // Si la musique demandée joue déjà, on ne fait rien if(cheminDansSrc.equals(musiqueActuelle)){ return; @@ -38,15 +42,16 @@ public class GestionAudio { if(urlSound != null){ // On transforme le fichier URL du fichier en flux audio lisible ar JAVA // Autrement dit: On prépare le fichier pour la lecture sonore - AudioInputStream ais = AudioSystem.getAudioInputStream(urlSound); - // Création d'un objet Clip permettant de ouer du son court en mémoire - clip = AudioSystem.getClip(); - // On charge le fluc audio dans le clip - // Le son est prêt à être joué - clip.open(ais); - clip.loop(clip.LOOP_CONTINUOUSLY); // On fait jouer en boucle infinie - clip.start(); // On démarre l'audio - musiqueActuelle = cheminDansSrc; // Notre musique Actuelle a déjà une valeur + try (AudioInputStream ais = AudioSystem.getAudioInputStream(urlSound)) { + // Création d'un objet Clip permettant de jouer du son court en mémoire + clip = AudioSystem.getClip(); + // On charge le flux audio dans le clip + // Le son est prêt à être joué + clip.open(ais); + clip.loop(Clip.LOOP_CONTINUOUSLY); // On fait jouer en boucle infinie + clip.start(); // On démarre l'audio + musiqueActuelle = cheminDansSrc; // Notre musique actuelle a déjà une valeur + } } } catch (Exception e) { System.err.println("Erreur Audio: " + e.getMessage()); @@ -60,8 +65,8 @@ public class GestionAudio { if(clip != null){ clip.stop(); clip.close(); + clip = null; musiqueActuelle = ""; } - throw new UnsupportedOperationException("Unimplemented method 'stop'"); } } diff --git a/projet_linea/src/Jeu.java b/projet_linea/src/Jeu.java index 379d246..74b84fd 100644 --- a/projet_linea/src/Jeu.java +++ b/projet_linea/src/Jeu.java @@ -2,7 +2,9 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; +import java.net.URL; import java.sql.Connection; +import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; @@ -79,8 +81,21 @@ public class Jeu implements KeyListener, ActionListener{ // Créer les tables de la base de données si elles n'existent pas GestionBDD.creerTableUtilisateurSiAbsente(); GestionBDD.creerTableScoreSiAbsente(); - + JFrame fenetre = new JFrame(); + + try { + String cheminRessource = "/images/icone.png"; + URL url = getClass().getResource(cheminRessource); + if (url != null) { + java.awt.Image img = ImageIO.read(url); + fenetre.setIconImage(img); + } else { + System.err.println("Ressource introuvable : " + cheminRessource); + } + } catch (Exception e) { + System.err.println("Erreur chargement image : " + e.getMessage()); + } this.utilisateurId = utilisateurId; @@ -214,6 +229,19 @@ public class Jeu implements KeyListener, ActionListener{ JFrame fenetre = new JFrame(); this.fenetrePrincipale = fenetre; // On sauvegarde la fenêtre principale de la partie en cours dans une variable. Cela nous permettra de la fermer proprement (avec la méthode .dispose()) quand le joueur voudra lancer une nouvelle partie. + try { + String cheminRessource = "/images/icone.png"; + URL url = getClass().getResource(cheminRessource); + if (url != null) { + java.awt.Image img = ImageIO.read(url); + fenetre.setIconImage(img); + } else { + System.err.println("Ressource introuvable : " + cheminRessource); + } + } catch (Exception e) { + System.err.println("Erreur chargement image : " + e.getMessage()); + } + // A FAIRE : // placer dans l'instance de l'écran tous les objets graphiques nécessaires // par exemple : ecran.ajouterObjet(demiCerleArriere); @@ -328,14 +356,14 @@ public class Jeu implements KeyListener, ActionListener{ // On corse le jeu avec son ID //On applique les paramètres aux options de jeu - GestionAudio.jouerMusique(niveauEnCours.getMusiqueNiveau()); + this.laLigne.generer(niveauEnCours.getNbSegments(), niveauEnCours.getId()); this.laLigne.setVitesseLigne(niveauEnCours.getVitesseLigne()); // On modifie la vitesse de déplacement this.demiCercleAvant.setCouleur(niveauEnCours.getCouleurCercle()); this.demiCercleArriere.setCouleur(niveauEnCours.getCouleurCercle()); this.ecran.changerImageFond(niveauEnCours.getImage()); this.itemCourant.vitesse = niveauEnCours.getVitesseLigne(); - + GestionAudio.jouerMusique(niveauEnCours.getMusiqueNiveau()); }else{ diff --git a/projet_linea/src/Ligne.java b/projet_linea/src/Ligne.java index e4545ce..75cad05 100644 --- a/projet_linea/src/Ligne.java +++ b/projet_linea/src/Ligne.java @@ -12,7 +12,7 @@ public class Ligne extends ObjetGraphique{// Hérite de la classe ObjetGraphique //------------------------------------------------------------------------- // nb de Segments qui composent la ligne - protected int nbSegments = 400; + protected int nbSegments = 1500; // position du cercle, pour déterminer quel est le segment courant protected double xCercle = 400; // à modifier diff --git a/projet_linea/src/NiveauxDataConnect.java b/projet_linea/src/NiveauxDataConnect.java index d59e339..afb598e 100644 --- a/projet_linea/src/NiveauxDataConnect.java +++ b/projet_linea/src/NiveauxDataConnect.java @@ -102,7 +102,7 @@ public class NiveauxDataConnect { + "nb_segments INTEGER NOT NULL, " /*nombre de segments à faire passer au joueur pour réussir le niveau*/ + "image TEXT NOT NULL, " /*image du niveau*/ + "multiplicateur_score INTEGER, " /*multiplier le score en fonction du niveau*/ - + "couleur_cercle TEXT NOT NULL " /*Couleur du cercle en fonctiond du niveau */ + + "couleur_cercle TEXT NOT NULL, " /*Couleur du cercle en fonctiond du niveau */ + "musique_theme TEXT NOT NULL" /*Musique du thème du niveau */ +");" ; @@ -125,26 +125,26 @@ public class NiveauxDataConnect { // le jeu est lancé // Pour corser le jeu, on utilisera l'id du niveau qui nous servira de difficulté // --------------------------------Niveau 1 --------------------------------------------------------------------------------------------------------------------------------------------------- - // nom = "Facile", vitesse_ligne = 5, nb_segments = 50, image = "images\ciel.jpeg", multiplicateur_score = 10, couleur_cercle = "bleu", musique = "musiques\musique_theme_ciel.wav" + // nom = "Facile", vitesse_ligne = 5, nb_segments = 150, image = "images\ciel.jpeg", multiplicateur_score = 10, couleur_cercle = "bleu", musique = "musiques\musique_theme_ciel.wav" // --------------------------------Niveau 2 --------------------------------------------------------------------------------------------------------------------------------------------------- - // nom = "intermédaire", vitesse_ligne = 7, nb_segments = 100, image = "images\montagnes.jpg", multiplicateur_score = 20, couleur_cercle = "gris", musique = "musiques\musique_theme_montagnes.wav" + // nom = "intermédaire", vitesse_ligne = 7, nb_segments = 250, image = "images\montagnes.jpg", multiplicateur_score = 20, couleur_cercle = "gris", musique = "musiques\musique_theme_montagnes.wav" // --------------------------------Niveau 3 --------------------------------------------------------------------------------------------------------------------------------------------------- - // nom = "Difficile", vitesse_ligne = 9, nb_segments = 100, image = "images\volcan.jpg", multiplicateur_score = 30, couleur_cercle = "marron", musique = "musiques\musique_theme_volcan.wav" + // nom = "Difficile", vitesse_ligne = 9, nb_segments = 250, image = "images\volcan.jpg", multiplicateur_score = 30, couleur_cercle = "marron", musique = "musiques\musique_theme_volcan.wav" // --------------------------------Niveau 4 --------------------------------------------------------------------------------------------------------------------------------------------------- - // nom = "Ultime", vitesse_ligne = 10, nb_segments = 150, image = "images\espace.jpg", multiplicateur_score = 50, couleur_cercle = "violet", musique = "musiques\musique_theme_espace.wav" + // nom = "Ultime", vitesse_ligne = 10, nb_segments = 200, image = "images\espace.jpg", multiplicateur_score = 50, couleur_cercle = "violet", musique = "musiques\musique_theme_espace.wav" // -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- public static void insererNiveau(Connection conn) { String query1 = "INSERT INTO niveau(nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle, musique_theme) " - + "VALUES('Facile', 5, 50, 'images/ciel.jpeg', 10, '#0000FF', 'musiques/musique_theme_ciel.wav');"; + + "VALUES('Facile', 5, 150, 'images/ciel.jpeg', 10, '#0000FF', 'musiques/musique_theme_ciel.wav');"; String query2 = "INSERT INTO niveau(nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle, musique_theme) " - + "VALUES('Intermédiaire', 7, 100, 'images/montagnes.jpg', 20, '#808080', 'musiques/musique_theme_montagnes.wav');"; + + "VALUES('Intermédiaire', 7, 250, 'images/montagnes.jpg', 20, '#808080', 'musiques/musique_theme_montagnes.wav');"; String query3 = "INSERT INTO niveau(nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle, musique_theme) " - + "VALUES('Difficile', 9, 100, 'images/volcan.jpg', 30, '#8B4513', 'musiques/musique_theme_volcan.wav');"; + + "VALUES('Difficile', 9, 250, 'images/volcan.jpg', 30, '#8B4513', 'musiques/musique_theme_volcan.wav');"; String query4 = "INSERT INTO niveau(nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle, musique_theme) " - + "VALUES('Ultime', 10, 150, 'images/espace.jpg', 50, '#9400D3', 'musiques/musique_theme_espace.wav');"; + + "VALUES('Ultime', 10, 200, 'images/espace.jpg', 50, '#9400D3', 'musiques/musique_theme_espace.wav');"; try (Statement stmt = conn.createStatement()) { stmt.execute(query1); diff --git a/projet_linea/src/musiques/son_ZENITH_FLUX.wav b/projet_linea/src/musiques/son_ZENITH_FLUX.wav new file mode 100644 index 0000000..5017092 Binary files /dev/null and b/projet_linea/src/musiques/son_ZENITH_FLUX.wav differ