import java.applet.*;
import java.awt.*;
import Cercle;

public class AnimCircle extends Applet implements Runnable {
    Thread threadDeApplet=null;
    Cercle cercle;
    
    public void init() {
        // Creation d'un cercle
        cercle = new Cercle(100, 100, 10);
    }

    public void start(){
        // Si le thread de l'applet vaut null
        if(threadDeApplet == null) {
             // On crée un Thread à partir de l'applet et on le lance
             threadDeApplet = new Thread(this);
             threadDeApplet.start();
        }
        else {
            // Le thread existe déjà, on le réveille (il était forcément arrêté)
            threadDeApplet.resume();
        }
    }

    public void stop() {
        // On suspend le Thread de l'applet
        threadDeApplet.suspend();
    }

    /** Tache de fond executee par le Thread. Effectue l'animation du cercle en
        modifiant ses coordonnees et en invoquant repaint(), ce qui provoque l'execution
        de paint(). Notez que run() doit impérativement contenir une boucle afin de ne pas
        rendre la main tout de suite.
    */
    public void run() {
        int x, y, rayon;
        int incX=1, incY=1;
        
        while(true) {
            
            // Ob calcule la nouvelle position du cercle
            x = cercle.getX();
            y = cercle.getY();
            rayon = cercle.getRayon();
            
            x += Math.rint(Math.random() * incX);
            y += Math.rint(Math.random() * incY);
            
            // Pour ne pas que le cercle sorte de l'ecran
            if ((incX == 1) && (x > (getSize().width - rayon)))
                incX = -1;
            
            if ((incX == -1) && ((x - rayon) < 0))
                incX = 1;
            
            if ((incY == 1) && (y > (getSize().height - rayon)))
                incY = -1;
            
            if ((incY == -1) && ((y - rayon) < 0))
                incY = 1;
            
            // On déplace le cercle
            cercle.move(x, y);
            
            // On demande à redessiner le cercle
            repaint();
            
            // On "dort" 10 millisecondes
            try {
                threadDeApplet.sleep(10);
            } catch(InterruptedException e) {
                System.out.println("Erreur dans le sleep(10);");
                e.printStackTrace();
            }
        }
    }

    public void paint(Graphics gc) {
        // appelé automatiquement par l'AWT, ou sur demande par repaint()
       
        gc.drawOval(cercle.getX() - cercle.getRayon(),
                    cercle.getY() - cercle.getRayon(),
                   2 * cercle.getRayon(),
                   2 * cercle.getRayon());
    }
}
