package linea; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.util.ArrayList; import javax.swing.JPanel; public class ZoneDessin extends JPanel { private static final long serialVersionUID = 1L; // un booleen qui permet d'arreter l'animation (suspendre) protected boolean estArrete = false; // liste des objets graphiques private ArrayList listeObjets = new ArrayList(); // indicateur qu'une défaite (perte de contact) est survenue private boolean collisionOccur = false; // indique si le cercle a déjà été sur la ligne (début de la phase de maintien) private boolean hadBeenOnLine = false; public ZoneDessin(){ setLayout(new BorderLayout()); setPreferredSize(new Dimension(800, 600)); setBackground(new Color(220,170,0)); } // Ajout d'un objet graphique à la zone de dessin public void ajouterObjet(ObjetGraphique unObjet) { listeObjets.add(unObjet); } public void arreter(){ estArrete = true; } public void demarrer(){ estArrete = false; } public void traiterBoucleAnimation(){ if (estArrete==true) { return; } // 1. on déplace chaque objet graphique for (ObjetGraphique obj : listeObjets){ obj.Animer(); } // 2. vérifier collisions entre une Ligne et un Cercle for (ObjetGraphique obj : listeObjets) { if (obj instanceof Ligne) { Ligne l = (Ligne) obj; for (ObjetGraphique other : listeObjets) { if (other instanceof Cercle) { Cercle c = (Cercle) other; // On commence à surveiller une fois que le centre du // cercle est au-dessus d'un segment (le cercle est "sur la ligne"). if (l.estSurLaLigne(c.getX())) { hadBeenOnLine = true; // Si le cercle n'est plus en contact (distance > rayon) // alors le joueur perd (il doit maintenir le contact). if (!l.collisionAvec(c)) { collisionOccur = true; estArrete = true; break; } } } } if (estArrete) break; } } // 3. on demande à redessiner repaint(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2D = (Graphics2D) g; g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); // Afficher tous les objets for (ObjetGraphique obj : listeObjets) { obj.Afficher(g); } } // Indique si une collision est survenue public boolean aCollision() { return collisionOccur; } // Réinitialise l'état de la zone de dessin et supprime les objets graphiques public void reinitialiser() { listeObjets.clear(); estArrete = false; collisionOccur = false; hadBeenOnLine = false; repaint(); } }