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; } } }