From 1734bf2ab48ba8f1ff9ae1b755873c4c3cb391ba Mon Sep 17 00:00:00 2001 From: incentV Date: Tue, 17 Mar 2026 14:11:48 +0100 Subject: [PATCH] Malus mis a jour et fonctionnel --- src/linea/Cercle.java | 4 +++ src/linea/Jeu.java | 61 ++++++++++++++++++++++++++++++--------- src/linea/Malus.java | 29 +++++++++++++++++++ src/linea/ZoneDessin.java | 38 +++++++++++++----------- 4 files changed, 101 insertions(+), 31 deletions(-) create mode 100644 src/linea/Malus.java diff --git a/src/linea/Cercle.java b/src/linea/Cercle.java index 5dbbcb5..130c124 100644 --- a/src/linea/Cercle.java +++ b/src/linea/Cercle.java @@ -62,6 +62,10 @@ public class Cercle extends ObjetGraphique{ // il s'agit plutôt d'arcs de cercl public double getRayon(){ return rayon; } + + public void setRayon(double rayon){ + this.rayon = rayon; + } //------------------------------------------------------------------------- diff --git a/src/linea/Jeu.java b/src/linea/Jeu.java index a079041..e29f98f 100644 --- a/src/linea/Jeu.java +++ b/src/linea/Jeu.java @@ -25,16 +25,17 @@ public class Jeu implements KeyListener, ActionListener { protected JLabel labScore; protected int score; - //base de données + // base de données protected GestionnaireBDD bdd = new GestionnaireBDD(); protected Random random = new Random(); protected int prochainBonusScore; + protected int prochainMalusScore; protected int utilisateurIdConnecte = -1; protected String identifiantUtilisateurConnecte; - public int idCampagneActive = 0; // Retient la campagne (1 = Autoroute, etc.) - public int difficulteActive = 0; // Retient la difficulté (1=Facile, 2=Moyen, 3=Difficile) + public int idCampagneActive = 0; + public int difficulteActive = 0; public Jeu() { score = 0; @@ -60,7 +61,6 @@ public class Jeu implements KeyListener, ActionListener { // Initialisation initiale resetPartie(6, 20); - // On ajoute l'action au bouton "Retour" de la ZoneDessin (Game Over) ecran.btnRetour.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -167,6 +167,7 @@ public class Jeu implements KeyListener, ActionListener { labScore.setText("

score : 0

"); this.prochainBonusScore = 300 + random.nextInt(201); + this.prochainMalusScore = 400 + random.nextInt(201); } @Override @@ -190,6 +191,44 @@ public class Jeu implements KeyListener, ActionListener { } } + if (score == prochainMalusScore) { + double xSpawn = 810; + double yLigne = laligne.getHauteurLigneA(xSpawn); + + if (yLigne != -1) { + double yOffset = random.nextBoolean() ? -30 : 30; + double yMalus = yLigne + yOffset; + + Malus malus = new Malus(xSpawn, yMalus, laligne.vitesseDefilement); + ecran.ajouterObjet(malus); + + this.prochainMalusScore = score + 400 + random.nextInt(201); + } + } + + for (int i = ecran.listeObjets.size() - 1; i >= 0; i--) { + ObjetGraphique obj = ecran.listeObjets.get(i); + if (obj instanceof Bonus || obj instanceof Malus) { + double dx = obj.getX() - demiCercleAvant.getX(); + double dy = obj.getY() - demiCercleAvant.getY(); + double dist = Math.sqrt(dx * dx + dy * dy); + + if (dist < demiCercleAvant.getRayon()) { + if (obj instanceof Bonus) { + double newRayon = demiCercleAvant.getRayon() + 3; + demiCercleAvant.setRayon(newRayon); + demiCercleArriere.setRayon(newRayon); + } else { + double newRayon = demiCercleAvant.getRayon() - 3; + if (newRayon < 10) + newRayon = 10; + demiCercleAvant.setRayon(newRayon); + demiCercleArriere.setRayon(newRayon); + } + ecran.listeObjets.remove(i); + } + } + } labScore.setText("

score : " + score + "

"); // Gestion collision simple @@ -197,35 +236,29 @@ public class Jeu implements KeyListener, ActionListener { if (hauteurLigne != -1) { // calcule de la distance entre le centre du cercle et la ligne double distance = Math.abs(hauteurLigne - demiCercleAvant.getY()); - - // Si cette distance est strictement supérieure au rayon du bouclier, - // cela signifie que la ligne est sortie de la bulle ! if (distance > demiCercleAvant.getRayon()) { gameOver(); } } else { - // Si on arrive au bout de la ligne victoire(); } } public void victoire() { horloge.stop(); - ecran.setVictoire(true); // Affiche "Victoire" et le bouton Retour + ecran.setVictoire(true); - int dureePartie = score / 25; // Exemple : 25 frames par seconde + int dureePartie = score / 25; bdd.enregistrerPartie(dureePartie, idCampagneActive, difficulteActive, score, utilisateurIdConnecte); } public void gameOver() { horloge.stop(); - ecran.setGameOver(true); // Affiche "Game Over" et le bouton Retour + ecran.setGameOver(true); - int dureePartie = score / 25; // Exemple : 25 frames par seconde + int dureePartie = score / 25; - // On utilise nos deux variables pour la sauvegarde ! - // L'appel est maintenant plus robuste grâce au nouveau GestionnaireBDD bdd.enregistrerPartie(dureePartie, idCampagneActive, difficulteActive, score, utilisateurIdConnecte); } diff --git a/src/linea/Malus.java b/src/linea/Malus.java new file mode 100644 index 0000000..8d54c4d --- /dev/null +++ b/src/linea/Malus.java @@ -0,0 +1,29 @@ +package linea; + +import java.awt.Color; +import java.awt.Graphics; + +public class Malus extends ObjetGraphique { + + private int largeur = 20; + private int hauteur = 20; + private double vitesseDefilement; + + public Malus(double x, double y, double vitesse) { + this.x = x; + this.y = y; + this.vitesseDefilement = vitesse; + this.couleur = Color.RED; + } + + @Override + public void Afficher(Graphics g) { + g.setColor(this.couleur); + g.fillRect((int)x, (int)y, largeur, hauteur); + } + + @Override + void Animer() { + this.x -= vitesseDefilement; + } +} diff --git a/src/linea/ZoneDessin.java b/src/linea/ZoneDessin.java index ede9350..7844035 100644 --- a/src/linea/ZoneDessin.java +++ b/src/linea/ZoneDessin.java @@ -17,31 +17,35 @@ public class ZoneDessin extends JPanel { // LE BOUTON DOIT ÊTRE PUBLIC POUR ÊTRE ACCESSIBLE DEPUIS JEU.JAVA public JButton btnRetour; - public ZoneDessin(){ + public ZoneDessin() { // Layout null pour positionner le bouton pixel par pixel setLayout(null); setPreferredSize(new Dimension(800, 600)); - setBackground(new Color(100,100,100)); + setBackground(new Color(100, 100, 100)); - // 2. Création et configuration du bouton btnRetour = new JButton("Back to Menu"); - // x, y, largeur, hauteur (centré horizontalement pour une fenêtre de 800px) + // entré horizontalement pour une fenêtre de 800px btnRetour.setBounds(300, 350, 200, 50); btnRetour.setFont(new Font("Arial", Font.BOLD, 16)); - btnRetour.setFocusable(false); // Important pour ne pas gêner le clavier - btnRetour.setVisible(false); // Caché au début + btnRetour.setFocusable(false); + btnRetour.setVisible(false); this.add(btnRetour); } - // ... (méthodes ajouterObjet, viderObjets, arreter, demarrer restent pareilles) ... - public void ajouterObjet(ObjetGraphique unObjet) { this.listeObjets.add(unObjet); } - public void viderObjets() { this.listeObjets.clear(); } + public void ajouterObjet(ObjetGraphique unObjet) { + this.listeObjets.add(unObjet); + } - public void traiterBoucleAnimation(){ - if (estArrete || isGameOver || isVictoire) return; + public void viderObjets() { + this.listeObjets.clear(); + } - for (ObjetGraphique obj : listeObjets){ + public void traiterBoucleAnimation() { + if (estArrete || isGameOver || isVictoire) + return; + + for (ObjetGraphique obj : listeObjets) { obj.Animer(); } repaint(); @@ -50,15 +54,15 @@ public class ZoneDessin extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2D = (Graphics2D) g; - g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); + g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - for (ObjetGraphique obj : listeObjets){ + for (ObjetGraphique obj : listeObjets) { obj.Afficher(g); } // Affichage de l'écran Game Over if (isGameOver) { - g2D.setColor(new Color(0, 0, 0, 150)); // Fond sombre + g2D.setColor(new Color(0, 0, 0, 150)); g2D.fillRect(0, 0, getWidth(), getHeight()); g2D.setColor(Color.WHITE); @@ -67,7 +71,7 @@ public class ZoneDessin extends JPanel { int largeur = g2D.getFontMetrics().stringWidth(msg); g2D.drawString(msg, (getWidth() - largeur) / 2, getHeight() / 2 - 50); } else if (isVictoire) { - g2D.setColor(new Color(0, 0, 0, 150)); // Fond sombre + g2D.setColor(new Color(0, 0, 0, 150)); g2D.fillRect(0, 0, getWidth(), getHeight()); g2D.setColor(Color.GREEN); @@ -81,10 +85,10 @@ public class ZoneDessin extends JPanel { public void setGameOver(boolean state) { this.isGameOver = state; - // 3. C'est ici qu'on affiche ou cache le bouton btnRetour.setVisible(state); repaint(); } + public void setVictoire(boolean state) { this.isVictoire = state; btnRetour.setVisible(state);