package linea;

import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Arc2D;

public class Cercle extends ObjetGraphique{ // il s'agit plutôt d'arcs de cercle
	private static final BasicStroke ARC_STROKE = new BasicStroke(5.0f);
	private static final double GRAVITE = 0.95;
	private static final double POUSSEE = 1.45;
	private static final double AMORTISSEMENT = 0.92;
	private static final double VITESSE_MIN = -6.5;
	private static final double VITESSE_MAX = 6.5;
	private static final double BORD_HAUT = 0;
	private static final double BORD_BAS = 600;
	private final Arc2D.Double arc = new Arc2D.Double();

	// Hérite de la classe ObjetGraphique
	// Ne pas oublier qu'il y a des propriétés et méthodes reçues par l'héritage

	
	//-------------------------------------------------------------------------
	// PROPRIETES
	//-------------------------------------------------------------------------	
	protected double rayon = 30;	
	protected double depY = 0; // déplacement
	
	// début et fin de l'arc, en degrés
	protected double debut = 0;
	protected double fin = 360;
	
	// Est-ce que le joueur est en train d'appuyer sur "up"
	protected boolean montee = false;
	
	// Vitesse du cercle
	protected double vitesse = -1.0;
	
	// Un pas pour l'application des forces, permet de régler
	// un peu la jouabilité
	protected double pas = 0.2;
	
	// Valeur de la force (norme) appliquée lorsque le joueur appuie sur up
	protected double impulsion = 25;
	
	
	//-------------------------------------------------------------------------
	// METHODES
	//-------------------------------------------------------------------------
	
	//-------------------------------------------------------------------------
	// Constructeurs de la classe
	//-------------------------------------------------------------------------	
	public Cercle(){
		x=400;
		y=200;
	}
	
	public Cercle(double debutArc, double finArc){
		x=400;
		y=200;
		debut = debutArc;
		fin = finArc;
	}
	
	
	//-------------------------------------------------------------------------
	// Méthode d'accès en lecture au rayon, peut être utile
	// par exemple pour la classe qui vérifiera si la ligne passe dans le 
	// cercle
	//-------------------------------------------------------------------------	
	public double getRayon(){
		return rayon;
	}
	
	
	//-------------------------------------------------------------------------
	// Méthode qui note que up a été appuyée
	// -> le booléen permet de ne plus être tributaire
	//    de la vitesse de répétition du clavier
	//-------------------------------------------------------------------------		
	public void Monter(){	
		montee = true;
		// Évite l'effet "chute incontrôlable" quand on reprend la montée tard.
		if (vitesse > 2.0) {
			vitesse = 2.0;
		}
	}
	
	
	//-------------------------------------------------------------------------
	// Méthode qui note que up a été relâchée
	//-------------------------------------------------------------------------	
	public void ArreterMonter(){
		montee = false;
	}
	

	
	//-------------------------------------------------------------------------	
	// Redéfinition de la méthode Afficher, spécifiquement pour la classe 
	//-------------------------------------------------------------------------	
	@Override
	void Afficher(Graphics g) {
		// choix de la couleur et de l'épaisseur 
		Graphics2D g2D = (Graphics2D) g;
		g2D.setStroke(ARC_STROKE);
		g.setColor(this.couleur);

		// dessin de l'arc
		arc.setArc(x - rayon / 2.0, y - rayon, rayon, rayon * 2.0, debut, fin, Arc2D.OPEN);
		g2D.draw(arc);
	}

	// Accesseur pour savoir si le joueur maintient la montée
	public boolean isMontee() {
		return montee;
	}


	//-------------------------------------------------------------------------	
	// Redéfinition de la méthode Animer, spécifiquement pour la classe 
	//-------------------------------------------------------------------------	
	@Override
	void Animer() {
		if (montee) {
			vitesse -= POUSSEE;
		} else {
			vitesse += GRAVITE;
		}

		// Lissage global pour un ressenti plus régulier.
		vitesse *= AMORTISSEMENT;

		if (vitesse < VITESSE_MIN) {
			vitesse = VITESSE_MIN;
		}
		if (vitesse > VITESSE_MAX) {
			vitesse = VITESSE_MAX;
		}

		depY = vitesse;
		y += depY;

		//position
		if (y <= BORD_HAUT + rayon) {
			y = BORD_HAUT + rayon;
			vitesse = 0;
		} else if (y >= BORD_BAS - rayon) {
			y = BORD_BAS - rayon;
			vitesse = 0;
		}

	}
}
