Compare commits

...

2 Commits

Author SHA1 Message Date
ade491ed5e update mode TRiche by ISmael 2026-03-27 15:34:53 +01:00
5d755ff29e add icon and app name 2026-03-27 14:43:31 +01:00
28 changed files with 179 additions and 29 deletions

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.

After

Width:  |  Height:  |  Size: 815 KiB

View File

@@ -1,24 +1,58 @@
import java.awt.*;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
public class CadreDeConnexion extends JFrame {
//--------------------------------------------------------------------------
// Méthode peremttant de charger(récupérer) l'image îcone depuis Ressources
// -------------------------------------------------------------------------
private Image chargerImageDepuisRessource(String cheminRessource) {
// Cette méthode doit seulement charger l'image, pas rappeler elle-même.
try {
URL url = getClass().getResource(cheminRessource);
if (url != null) {
return ImageIO.read(url);
}
System.err.println("Ressource introuvable : " + cheminRessource);
} catch (Exception e) {
System.err.println("Erreur chargement image : " + e.getMessage());
}
return null;
}
public CadreDeConnexion() {
// 1. Configuration de base
setTitle("Connexion Linea");
// Image de fond de la page de connexion
Background panelBackground = null;
// 1. On change l'icône de CETTE fenêtre (this)
Image imageConnexion = chargerImageDepuisRessource("/images/icone.png");
if (imageConnexion != null) {
// On applique la même image comme icône de la fenêtre
this.setIconImage(imageConnexion);
// On prépare aussi le fond pour le panneau de connexion
panelBackground = new Background(imageConnexion);
}
// 2. Configuration de base
setTitle("ZENITH FLUX");
setSize(800, 600);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null); // Centre la fenêtre
// 2. Style du panneau principal (noir )
JPanel panel = new JPanel(new GridBagLayout());
panel.setBackground(new Color(30, 30, 30));
add(panel);
// 2. Style du panneau principal (Gris foncé)
// On utilise ZoneDessin pour pouvoir dessiner l'image en fond
JPanel panel = new ZoneDessin(panelBackground);
panel.setLayout(new GridBagLayout());
setContentPane(panel);
// Conteneur pour les éléments (pour les empiler verticalement)
Box box = Box.createVerticalBox();
// 3. Création des composants
// 4. Création des composants
JLabel titre = new JLabel("CONNEXION");
titre.setForeground(Color.WHITE);
titre.setFont(new Font("Arial", Font.BOLD, 24));
@@ -32,7 +66,7 @@ public class CadreDeConnexion extends JFrame {
JButton loginBtn = BoutonsManager.creerBoutonConnexion(userField, passField, this);
// 4. Ajout des composants avec des espaces (Struts)
// 5. Ajout des composants avec des espaces (Struts)
box.add(titre);
box.add(Box.createVerticalStrut(30)); // Espace
box.add(new JLabel("<html><font color='white'>Utilisateur :</font></html>"));
@@ -49,6 +83,92 @@ public class CadreDeConnexion extends JFrame {
panel.add(box); // Ajoute la boîte au centre du GridBagLayout
// 5. Logique du bouton
loginBtn.addActionListener(e -> {
String user = userField.getText();
String pass = new String(passField.getPassword());
int userId = GestionBDD.verifierConnexion(user, pass);
if (userId != -1) {
dispose();
Jeu jeu = new Jeu(userId);
jeu.demarrer();
} else {
JOptionPane.showMessageDialog(this, "Acces refuse");
}
});
createBtn.addActionListener(evt -> {
JFrame createFrame = new JFrame("Creation de compte");
createFrame.setSize(800, 600);
createFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
createFrame.setLocationRelativeTo(null);
// On recharge la même image pour la fenêtre de création de compte
// afin de lui donner à la fois l'icône et le fond d'écran.
Background panelBackgroundCreation = null;
Image imageCreation = chargerImageDepuisRessource("/images/icone.png");
if (imageCreation != null) {
createFrame.setIconImage(imageCreation);
panelBackgroundCreation = new Background(imageCreation);
}
// Même principe que pour la page de connexion : le fond est dessiné par ZoneDessin
JPanel createPanel = new ZoneDessin(panelBackgroundCreation);
createPanel.setLayout(new GridBagLayout());
createFrame.setContentPane(createPanel);
Box createBox = Box.createVerticalBox();
JLabel createTitre = new JLabel("CREATION DE COMPTE");
createTitre.setForeground(Color.WHITE);
createTitre.setFont(new Font("Arial", Font.BOLD, 24));
createTitre.setAlignmentX(Component.CENTER_ALIGNMENT);
JTextField newUserField = new JTextField(15);
newUserField.setMaximumSize(new Dimension(250, 30));
JPasswordField newPassField = new JPasswordField(15);
newPassField.setMaximumSize(new Dimension(250, 30));
JButton createAccountBtn = new JButton("Créer");
createAccountBtn.setBackground(new Color(70, 130, 180));
createAccountBtn.setForeground(Color.WHITE);
createAccountBtn.setFocusPainted(false);
createAccountBtn.setAlignmentX(Component.CENTER_ALIGNMENT);
createBox.add(createTitre);
createBox.add(Box.createVerticalStrut(30));
createBox.add(new JLabel("<html><font color='white'>Nouvel utilisateur :</font></html>"));
createBox.add(newUserField);
createBox.add(Box.createVerticalStrut(15));
createBox.add(new JLabel("<html><font color='white'>Mot de passe :</font></html>"));
createBox.add(newPassField);
createBox.add(Box.createVerticalStrut(30));
createBox.add(createAccountBtn);
createPanel.add(createBox);
createAccountBtn.addActionListener(e -> {
String u = newUserField.getText().trim();
String p = new String(newPassField.getPassword());
if (u.isEmpty() || p.isEmpty()) {
JOptionPane.showMessageDialog(createFrame, "Utilisateur et mot de passe requis");
return;
}
boolean ok = GestionBDD.creerUtilisateur(u, p);
if (ok) {
JOptionPane.showMessageDialog(createFrame, "Compte cree avec succes.");
createFrame.dispose();
} else {
JOptionPane.showMessageDialog(createFrame, "Échec : le nom d'utilisateur existe deja ou erreur.");
}
});
createFrame.setVisible(true);
});
setVisible(true);
}
}

View File

@@ -11,6 +11,7 @@ public class Cercle extends ObjetGraphique{ // il s'agit plutôt d'arcs de cercl
//-------------------------------------------------------------------------
// PROPRIETES
//-------------------------------------------------------------------------
private double gravite = 10.0;
protected double rayon = 30;
protected double depY = 0; // déplacement
@@ -77,6 +78,12 @@ public class Cercle extends ObjetGraphique{ // il s'agit plutôt d'arcs de cercl
return y;
}
//-------------------------------------------------------------------------
// Méthode pour mettre à jour la gravité du cercle depuis la classe
//-------------------------------------------------------------------------
public void setGravite(double nouvelleGravite) {
this.gravite = nouvelleGravite;
}
//-------------------------------------------------------------------------
// Méthode qui note que up a été appuyée
// -> le booléen permet de ne plus être tributaire
@@ -118,17 +125,15 @@ public class Cercle extends ObjetGraphique{ // il s'agit plutôt d'arcs de cercl
void Animer() {
// pas est à prendre comme un "delta t"
if (!modeTriche) {
// chute libre
vitesse = vitesse + 9.81 * pas;
}
vitesse = vitesse + gravite * pas;
// impulsion (toujours appliquée, même en triche ?)
if (montee==true) {
vitesse = vitesse - impulsion *pas;
}
depY = 1/2 * 9.81 + vitesse * pas;
depY = 1/2 * gravite + vitesse * pas;
if (depY<-10) {
depY=-10;
@@ -144,7 +149,7 @@ public class Cercle extends ObjetGraphique{ // il s'agit plutôt d'arcs de cercl
// Méthode pour mettre un plafond et un sol au cercle
public void verification_cercle_out(){
if(y < plafond || (y + rayon) >= sol ) {
vitesse = -vitesse;
vitesse =-vitesse;
}
}

View File

@@ -88,13 +88,14 @@ public class Jeu implements KeyListener, ActionListener{
if( n1 != null ){
try {
// On charge l'mage du niveau 1
// On charge l'image du niveau 1
java.net.URL url = Jeu.class.getResource("/" + n1.getImage());
if(url != null){
java.awt.Image img = javax.imageio.ImageIO.read(url);
premierFond = new Background(img);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@@ -242,6 +243,18 @@ public class Jeu implements KeyListener, ActionListener{
this.dernierSegmentValide = null;
this.ecran.partiePerdue = false;
// Formule : Gravité de base - (Niveau * incrément)
// Niveau 1 : 10.0 + (1 * 1.50) = 8.5 (poids normal)
// Niveau 4 : 10.0 + (4 * 1.50) = 4.0 (Très léger et plane)
double graviteNiveau = 10.0 - (this.niveauEnCours.getId() * 1.5);
// Sécurité: La gravité du niveau ne doit pas descendre en dessous de 2
// Sinon le cercle ne retomberait plus jamais
if(graviteNiveau < 2.0){
graviteNiveau = 2.0;
}
this.demiCercleAvant.setGravite(graviteNiveau);
this.demiCercleArriere.setGravite(graviteNiveau);
// On corse le jeu avec son ID
//On applique les paramètres aux options de jeu
@@ -275,7 +288,7 @@ public class Jeu implements KeyListener, ActionListener{
// Petite pause avec un message
horloge.stop();
JOptionPane.showMessageDialog(fenetre, "Niveau terminé ! Préparez-vous pour le niveau suivant ;)");
JOptionPane.showMessageDialog(fenetre, "Niveau terminé ! Préparez-vous pour le niveau suivant 😉 OU PERDEZ 😈");
chargerNiveau(idNiveauActuel);
horloge.start();
@@ -293,11 +306,14 @@ public class Jeu implements KeyListener, ActionListener{
this.ecran.traiterBoucleAnimation();
this.laLigne.actualiserSegCourant();
// Mode triche : centrer le cercle sur le milieu du segment courant
// Mode triche : Le cercle suit la ligne
// On utilisera le calcul pour déterminer si la ligne traverse le cercle
if (modeTriche && this.laLigne.getSegCourant() != null) {
double milieuY = this.laLigne.getSegCourant().getMilieuY();
this.demiCercleAvant.y = milieuY;
this.demiCercleArriere.y = milieuY;
// double yPoint = this.getSegCourant().y + (this.SegCourant.yLong / this.SegCourant.xLong) * (this.xCercle - this.SegCourant.x);
double yPointTricheArrire = this.laLigne.getSegCourant().getY() + (this.laLigne.getSegCourant().getYLong() / this.laLigne.getSegCourant().getXLong()) * (this.demiCercleArriere.getX() - this.laLigne.getSegCourant().getX());
double yPointTricheAvant = this.laLigne.getSegCourant().getY() + (this.laLigne.getSegCourant().getYLong() / this.laLigne.getSegCourant().getXLong()) * (this.demiCercleAvant.getX() - this.laLigne.getSegCourant().getX());
this.demiCercleAvant.y = yPointTricheArrire ;
this.demiCercleArriere.y = yPointTricheAvant;
}
// 2. On vérifie si la ligne traverse bien le cercle

View File

@@ -173,6 +173,7 @@ public class Ligne extends ObjetGraphique{// Hérite de la classe ObjetGraphique
}
return dansCercle;
}
public Segment getSegCourant() {
return this.SegCourant;
}

View File

@@ -124,24 +124,24 @@ 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 = 1, couleur_cercle = "bleu"
// nom = "Facile", vitesse_ligne = 5, nb_segments = 50, image = "images\ciel.jpeg", multiplicateur_score = 10, couleur_cercle = "bleu"
// --------------------------------Niveau 2 --------------------------------
// nom = "intermédaire", vitesse_ligne = 7, nb_segments = 100, image = "images\montagnes.jpg", multiplicateur_score = 2, couleur_cercle = "gris"
// nom = "intermédaire", vitesse_ligne = 7, nb_segments = 100, image = "images\montagnes.jpg", multiplicateur_score = 20, couleur_cercle = "gris"
// --------------------------------Niveau 3 --------------------------------
// nom = "Difficile", vitesse_ligne = 9, nb_segments = 100, image = "images\volcan.jpg", multiplicateur_score = 3, couleur_cercle = "marron"
// nom = "Difficile", vitesse_ligne = 9, nb_segments = 100, image = "images\volcan.jpg", multiplicateur_score = 30, couleur_cercle = "marron"
// --------------------------------Niveau 4 --------------------------------
// nom = "Ultime", vitesse_ligne = 10, nb_segments = 150, image = "images\espace.jpg", multiplicateur_score = 4, couleur_cercle = "violet"
// nom = "Ultime", vitesse_ligne = 10, nb_segments = 150, image = "images\espace.jpg", multiplicateur_score = 50, couleur_cercle = "violet"
// -------------------------------------------------------------------------
public static void insererNiveau(Connection conn) {
String query1 = "INSERT INTO niveau(nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle) "
+ "VALUES('Facile', 5, 50, 'images/ciel.jpeg', 1, '#0000FF');";
+ "VALUES('Facile', 5, 50, 'images/ciel.jpeg', 10, '#0000FF');";
String query2 = "INSERT INTO niveau(nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle) "
+ "VALUES('Intermédiaire', 7, 100, 'images/montagnes.jpg', 2, '#808080');";
+ "VALUES('Intermédiaire', 7, 100, 'images/montagnes.jpg', 20, '#808080');";
String query3 = "INSERT INTO niveau(nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle) "
+ "VALUES('Difficile', 9, 100, 'images/volcan.jpg', 3, '#8B4513');";
+ "VALUES('Difficile', 9, 100, 'images/volcan.jpg', 30, '#8B4513');";
String query4 = "INSERT INTO niveau(nom, vitesse_ligne, nb_segments, image, multiplicateur_score, couleur_cercle) "
+ "VALUES('Ultime', 10, 150, 'images/espace.jpg', 4, '#9400D3');";
+ "VALUES('Ultime', 10, 150, 'images/espace.jpg', 50, '#9400D3');";
try (Statement stmt = conn.createStatement()) {
stmt.execute(query1);

View File

@@ -32,6 +32,14 @@ public class Segment extends ObjetGraphique { // Hérite de la classe ObjetGraph
yLong = yyLong;
}
public double getYLong(){
return this.yLong;
}
public double getXLong(){
return this.xLong;
}
// Méthode pour obtenir la position Y au milieu du segment
public double getMilieuY() {
return y + yLong / 2;

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 815 KiB