diff --git a/projet_linea/Niveaux.db b/projet_linea/Niveaux.db index 38c8221..909dd82 100644 Binary files a/projet_linea/Niveaux.db and b/projet_linea/Niveaux.db differ diff --git a/projet_linea/UserScoreBDD.db b/projet_linea/UserScoreBDD.db index 2fd78b4..ccbc43f 100644 Binary files a/projet_linea/UserScoreBDD.db and b/projet_linea/UserScoreBDD.db differ diff --git a/projet_linea/bin/Cercle.class b/projet_linea/bin/Cercle.class index 50abd3c..4895faf 100644 Binary files a/projet_linea/bin/Cercle.class and b/projet_linea/bin/Cercle.class differ diff --git a/projet_linea/bin/Ligne.class b/projet_linea/bin/Ligne.class index 09e2ed5..74b1092 100644 Binary files a/projet_linea/bin/Ligne.class and b/projet_linea/bin/Ligne.class differ diff --git a/projet_linea/bin/Niveau.class b/projet_linea/bin/Niveau.class index ff7abfa..b7f0f89 100644 Binary files a/projet_linea/bin/Niveau.class and b/projet_linea/bin/Niveau.class differ diff --git a/projet_linea/bin/NiveauxDataConnect.class b/projet_linea/bin/NiveauxDataConnect.class index 7751f2b..d7ac474 100644 Binary files a/projet_linea/bin/NiveauxDataConnect.class and b/projet_linea/bin/NiveauxDataConnect.class differ diff --git a/projet_linea/bin/Segment.class b/projet_linea/bin/Segment.class index c58a89e..7d9bff8 100644 Binary files a/projet_linea/bin/Segment.class and b/projet_linea/bin/Segment.class differ diff --git a/projet_linea/bin/bddInit.class b/projet_linea/bin/bddInit.class index 3780038..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/src/CadreDeConnexion.java b/projet_linea/src/CadreDeConnexion.java index 4628e9c..2f0f505 100644 --- a/projet_linea/src/CadreDeConnexion.java +++ b/projet_linea/src/CadreDeConnexion.java @@ -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 (Gris foncé) - JPanel panel = new JPanel(new GridBagLayout()); - panel.setBackground(new Color(30, 30, 30)); - add(panel); + // 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("Utilisateur :")); @@ -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("Nouvel utilisateur :")); + createBox.add(newUserField); + createBox.add(Box.createVerticalStrut(15)); + createBox.add(new JLabel("Mot de passe :")); + 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); } } diff --git a/projet_linea/src/Cercle.java b/projet_linea/src/Cercle.java index 2d45f36..fd5e8bd 100644 --- a/projet_linea/src/Cercle.java +++ b/projet_linea/src/Cercle.java @@ -10,7 +10,8 @@ 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; - } + // chute libre + 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; } } diff --git a/projet_linea/src/Jeu.java b/projet_linea/src/Jeu.java index 0f25080..4ebd13a 100644 --- a/projet_linea/src/Jeu.java +++ b/projet_linea/src/Jeu.java @@ -62,6 +62,10 @@ public class Jeu implements KeyListener, ActionListener{ // Constructeur de la classe //------------------------------------------------------------------------- public Jeu(int utilisateurId){ + // Créer les tables de la base de données si elles n'existent pas + GestionBDD.creerTableUtilisateurSiAbsente(); + GestionBDD.creerTableScoreSiAbsente(); + JFrame fenetre = new JFrame(); this.utilisateurId = utilisateurId; @@ -84,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(); } } @@ -238,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 @@ -271,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(); @@ -289,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 diff --git a/projet_linea/src/Ligne.java b/projet_linea/src/Ligne.java index b126518..fa4a6d8 100644 --- a/projet_linea/src/Ligne.java +++ b/projet_linea/src/Ligne.java @@ -173,6 +173,7 @@ public class Ligne extends ObjetGraphique{// Hérite de la classe ObjetGraphique } return dansCercle; } + public Segment getSegCourant() { return this.SegCourant; } diff --git a/projet_linea/src/LineaAppli.java b/projet_linea/src/LineaAppli.java index 08ecd84..b9e6085 100644 --- a/projet_linea/src/LineaAppli.java +++ b/projet_linea/src/LineaAppli.java @@ -9,4 +9,5 @@ public class LineaAppli { } + } diff --git a/projet_linea/src/NiveauxDataConnect.java b/projet_linea/src/NiveauxDataConnect.java index c00ea93..b549612 100644 --- a/projet_linea/src/NiveauxDataConnect.java +++ b/projet_linea/src/NiveauxDataConnect.java @@ -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); diff --git a/projet_linea/src/Segment.java b/projet_linea/src/Segment.java index 60374da..59dbb0d 100644 --- a/projet_linea/src/Segment.java +++ b/projet_linea/src/Segment.java @@ -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; diff --git a/projet_linea/src/images/icone.png b/projet_linea/src/images/icone.png new file mode 100644 index 0000000..d728eca Binary files /dev/null and b/projet_linea/src/images/icone.png differ