updateCollision

This commit is contained in:
2026-03-28 17:19:34 +01:00
parent b9dad77420
commit 06954ae3c4
7 changed files with 115 additions and 47 deletions

View File

@@ -15,6 +15,7 @@ public class BouleBonus extends ObjetGraphique {
private double amplitudeOndulation = 0.2;
private double vitesseHorizontaleLisse = 0.0;
private double phaseOndulation = Math.random() * Math.PI * 2; // phase unique par boule
private double sensEvitementLigne = 0.0;
private static double clamp(double value, double min, double max) {
return Math.max(min, Math.min(max, value));
@@ -35,6 +36,7 @@ public class BouleBonus extends ObjetGraphique {
this.rayon = 14;
this.amplitudeOndulation = 0.14;
this.vitesseHorizontaleLisse = 4.3;
this.sensEvitementLigne = Math.random() < 0.5 ? -1.0 : 1.0;
}
}
@@ -45,15 +47,62 @@ public class BouleBonus extends ObjetGraphique {
public boolean isVerte() {
return estVerte;
}
public void garantirDistanceLigne(double yLigne, double margePx) {
if (estVerte) {
return;
}
double distanceMiniCentre = rayon + Math.max(0.0, margePx);
double ecart = y - yLigne;
double distance = Math.abs(ecart);
if (distance >= distanceMiniCentre) {
return;
}
double sens = (ecart == 0.0) ? sensEvitementLigne : Math.signum(ecart);
y = yLigne + sens * distanceMiniCentre;
vitesseVerticale = 0.0;
if (y < 20) y = 20;
if (y > 580) y = 580;
}
public void ajusterVitessePourDistanceLigne(double yLigne, double margePx) {
if (estVerte) {
return;
}
double distanceCibleCentre = rayon + Math.max(0.0, margePx);
double ecart = y - yLigne;
double distance = Math.abs(ecart);
double progressionZone = clamp((560.0 - x) / 240.0, 0.0, 1.0);
if (progressionZone <= 0.0) {
return;
}
double sens = (ecart == 0.0) ? sensEvitementLigne : Math.signum(ecart);
// vitesse variable
if (distance > distanceCibleCentre) {
double excedent = distance - distanceCibleCentre;
double pas = clamp(excedent * (0.08 + progressionZone * 0.20), 0.0, 10.0 + progressionZone * 8.0);
y -= sens * pas;
}
if (y < 20) y = 20;
if (y > 580) y = 580;
}
@Override
void Afficher(Graphics g) {
Graphics2D g2D = (Graphics2D) g;
// Effet de pulsation (le rayon augmente/diminue)
double rayonAffiche = rayon + Math.sin(frameCounter * 0.12) * 1.5;
double rayonAffiche = rayon;
// Dessiner le cercle rempli (centré sur x,y)
// Dessiner le cercle rempli
g2D.setColor(couleur);
g2D.fillOval((int)(x - rayonAffiche), (int)(y - rayonAffiche),
(int)(2 * rayonAffiche), (int)(2 * rayonAffiche));
@@ -67,7 +116,7 @@ public class BouleBonus extends ObjetGraphique {
@Override
void Animer() {
// Déplacement vers la gauche (même vitesse que la ligne)
// Déplacement vers la gauche
x -= vitesse;
}
@@ -82,19 +131,26 @@ public class BouleBonus extends ObjetGraphique {
double vitessePoursuite = estVerte ? 0.075 : 0.050; // meilleure réactivité
double limiteVerticale = estVerte ? 1.85 : 1.05; // accélération verticale
double amortissement = estVerte ? 0.87 : 0.81; // moins de friction
double zoneMorte = estVerte ? 18.0 : 16.0; // zone mort réduite
double zoneMorte = estVerte ? 18.0 : 16.0; // zone morte
double vitesseVerticaleMax = estVerte ? 4.2 : 2.6; // vitesses verticales plus hautes
double proximiteJoueur = clamp((540.0 - x) / 280.0, 0.0, 1.0);
if (!estVerte) {
// Plus rouge proche du joueur, plus on ouvre la fenêtre d'esquive.
vitessePoursuite *= (1.0 - proximiteJoueur * 0.66);
limiteVerticale *= (1.0 - proximiteJoueur * 0.52);
vitesseVerticaleMax *= (1.0 - proximiteJoueur * 0.40);
zoneMorte += proximiteJoueur * 22.0;
}
double vitesseLigneSecurisee = Math.max(0.0, vitesseLigne);
double vitesseCible = Math.min(vitesseMax, vitesseLigneSecurisee * facteurHorizontal);
if (!estVerte) {
// Les rouges gardent une vitesse plus stable d'une boule à l'autre.
vitesseCible = vitesseCible * 0.68 + 4.5 * 0.32;
}
double deltaVitesse = clamp(vitesseCible - vitesseHorizontaleLisse, -0.25, 0.25);
double vitesseMaxLocale = vitesseMax;
if (!estVerte && x < 380) {
// En fin d'écran, on plafonne un peu la vitesse pour laisser une fenêtre d'esquive stable.
double facteurApproche = clamp((380.0 - x) / 180.0, 0.0, 1.0);
vitesseMaxLocale = vitesseMax - (0.55 * facteurApproche);
}
@@ -103,11 +159,14 @@ public class BouleBonus extends ObjetGraphique {
x -= vitesse;
double vitesseJoueurLimitee = clamp(cibleVitesseY, -6.0, 6.0);
// Verte: anticipation légère + oscillation. Rouge: AUCUNE anticipation → trajectoire lisible, esquivable.
double anticipation = estVerte ? vitesseJoueurLimitee * 3.2 : 0.0;
double cibleLisse = cibleY + anticipation + (estVerte ? Math.sin(frameCounter * 0.055 + phaseOndulation) * 45.0 : 0.0);
double deltaY = cibleLisse - y;
double ratioEcartY = clamp(Math.abs(deltaY) / 120.0, 0.50, 1.60);
vitessePoursuite *= ratioEcartY;
limiteVerticale *= Math.sqrt(ratioEcartY);
if (Math.abs(deltaY) < zoneMorte) {
deltaY = 0;
}
@@ -136,7 +195,7 @@ public class BouleBonus extends ObjetGraphique {
double cRayon = c.getRayon();
double dist = Math.hypot(cx - x, cy - y);
double seuil = estVerte ? (rayon + cRayon - 6.0) : (rayon + cRayon - 9.0);
double seuil = estVerte ? (rayon + cRayon - 6.0) : (rayon + cRayon - 10.5);
return dist <= seuil;
}