From 095692eb0a12746e17c7f7f0a755aa860b8094c1 Mon Sep 17 00:00:00 2001 From: tit-exe Date: Mon, 23 Feb 2026 10:29:41 +0100 Subject: [PATCH] =?UTF-8?q?systeme=20points/=C3=A9cran=20game=20over?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Cercle.java | 2 +- src/Jeu.java | 205 +++++++++++++++++++++++++++++--------------- src/ZoneDessin.java | 22 +++-- 3 files changed, 148 insertions(+), 81 deletions(-) diff --git a/src/Cercle.java b/src/Cercle.java index d437e7e..8797cdc 100644 --- a/src/Cercle.java +++ b/src/Cercle.java @@ -13,7 +13,7 @@ public class Cercle extends ObjetGraphique{ // il s'agit plutôt d'arcs de cercl //------------------------------------------------------------------------- // PROPRIETES //------------------------------------------------------------------------- - protected double rayon = 40; + protected double rayon = 50; protected double depY = 0; // déplacement // début et fin de l'arc, en degrés diff --git a/src/Jeu.java b/src/Jeu.java index 098a0fd..ff146a2 100644 --- a/src/Jeu.java +++ b/src/Jeu.java @@ -1,6 +1,7 @@ package linea; import java.awt.Color; +import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; @@ -8,114 +9,127 @@ import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JLabel; +import javax.swing.SwingConstants; import javax.swing.Timer; -public class Jeu implements KeyListener, ActionListener{ - //------------------------------------------------------------------------- +public class Jeu implements KeyListener, ActionListener { + // ------------------------------------------------------------------------- // PROPRIETES - //------------------------------------------------------------------------- - + // ------------------------------------------------------------------------- + // Ecran : instance de ZoneDessin, qui contiendra tous les objets graphiques // et les animera protected ZoneDessin ecran = new ZoneDessin(); - + // Le cercle : en fait 2 demis-cercles, un qui passera sous la ligne // un qui passera dessus - protected Cercle demiCercleAvant = new Cercle(90,-180); // celui qui est sur la ligne - protected Cercle demiCercleArriere = new Cercle(90,180); // celui qui est derrière la ligne - + protected Cercle demiCercleAvant = new Cercle(90, -180); // celui qui est sur la ligne + protected Cercle demiCercleArriere = new Cercle(90, 180); // celui qui est derrière la ligne + // A FAIRE : ajouter les objets graphiques manquants, s'il y en a protected Ligne lili = new Ligne(); - // Timer : un objet qui émet des événements à un intervalle choisi, + // Timer : un objet qui émet des événements à un intervalle choisi, // il sert à donner le pas de l'animation protected Timer horloge; - - // Une variable qui contiendra le score - protected double score=0; - + + // Une variable qui contiendra le score + protected double score = 1; + // un label qui servira à afficher le score - protected JLabel labScore; - - - //------------------------------------------------------------------------- + protected JLabel labScore; + + protected int compteurFrames = 0; + protected boolean enCollision = false; + protected boolean estGameOver = false; + protected JLabel labGameOver; + protected int compteurGameOver = 0; + protected int compteurInvincible = 0; + + // ------------------------------------------------------------------------- // METHODES - //------------------------------------------------------------------------- - - //------------------------------------------------------------------------- + // ------------------------------------------------------------------------- + + // ------------------------------------------------------------------------- // Constructeur de la classe - //------------------------------------------------------------------------- - public Jeu(){ + // ------------------------------------------------------------------------- + public Jeu() { // Gestion du score : a réactiver en fin de TP, inutile au début labScore = new JLabel(); labScore.setForeground(Color.WHITE); - labScore.setText("

score : 0

"); + labScore.setText("

" + (int) score + "

"); labScore.setBounds(20, 0, 200, 50); - ecran.add(labScore); + ecran.add(labScore); + + labGameOver = new JLabel("GAME OVER", SwingConstants.CENTER); + labGameOver.setForeground(Color.WHITE); + labGameOver.setFont(new Font("Arial", Font.BOLD, 60)); + labGameOver.setBounds(0, 200, 800, 100); + labGameOver.setVisible(false); + ecran.add(labGameOver); ecran.traiterBoucleAnimation(); } - - - //------------------------------------------------------------------------- - // Méthodes qu'il faut implémenter pour être + + // ------------------------------------------------------------------------- + // Méthodes qu'il faut implémenter pour être // conforme à un KeyListener - //------------------------------------------------------------------------- - - //------------------------------------------------------------------------- + // ------------------------------------------------------------------------- + + // ------------------------------------------------------------------------- // Appui sur une touche - // -> l'événement est émis lorsqu'on appuie, puis selon le rythme de + // -> l'événement est émis lorsqu'on appuie, puis selon le rythme de // répétition du clavier - //------------------------------------------------------------------------- + // ------------------------------------------------------------------------- @Override - public void keyPressed(KeyEvent e){ + public void keyPressed(KeyEvent e) { // keyCode 38 : up // keyCode 40 : down int keyCode = e.getKeyCode(); - - if (keyCode==38){ // touche "flèche vers le haut" - // On demande aux deux demi-cercle de "monter" + + if (keyCode == 38) { // touche "flèche vers le haut" + // On demande aux deux demi-cercle de "monter" demiCercleAvant.Monter(); demiCercleArriere.Monter(); - } + } } - //------------------------------------------------------------------------- - // Relâchement de la touche - //------------------------------------------------------------------------- + // ------------------------------------------------------------------------- + // Relâchement de la touche + // ------------------------------------------------------------------------- @Override - public void keyReleased(KeyEvent e){ + public void keyReleased(KeyEvent e) { // keyCode 38 : up // keyCode 40 : down int keyCode = e.getKeyCode(); - - if (keyCode==38){ + + if (keyCode == 38) { // On demande aux deux demi-cercle "d'arrêter de monter" demiCercleAvant.ArreterMonter(); demiCercleArriere.ArreterMonter(); } } - //------------------------------------------------------------------------- + // ------------------------------------------------------------------------- // Une méthode que nous n'utilisons pas - //------------------------------------------------------------------------- + // ------------------------------------------------------------------------- @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub - + } - - //------------------------------------------------------------------------- - // Démarrage du jeu : - // création de diverses instances et - //------------------------------------------------------------------------- - public void demarrer(){ + + // ------------------------------------------------------------------------- + // Démarrage du jeu : + // création de diverses instances et + // ------------------------------------------------------------------------- + public void demarrer() { // Création d'une fenêtre JFrame fenetre = new JFrame(); - - // A FAIRE : - // placer dans l'instance de l'écran tous les objets graphiques nécessaires + + // A FAIRE : + // placer dans l'instance de l'écran tous les objets graphiques nécessaires // par exemple : ecran.ajouterObjet(demiCercleArriere); ecran.ajouterObjet(lili); @@ -123,7 +137,6 @@ public class Jeu implements KeyListener, ActionListener{ demiCercleArriere.setCouleur(new Color(0.0f, 0.4f, 0.0f)); demiCercleAvant.setCouleur(new Color(0.0f, 0.5f, 0.0f)); - // on indique que c'est le jeu qui traitera les appuis sur une touche ecran.addKeyListener(this); ecran.setFocusable(true); @@ -136,31 +149,81 @@ public class Jeu implements KeyListener, ActionListener{ // Démarrage du timer, qui rythmera l'animation horloge = new Timer(40, this); horloge.start(); - + // A FAIRE : - demiCercleArriere.setCouleur(new Color(0.8f,0.0f,0.0f)); - // donner la couleur des 2 demi-cercles, par exemple : demiCerleArriere.setCouleur(new Color(0.8f,0.0f,0.0f)); + demiCercleArriere.setCouleur(new Color(0.8f, 0.0f, 0.0f)); + // donner la couleur des 2 demi-cercles, par exemple : + // demiCerleArriere.setCouleur(new Color(0.8f,0.0f,0.0f)); } - - //------------------------------------------------------------------------- + // ------------------------------------------------------------------------- // Méthode appelée lorsqu'un événement timer se produit - //------------------------------------------------------------------------- + // ------------------------------------------------------------------------- @Override public void actionPerformed(ActionEvent e) { + if (estGameOver == true) { + compteurGameOver = compteurGameOver + 1; + if (compteurGameOver >= 75) { + RecommencerPartie(); + } + return; + } + ecran.traiterBoucleAnimation(); - score = score + 0.4; - labScore.setText("

score : " + (int)score + "

"); + + compteurFrames = compteurFrames + 1; + if (compteurFrames >= 25) { + score = score + 1; + compteurFrames = 0; + } + + if (compteurInvincible < 75) { + compteurInvincible = compteurInvincible + 1; + } else { + if (demiCercleArriere.VerifierCollision(lili)) { + if (enCollision == false) { + score = score - 5; + enCollision = true; + } + } else { + enCollision = false; + } + } + + if (score <= 0) { + score = 0; + estGameOver = true; + ecran.arreter(); + labGameOver.setVisible(true); + } + + labScore.setText("

" + (int) score + "

"); demiCercleArriere.ResterDansLigne(lili); demiCercleAvant.ResterDansLigne(lili); - - if (demiCercleArriere.VerifierCollision(lili)) - RecommencerPartie(); } - private void RecommencerPartie(){ - System.out.println("Fin de partie !"); + private void RecommencerPartie() { + lili = new Ligne(); + + demiCercleAvant.y = 200; + demiCercleAvant.vitesse = -1.0; + demiCercleArriere.y = 200; + demiCercleArriere.vitesse = -1.0; + + ecran.viderObjets(); + ecran.ajouterObjet(demiCercleArriere); + ecran.ajouterObjet(lili); + ecran.ajouterObjet(demiCercleAvant); + + score = 1; + compteurFrames = 0; + enCollision = false; + estGameOver = false; + compteurGameOver = 0; + compteurInvincible = 0; + labGameOver.setVisible(false); + ecran.demarrer(); } - + } diff --git a/src/ZoneDessin.java b/src/ZoneDessin.java index 4366ec2..600ded3 100644 --- a/src/ZoneDessin.java +++ b/src/ZoneDessin.java @@ -18,7 +18,7 @@ public class ZoneDessin extends JPanel { protected boolean estArrete = false; - public ZoneDessin(){ + public ZoneDessin() { setLayout(new BorderLayout()); setPreferredSize(new Dimension(800, 600)); setBackground(new Color(0, 73, 220)); @@ -28,20 +28,20 @@ public class ZoneDessin extends JPanel { listeObjets.add(unObjet); } - public void arreter(){ + public void arreter() { estArrete = true; } - public void demarrer(){ + + public void demarrer() { estArrete = false; } - - public void traiterBoucleAnimation(){ - if (estArrete==true) { + public void traiterBoucleAnimation() { + if (estArrete == true) { return; } - for (ObjetGraphique obj : listeObjets){ + for (ObjetGraphique obj : listeObjets) { obj.Animer(); } @@ -52,10 +52,14 @@ public class ZoneDessin extends JPanel { 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); } } + + public void viderObjets() { + listeObjets.clear(); + } } \ No newline at end of file