add README and finish MVP product
This commit is contained in:
@@ -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
|
⚖️ Gravité constante : l’anneau est continuellement attiré vers le bas
|
||||||
- `lib`: the folder to maintain dependencies
|
🚀 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.
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
projet_linea/bin/images/icone.png
Normal file
BIN
projet_linea/bin/images/icone.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 815 KiB |
BIN
projet_linea/bin/musiques/son_ZENITH_FLUX.wav
Normal file
BIN
projet_linea/bin/musiques/son_ZENITH_FLUX.wav
Normal file
Binary file not shown.
@@ -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
|
// S'assure que la structure de la base existe même avant la connexion/création de compte
|
||||||
GestionBDD.creerTableUtilisateurSiAbsente();
|
GestionBDD.creerTableUtilisateurSiAbsente();
|
||||||
GestionBDD.creerTableScoreSiAbsente();
|
GestionBDD.creerTableScoreSiAbsente();
|
||||||
|
|
||||||
|
String musiqueZENITH = "musiques/son_ZENITH_FLUX.wav";
|
||||||
|
|
||||||
|
GestionAudio.jouerMusique(musiqueZENITH);
|
||||||
|
|
||||||
// Image de fond de la page de connexion
|
// Image de fond de la page de connexion
|
||||||
Background panelBackground = null;
|
Background panelBackground = null;
|
||||||
|
|||||||
@@ -21,6 +21,10 @@ public class GestionAudio {
|
|||||||
// Méthode pour jouer la musique
|
// Méthode pour jouer la musique
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
public static void jouerMusique(String cheminDansSrc){
|
public static void jouerMusique(String cheminDansSrc){
|
||||||
|
if (cheminDansSrc == null || cheminDansSrc.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Si la musique demandée joue déjà, on ne fait rien
|
// Si la musique demandée joue déjà, on ne fait rien
|
||||||
if(cheminDansSrc.equals(musiqueActuelle)){
|
if(cheminDansSrc.equals(musiqueActuelle)){
|
||||||
return;
|
return;
|
||||||
@@ -38,15 +42,16 @@ public class GestionAudio {
|
|||||||
if(urlSound != null){
|
if(urlSound != null){
|
||||||
// On transforme le fichier URL du fichier en flux audio lisible ar JAVA
|
// On transforme le fichier URL du fichier en flux audio lisible ar JAVA
|
||||||
// Autrement dit: On prépare le fichier pour la lecture sonore
|
// Autrement dit: On prépare le fichier pour la lecture sonore
|
||||||
AudioInputStream ais = AudioSystem.getAudioInputStream(urlSound);
|
try (AudioInputStream ais = AudioSystem.getAudioInputStream(urlSound)) {
|
||||||
// Création d'un objet Clip permettant de ouer du son court en mémoire
|
// Création d'un objet Clip permettant de jouer du son court en mémoire
|
||||||
clip = AudioSystem.getClip();
|
clip = AudioSystem.getClip();
|
||||||
// On charge le fluc audio dans le clip
|
// On charge le flux audio dans le clip
|
||||||
// Le son est prêt à être joué
|
// Le son est prêt à être joué
|
||||||
clip.open(ais);
|
clip.open(ais);
|
||||||
clip.loop(clip.LOOP_CONTINUOUSLY); // On fait jouer en boucle infinie
|
clip.loop(Clip.LOOP_CONTINUOUSLY); // On fait jouer en boucle infinie
|
||||||
clip.start(); // On démarre l'audio
|
clip.start(); // On démarre l'audio
|
||||||
musiqueActuelle = cheminDansSrc; // Notre musique Actuelle a déjà une valeur
|
musiqueActuelle = cheminDansSrc; // Notre musique actuelle a déjà une valeur
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
System.err.println("Erreur Audio: " + e.getMessage());
|
System.err.println("Erreur Audio: " + e.getMessage());
|
||||||
@@ -60,8 +65,8 @@ public class GestionAudio {
|
|||||||
if(clip != null){
|
if(clip != null){
|
||||||
clip.stop();
|
clip.stop();
|
||||||
clip.close();
|
clip.close();
|
||||||
|
clip = null;
|
||||||
musiqueActuelle = "";
|
musiqueActuelle = "";
|
||||||
}
|
}
|
||||||
throw new UnsupportedOperationException("Unimplemented method 'stop'");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,9 @@ import java.awt.event.ActionEvent;
|
|||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
import java.awt.event.KeyEvent;
|
import java.awt.event.KeyEvent;
|
||||||
import java.awt.event.KeyListener;
|
import java.awt.event.KeyListener;
|
||||||
|
import java.net.URL;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
import javax.swing.JFrame;
|
import javax.swing.JFrame;
|
||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JOptionPane;
|
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
|
// Créer les tables de la base de données si elles n'existent pas
|
||||||
GestionBDD.creerTableUtilisateurSiAbsente();
|
GestionBDD.creerTableUtilisateurSiAbsente();
|
||||||
GestionBDD.creerTableScoreSiAbsente();
|
GestionBDD.creerTableScoreSiAbsente();
|
||||||
|
|
||||||
JFrame fenetre = new JFrame();
|
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;
|
this.utilisateurId = utilisateurId;
|
||||||
|
|
||||||
@@ -214,6 +229,19 @@ public class Jeu implements KeyListener, ActionListener{
|
|||||||
JFrame fenetre = new JFrame();
|
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.
|
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 :
|
// A FAIRE :
|
||||||
// placer dans l'instance de l'écran tous les objets graphiques nécessaires
|
// placer dans l'instance de l'écran tous les objets graphiques nécessaires
|
||||||
// par exemple : ecran.ajouterObjet(demiCerleArriere);
|
// par exemple : ecran.ajouterObjet(demiCerleArriere);
|
||||||
@@ -328,14 +356,14 @@ public class Jeu implements KeyListener, ActionListener{
|
|||||||
|
|
||||||
// On corse le jeu avec son ID
|
// On corse le jeu avec son ID
|
||||||
//On applique les paramètres aux options de jeu
|
//On applique les paramètres aux options de jeu
|
||||||
GestionAudio.jouerMusique(niveauEnCours.getMusiqueNiveau());
|
|
||||||
this.laLigne.generer(niveauEnCours.getNbSegments(), niveauEnCours.getId());
|
this.laLigne.generer(niveauEnCours.getNbSegments(), niveauEnCours.getId());
|
||||||
this.laLigne.setVitesseLigne(niveauEnCours.getVitesseLigne()); // On modifie la vitesse de déplacement
|
this.laLigne.setVitesseLigne(niveauEnCours.getVitesseLigne()); // On modifie la vitesse de déplacement
|
||||||
this.demiCercleAvant.setCouleur(niveauEnCours.getCouleurCercle());
|
this.demiCercleAvant.setCouleur(niveauEnCours.getCouleurCercle());
|
||||||
this.demiCercleArriere.setCouleur(niveauEnCours.getCouleurCercle());
|
this.demiCercleArriere.setCouleur(niveauEnCours.getCouleurCercle());
|
||||||
this.ecran.changerImageFond(niveauEnCours.getImage());
|
this.ecran.changerImageFond(niveauEnCours.getImage());
|
||||||
this.itemCourant.vitesse = niveauEnCours.getVitesseLigne();
|
this.itemCourant.vitesse = niveauEnCours.getVitesseLigne();
|
||||||
|
GestionAudio.jouerMusique(niveauEnCours.getMusiqueNiveau());
|
||||||
|
|
||||||
|
|
||||||
}else{
|
}else{
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ public class Ligne extends ObjetGraphique{// Hérite de la classe ObjetGraphique
|
|||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
|
|
||||||
// nb de Segments qui composent la ligne
|
// 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
|
// position du cercle, pour déterminer quel est le segment courant
|
||||||
protected double xCercle = 400; // à modifier
|
protected double xCercle = 400; // à modifier
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ public class NiveauxDataConnect {
|
|||||||
+ "nb_segments INTEGER NOT NULL, " /*nombre de segments à faire passer au joueur pour réussir le niveau*/
|
+ "nb_segments INTEGER NOT NULL, " /*nombre de segments à faire passer au joueur pour réussir le niveau*/
|
||||||
+ "image TEXT NOT NULL, " /*image du niveau*/
|
+ "image TEXT NOT NULL, " /*image du niveau*/
|
||||||
+ "multiplicateur_score INTEGER, " /*multiplier le score en fonction 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 */
|
+ "musique_theme TEXT NOT NULL" /*Musique du thème du niveau */
|
||||||
+");" ;
|
+");" ;
|
||||||
|
|
||||||
@@ -125,26 +125,26 @@ public class NiveauxDataConnect {
|
|||||||
// le jeu est lancé
|
// le jeu est lancé
|
||||||
// Pour corser le jeu, on utilisera l'id du niveau qui nous servira de difficulté
|
// Pour corser le jeu, on utilisera l'id du niveau qui nous servira de difficulté
|
||||||
// --------------------------------Niveau 1 ---------------------------------------------------------------------------------------------------------------------------------------------------
|
// --------------------------------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 ---------------------------------------------------------------------------------------------------------------------------------------------------
|
// --------------------------------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 ---------------------------------------------------------------------------------------------------------------------------------------------------
|
// --------------------------------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 ---------------------------------------------------------------------------------------------------------------------------------------------------
|
// --------------------------------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) {
|
public static void insererNiveau(Connection conn) {
|
||||||
String query1 = "INSERT INTO niveau(nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle, musique_theme) "
|
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) "
|
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) "
|
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) "
|
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()) {
|
try (Statement stmt = conn.createStatement()) {
|
||||||
stmt.execute(query1);
|
stmt.execute(query1);
|
||||||
|
|||||||
BIN
projet_linea/src/musiques/son_ZENITH_FLUX.wav
Normal file
BIN
projet_linea/src/musiques/son_ZENITH_FLUX.wav
Normal file
Binary file not shown.
Reference in New Issue
Block a user