package linea; import java.awt.*; import java.util.ArrayList; import javax.swing.JPanel; public class ZoneDessin extends JPanel { // hérite d'une classe du frameWork standard private static final long serialVersionUID = 1L; protected ArrayList listeObjets = new ArrayList(); //------------------------------------------------------------------------- // PROPRIETES //------------------------------------------------------------------------- // un booleen qui permet d'arreter l'animation (suspendre) protected boolean estArrete = false; protected boolean isGameOver = false; //------------------------------------------------------------------------- // METHODES //------------------------------------------------------------------------- //------------------------------------------------------------------------- // Constructeur de la classe //------------------------------------------------------------------------- public ZoneDessin(){ // on prépare la zone d'affichage setLayout(new BorderLayout()); setPreferredSize(new Dimension(800, 600)); setBackground(new Color(220,170,0)); } //------------------------------------------------------------------------- // Ajout d'un objet graphique à la zonde de dessin //------------------------------------------------------------------------- public void ajouterObjet(ObjetGraphique unObjet) { this.listeObjets.add(unObjet); } //------------------------------------------------------------------------- // Mettre en pause et redémarrer //------------------------------------------------------------------------- public void arreter(){ estArrete = true; } public void demarrer(){ estArrete = false; } //------------------------------------------------------------------------- // Boucle d'animation : // - appelée par exemple 25 fois par seconde // - à chaque appel : // - on anime (déplace) chaque objet // - on redessine tout : appel à paintComponent, déclenché par repaint //------------------------------------------------------------------------- public void traiterBoucleAnimation(){ if (estArrete==true) { return; } // 1. on déplace chaque objet graphique // A FAIRE : décommenter lorsque cela devienda exécutable, et compléter for (ObjetGraphique obj : listeObjets){ obj.Animer(); } // 2. on demande à redessiner, ce qui déclenchera automatiquement // l'appel à la méthode paintComponent, qui est ci-dessous repaint(); } //------------------------------------------------------------------------- // Dessin, déclenché par le repaint() de la méthode ci-dessus //------------------------------------------------------------------------- public void paintComponent(Graphics g) { // On demande à la super-classe (JPanel) de se redessiner super.paintComponent(g); // Puis on ajoute ce qui est spécifique à la classe // on indique qu'il faut de l'antialiasing Graphics2D g2D = (Graphics2D) g; g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); for (ObjetGraphique obj : listeObjets){ obj.Afficher(g); } if (isGameOver) { g2D.setColor(new Color(0, 0, 0, 150)); // Fond noir transparent g2D.fillRect(0, 0, getWidth(), getHeight()); g2D.setColor(Color.WHITE); g2D.setFont(new Font("Arial", Font.BOLD, 50)); String msg = "GAME OVER"; int largeurTexte = g2D.getFontMetrics().stringWidth(msg); g2D.drawString(msg, (getWidth() - largeurTexte) / 2, getHeight() / 2); } } public void setGameOver(boolean state) { this.isGameOver = state; repaint(); } }