111 lines
3.4 KiB
Java
111 lines
3.4 KiB
Java
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<ObjetGraphique> listeObjets = new ArrayList<ObjetGraphique>();
|
|
// 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();
|
|
}
|
|
} |