updateBoule/immortel
This commit is contained in:
@@ -12,11 +12,11 @@ public class Ligne extends ObjetGraphique{
|
||||
private double xCercle = 400;
|
||||
private Segment SegCourant;
|
||||
// vitesse de déplacement (augmente légèrement chaque frame)
|
||||
private double vitesse = 5.0;
|
||||
private double vitesse = 4.8;
|
||||
// croissance initiale (fractionnelle) appliquée chaque frame
|
||||
private double croissance = 0.001; // ~0.1% initial
|
||||
private double croissance = 0.0008; // montée plus progressive
|
||||
// facteur qui amplifie la croissance elle-même (pour accélérer la montée)
|
||||
private double facteurCroissance = 1.00003; // croissance augmente légèrement
|
||||
private double facteurCroissance = 1.00002; // accélération plus douce
|
||||
|
||||
private int niveau = 1; // niveau de difficulté, à augmenter pour rendre le jeu plus difficile
|
||||
|
||||
@@ -95,50 +95,63 @@ public class Ligne extends ObjetGraphique{
|
||||
}
|
||||
|
||||
// appliquer la croissance (vitesse *= 1 + croissance)
|
||||
vitesse *= (1.0 + croissance + (niveau * 0.00001)); // augmenter la croissance avec le niveau
|
||||
vitesse *= (1.0 + croissance + (niveau * 0.000006)); // hausse niveau plus progressive
|
||||
// augmenter légèrement la croissance pour que l'accélération s'amplifie
|
||||
croissance *= facteurCroissance;
|
||||
}
|
||||
|
||||
|
||||
// Indique si l'axe horizontal du cercle (cx) se trouve au niveau
|
||||
// d'un des segments de la ligne -> le cercle est "sur la ligne"
|
||||
public boolean estSurLaLigne(double cx) {
|
||||
// Trouve le segment couvrant l'abscisse cx (une seule itération)
|
||||
private Segment trouverSegmentAuX(double cx) {
|
||||
for (Segment seg : segments) {
|
||||
double x1 = seg.x;
|
||||
double x2 = seg.x + seg.xLong;
|
||||
if ((cx >= Math.min(x1, x2)) && (cx <= Math.max(x1, x2))) {
|
||||
return true;
|
||||
if (cx >= Math.min(x1, x2) && cx <= Math.max(x1, x2)) {
|
||||
return seg;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return null;
|
||||
}
|
||||
|
||||
// Résultat de contact : null = pas sur la ligne, sinon double[]{ligneY, distance}
|
||||
public double[] contactInfo(double cx, double cy, double rayon) {
|
||||
Segment seg = trouverSegmentAuX(cx);
|
||||
if (seg == null) return null;
|
||||
double ligneY = (seg.xLong != 0) ? seg.y + ((cx - seg.x) / seg.xLong) * seg.yLong : seg.y;
|
||||
double dist = pointSegmentDistance(cx, cy, seg.x, seg.y, seg.x + seg.xLong, seg.y + seg.yLong);
|
||||
return new double[]{ligneY, dist};
|
||||
}
|
||||
|
||||
// Indique si l'axe horizontal du cercle (cx) se trouve au niveau
|
||||
// d'un des segments de la ligne -> le cercle est "sur la ligne"
|
||||
public boolean estSurLaLigne(double cx) {
|
||||
return trouverSegmentAuX(cx) != null;
|
||||
}
|
||||
|
||||
// Vérifie la collision entre la ligne (segments) et un cercle
|
||||
public boolean collisionAvec(Cercle c) {
|
||||
double cx = c.getX();
|
||||
double cy = c.getY();
|
||||
double rayon = c.getRayon();
|
||||
|
||||
for (Segment seg : segments) {
|
||||
double x1 = seg.x;
|
||||
double y1 = seg.y;
|
||||
double x2 = seg.x + seg.xLong;
|
||||
double y2 = seg.y + seg.yLong;
|
||||
|
||||
double dist = pointSegmentDistance(cx, cy, x1, y1, x2, y2);
|
||||
if (dist <= rayon) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
double[] info = contactInfo(c.getX(), c.getY(), c.getRayon());
|
||||
return info != null && info[1] <= c.getRayon();
|
||||
}
|
||||
|
||||
// Retourne la coordonnée Y de la ligne à l'abscisse cx
|
||||
public double getYAuX(double cx) {
|
||||
Segment seg = trouverSegmentAuX(cx);
|
||||
if (seg == null || seg.xLong == 0) return 300;
|
||||
return seg.y + ((cx - seg.x) / seg.xLong) * seg.yLong;
|
||||
}
|
||||
|
||||
// Obtenir la vitesse actuelle de la ligne (pour les boules bonus)
|
||||
public double getVitesse() {
|
||||
return vitesse;
|
||||
}
|
||||
|
||||
|
||||
public void setCouleurLigne(Color couleur) {
|
||||
for (Segment seg : segments) {
|
||||
seg.setCouleur(couleur);
|
||||
}
|
||||
}
|
||||
|
||||
// distance minimale entre un point (px,py) et un segment (x1,y1)-(x2,y2)
|
||||
private double pointSegmentDistance(double px, double py, double x1, double y1, double x2, double y2) {
|
||||
double vx = x2 - x1;
|
||||
|
||||
Reference in New Issue
Block a user