Files
Projet-Dev/linea/Cercle.java
2026-03-28 14:31:55 +01:00

156 lines
4.4 KiB
Java

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