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/BoutonsManager$1.class b/projet_linea/bin/BoutonsManager$1.class new file mode 100644 index 0000000..02e2ab7 Binary files /dev/null and b/projet_linea/bin/BoutonsManager$1.class differ diff --git a/projet_linea/bin/BoutonsManager.class b/projet_linea/bin/BoutonsManager.class new file mode 100644 index 0000000..767e8d3 Binary files /dev/null and b/projet_linea/bin/BoutonsManager.class differ diff --git a/projet_linea/bin/CadreDeConnexion.class b/projet_linea/bin/CadreDeConnexion.class index a052710..f6c8443 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 091ff1f..4895faf 100644 Binary files a/projet_linea/bin/Cercle.class and b/projet_linea/bin/Cercle.class differ diff --git a/projet_linea/bin/Jeu.class b/projet_linea/bin/Jeu.class index 32e21e9..efe92e2 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 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/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/src/BoutonsManager.java b/projet_linea/src/BoutonsManager.java new file mode 100644 index 0000000..3d4287a --- /dev/null +++ b/projet_linea/src/BoutonsManager.java @@ -0,0 +1,149 @@ +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.List; + +public class BoutonsManager { + + // Méthode pour créer le bouton des scores utilisateur + public static JButton creerBoutonScores(JFrame fenetre, int utilisateurId) { + JButton boutonScores = new JButton("Voir mes scores"); + + // Style + boutonScores.setBackground(Color.BLACK); + boutonScores.setForeground(Color.WHITE); + + // Position + boutonScores.setBounds(300, 20, 160, 30); + + // Action au clic + boutonScores.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + List scores = GestionBDD.recupererScoresUtilisateur(utilisateurId); + int meilleurScore = GestionBDD.recupererMeilleurScoreUtilisateur(utilisateurId); + + StringBuilder message = new StringBuilder(); + message.append("Meilleur score : ").append(meilleurScore).append("\n\n"); + message.append("Tous les scores :\n"); + + for (int score : scores) { + message.append(score).append("\n"); + } + + JOptionPane.showMessageDialog( + fenetre, + message.toString(), + "Mes Scores", + JOptionPane.INFORMATION_MESSAGE + ); + } + }); + + return boutonScores; + } + + // Méthode pour créer le bouton de connexion + public static JButton creerBoutonConnexion(JTextField userField, JPasswordField passField, JFrame cadre) { + JButton loginBtn = new JButton("Entrer"); + loginBtn.setBackground(new Color(70, 130, 180)); // Bleu acier + loginBtn.setForeground(Color.WHITE); + loginBtn.setFocusPainted(false); + loginBtn.setAlignmentX(Component.CENTER_ALIGNMENT); + + loginBtn.addActionListener(e -> { + String user = userField.getText(); + String pass = new String(passField.getPassword()); + int userId = GestionBDD.verifierConnexion(user, pass); + + if (userId != -1) { + cadre.dispose(); + Jeu jeu = new Jeu(userId); + jeu.demarrer(); + } else { + JOptionPane.showMessageDialog(cadre, "Acces refuse"); + } + }); + + return loginBtn; + } + + // Méthode pour créer le bouton "Créer un compte" + public static JButton creerBoutonCreerCompte(JFrame cadre) { + JButton createBtn = new JButton("Créer un compte"); + createBtn.setBackground(new Color(70, 130, 180)); + createBtn.setForeground(Color.WHITE); + createBtn.setFocusPainted(false); + createBtn.setAlignmentX(Component.CENTER_ALIGNMENT); + + createBtn.addActionListener(evt -> { + JFrame createFrame = new JFrame("Creation de compte"); + createFrame.setSize(800, 600); + createFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + createFrame.setLocationRelativeTo(null); + + JPanel createPanel = new JPanel(new GridBagLayout()); + createPanel.setBackground(new Color(30, 30, 30)); + createFrame.add(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 = creerBoutonCreerCompteFinal(newUserField, newPassField, createFrame); + + createBox.add(createTitre); + createBox.add(Box.createVerticalStrut(30)); + createBox.add(new JLabel("Nouveau 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); + createFrame.setVisible(true); + }); + + return createBtn; + } + + // Méthode pour créer le bouton "Créer" dans la fenêtre de création de compte + private static JButton creerBoutonCreerCompteFinal(JTextField newUserField, JPasswordField newPassField, JFrame createFrame) { + 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); + + createAccountBtn.addActionListener(e -> { + String newUser = newUserField.getText(); + String newPass = new String(newPassField.getPassword()); + + if (!newUser.isEmpty() && !newPass.isEmpty()) { + boolean success = GestionBDD.creerUtilisateur(newUser, newPass); + if (success) { + JOptionPane.showMessageDialog(createFrame, "Compte créé avec succès !"); + createFrame.dispose(); + } else { + JOptionPane.showMessageDialog(createFrame, "Erreur lors de la création du compte."); + } + } else { + JOptionPane.showMessageDialog(createFrame, "Veuillez remplir tous les champs."); + } + }); + + return createAccountBtn; + } +} \ No newline at end of file diff --git a/projet_linea/src/CadreDeConnexion.java b/projet_linea/src/CadreDeConnexion.java index 96cca0c..2f0f505 100644 --- a/projet_linea/src/CadreDeConnexion.java +++ b/projet_linea/src/CadreDeConnexion.java @@ -4,11 +4,13 @@ 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) { @@ -28,10 +30,10 @@ public class CadreDeConnexion extends JFrame { // 1. On change l'icône de CETTE fenêtre (this) Image imageConnexion = chargerImageDepuisRessource("/images/icone.png"); - // Si l'image est différent de null, on modifie l'icone de notre application - // Et on l'applique comme image de fond 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); } @@ -41,10 +43,11 @@ public class CadreDeConnexion extends JFrame { setDefaultCloseOperation(EXIT_ON_CLOSE); setLocationRelativeTo(null); // Centre la fenêtre - // 3. Style du panneau principal (Gris foncé) - // JPanel panel = new JPanel(new GridBagLayout()); + // 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(); @@ -61,11 +64,7 @@ public class CadreDeConnexion extends JFrame { JPasswordField passField = new JPasswordField(15); passField.setMaximumSize(new Dimension(250, 30)); - JButton loginBtn = new JButton("Entrer"); - loginBtn.setBackground(new Color(70, 130, 180)); // Bleu acier - loginBtn.setForeground(Color.WHITE); - loginBtn.setFocusPainted(false); - loginBtn.setAlignmentX(Component.CENTER_ALIGNMENT); + JButton loginBtn = BoutonsManager.creerBoutonConnexion(userField, passField, this); // 5. Ajout des composants avec des espaces (Struts) box.add(titre); @@ -79,17 +78,12 @@ public class CadreDeConnexion extends JFrame { box.add(loginBtn); box.add(Box.createVerticalStrut(10)); - JButton createBtn = new JButton("Créer un compte"); - createBtn.setBackground(new Color(70, 130, 180)); - createBtn.setForeground(Color.WHITE); - createBtn.setFocusPainted(false); - createBtn.setAlignmentX(Component.CENTER_ALIGNMENT); + JButton createBtn = BoutonsManager.creerBoutonCreerCompte(this); box.add(createBtn); panel.add(box); // Ajoute la boîte au centre du GridBagLayout - setContentPane(panel); // Branche enfin le panneau personnalisé à la fenêtre - // 6. Logique du bouton + // 5. Logique du bouton loginBtn.addActionListener(e -> { String user = userField.getText(); String pass = new String(passField.getPassword()); @@ -110,14 +104,17 @@ public class CadreDeConnexion extends JFrame { 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); } - Background panelBackgroundCreation = (imageCreation != null) ? new Background(imageCreation) : null; + // Même principe que pour la page de connexion : le fond est dessiné par ZoneDessin JPanel createPanel = new ZoneDessin(panelBackgroundCreation); - // JPanel createPanel = new JPanel(new GridBagLayout()); createPanel.setLayout(new GridBagLayout()); createFrame.setContentPane(createPanel); diff --git a/projet_linea/src/Cercle.java b/projet_linea/src/Cercle.java index fd0ac2e..fd5e8bd 100644 --- a/projet_linea/src/Cercle.java +++ b/projet_linea/src/Cercle.java @@ -37,6 +37,9 @@ public class Cercle extends ObjetGraphique{ // il s'agit plutôt d'arcs de cercl //sol du cercle protected double sol = 600; + + // Mode triche : désactive la gravité + protected boolean modeTriche = false; //------------------------------------------------------------------------- // METHODES //------------------------------------------------------------------------- @@ -76,7 +79,7 @@ public class Cercle extends ObjetGraphique{ // il s'agit plutôt d'arcs de cercl } //------------------------------------------------------------------------- - // Méthod epour mettre à jour la gravité du cercle depuis la classe + // Méthode pour mettre à jour la gravité du cercle depuis la classe //------------------------------------------------------------------------- public void setGravite(double nouvelleGravite) { this.gravite = nouvelleGravite; @@ -125,7 +128,7 @@ public class Cercle extends ObjetGraphique{ // il s'agit plutôt d'arcs de cercl // chute libre vitesse = vitesse + gravite * pas; - // impulsion + // impulsion (toujours appliquée, même en triche ?) if (montee==true) { vitesse = vitesse - impulsion *pas; } @@ -154,6 +157,14 @@ public class Cercle extends ObjetGraphique{ // il s'agit plutôt d'arcs de cercl public void resetVitesse(){ vitesse = 0; } + + // Méthode pour activer/désactiver le mode triche + public void setModeTriche(boolean triche) { + this.modeTriche = triche; + if (triche) { + this.vitesse = 0; // Réinitialiser la vitesse quand on active le triche + } + } diff --git a/projet_linea/src/Jeu.java b/projet_linea/src/Jeu.java index 2d8b365..2dec5ed 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; @@ -139,6 +143,8 @@ public class Jeu implements KeyListener, ActionListener{ if(keyCode==32){//touche espace modeTriche =!modeTriche; labTriche.setVisible(modeTriche); //afficher ou cacher le label + demiCercleAvant.setModeTriche(modeTriche); + demiCercleArriere.setModeTriche(modeTriche); } } @@ -195,7 +201,7 @@ public class Jeu implements KeyListener, ActionListener{ ecran.requestFocusInWindow(); fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - javax.swing.JButton boutonscores = BoutonScoresUtilisateur.creerBouton(fenetre, utilisateurId); + javax.swing.JButton boutonscores = BoutonsManager.creerBoutonScores(fenetre, utilisateurId); this.ecran.add(boutonscores); @@ -300,6 +306,16 @@ public class Jeu implements KeyListener, ActionListener{ this.ecran.traiterBoucleAnimation(); this.laLigne.actualiserSegCourant(); + // 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 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 boolean verification = this.laLigne.estDansCercle(this.demiCercleAvant); 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/Segment.java b/projet_linea/src/Segment.java index 9dd6abf..59dbb0d 100644 --- a/projet_linea/src/Segment.java +++ b/projet_linea/src/Segment.java @@ -32,6 +32,19 @@ 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; + } + //------------------------------------------------------------------------- // Redéfinition de la méthode Afficher, spécifiquement pour la classe //-------------------------------------------------------------------------