updateBoule/immortel
This commit is contained in:
@@ -29,7 +29,10 @@ public class ZoneDessin extends JPanel {
|
||||
private ArrayList<BouleBonus> boolesBonus = new ArrayList<BouleBonus>();
|
||||
// compteur pour générer les boules à intervalle régulier
|
||||
private int compteurBoule = 0;
|
||||
private int intervalleBoule = 80; // générer une boule tous les 80 frames
|
||||
private int intervalleBouleBase = 165; // moins de boules sur la durée
|
||||
private int delaiInitialBoule = 97; // apparition initiale avancée de 3%
|
||||
private int niveauActuel = 1;
|
||||
private Double dernierJoueurY = null;
|
||||
// type de bonus récupéré (-1 = rouge, 1 = vert, 0 = aucun)
|
||||
private int bonusRecupere = 0;
|
||||
|
||||
@@ -38,10 +41,24 @@ public class ZoneDessin extends JPanel {
|
||||
setPreferredSize(new Dimension(800, 600));
|
||||
setBackground(new Color(220,170,0));
|
||||
}
|
||||
|
||||
public void setCouleurFond(Color couleurFond) {
|
||||
setBackground(couleurFond);
|
||||
}
|
||||
|
||||
public void setImmortel(boolean immortel) {
|
||||
this.immortel = immortel;
|
||||
}
|
||||
|
||||
public void setNiveau(int niveau) {
|
||||
if (niveau < 1) {
|
||||
niveauActuel = 1;
|
||||
} else if (niveau > 100) {
|
||||
niveauActuel = 100;
|
||||
} else {
|
||||
niveauActuel = niveau;
|
||||
}
|
||||
}
|
||||
|
||||
public int getBonusRecupere() {
|
||||
return bonusRecupere;
|
||||
@@ -68,6 +85,20 @@ public class ZoneDessin extends JPanel {
|
||||
if (estArrete==true) {
|
||||
return;
|
||||
}
|
||||
|
||||
Cercle cercleReference = null;
|
||||
for (ObjetGraphique obj : listeObjets) {
|
||||
if (obj instanceof Cercle) {
|
||||
cercleReference = (Cercle) obj;
|
||||
break;
|
||||
}
|
||||
}
|
||||
double joueurY = (cercleReference != null) ? cercleReference.getY() : 300;
|
||||
double vitesseJoueurY = 0.0;
|
||||
if (dernierJoueurY != null) {
|
||||
vitesseJoueurY = joueurY - dernierJoueurY;
|
||||
}
|
||||
dernierJoueurY = joueurY;
|
||||
|
||||
// --- 0. Récupérer la ligne pour synchroniser les boules ---
|
||||
Ligne ligneObjet = null;
|
||||
@@ -79,67 +110,107 @@ public class ZoneDessin extends JPanel {
|
||||
}
|
||||
|
||||
// --- 1. Générer une boule au bord droit sur la ligne ---
|
||||
double progression = Math.min(1.0, (niveauActuel - 1) / 25.0);
|
||||
int intervalleBoule = (int) Math.round(intervalleBouleBase - progression * 20.0); // ~165 -> 145
|
||||
double probaVerteBase = 0.35 - progression * 0.06; // ~35% -> 29%
|
||||
double variationAleatoire = (Math.random() - 0.5) * 0.10; // +/- 5%
|
||||
double probaVerte = Math.max(0.22, Math.min(0.45, probaVerteBase + variationAleatoire));
|
||||
|
||||
compteurBoule++;
|
||||
if (compteurBoule >= intervalleBoule && ligneObjet != null) {
|
||||
compteurBoule = 0;
|
||||
boolean estVerte = Math.random() < 0.7;
|
||||
|
||||
// On récupère le Y du dernier segment de la ligne (bord droit de l'écran)
|
||||
// Note: Si votre classe Ligne n'a pas de méthode pour avoir le Y à X=800,
|
||||
// utilisez une valeur proche de la fin de votre liste de segments.
|
||||
double spawnX = 800;
|
||||
double spawnY = 300; // Valeur par défaut
|
||||
boolean estVerte = Math.random() < probaVerte;
|
||||
|
||||
double spawnX = 800;
|
||||
double spawnY;
|
||||
if (estVerte) {
|
||||
// Vertes: proches de la trajectoire du joueur pour être récupérables.
|
||||
double margeVerte = 95.0 + progression * 45.0;
|
||||
spawnY = joueurY + (Math.random() * (2.0 * margeVerte)) - margeVerte;
|
||||
} else {
|
||||
// Rouges: visent davantage le joueur, mais démarrent avec une marge d'esquive.
|
||||
double offset = 220 + progression * 20.0 + Math.random() * 150.0;
|
||||
spawnY = joueurY + (Math.random() < 0.5 ? -offset : offset);
|
||||
}
|
||||
|
||||
if (spawnY < 20) spawnY = 20;
|
||||
if (spawnY > 580) spawnY = 580;
|
||||
|
||||
if (!estVerte) {
|
||||
// Marge suffisante pour esquiver, sans rendre les rouges inoffensives.
|
||||
double distanceMin = 125.0;
|
||||
if (Math.abs(spawnY - joueurY) < distanceMin) {
|
||||
if (spawnY >= joueurY) {
|
||||
spawnY = Math.min(580, joueurY + distanceMin);
|
||||
} else {
|
||||
spawnY = Math.max(20, joueurY - distanceMin);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// On crée la boule au bord droit (800)
|
||||
BouleBonus boule = new BouleBonus(spawnX, spawnY, estVerte);
|
||||
|
||||
// On lui donne la vitesse actuelle de la ligne pour qu'elle suive le mouvement
|
||||
boule.setVitesse(ligneObjet.getVitesse());
|
||||
boolesBonus.add(boule);
|
||||
}
|
||||
|
||||
// --- 2. Animation des objets ---
|
||||
for (ObjetGraphique obj : listeObjets) obj.Animer();
|
||||
|
||||
// Mettre à jour la vitesse des boules (car la ligne accélère avec le temps)
|
||||
// Mettre à jour et animer les boules (une seule fois par frame)
|
||||
if (ligneObjet != null) {
|
||||
for (BouleBonus boule : boolesBonus) {
|
||||
boule.setVitesse(ligneObjet.getVitesse());
|
||||
boule.Animer();
|
||||
boule.animerAvecCible(ligneObjet.getVitesse(), joueurY, vitesseJoueurY);
|
||||
}
|
||||
}
|
||||
|
||||
// Les boules bougent via leur propre Animer() qui ajuste leur vitesse
|
||||
|
||||
for (BouleBonus boule : boolesBonus) {
|
||||
boule.Animer();
|
||||
}
|
||||
|
||||
// 2. vérifier collisions entre une Ligne et un Cercle
|
||||
for (ObjetGraphique obj : listeObjets) {
|
||||
if (obj instanceof Ligne) {
|
||||
Ligne l = (Ligne) obj;
|
||||
for (ObjetGraphique other : listeObjets) {
|
||||
if (other instanceof Cercle) {
|
||||
Cercle c = (Cercle) other;
|
||||
// On commence à surveiller une fois que le centre du
|
||||
// cercle est au-dessus d'un segment (le cercle est "sur la ligne").
|
||||
if (l.estSurLaLigne(c.getX())) {
|
||||
hadBeenOnLine = true;
|
||||
// Si le cercle n'est plus en contact (distance > rayon)
|
||||
// alors le joueur perd (il doit maintenir le contact).
|
||||
if (!l.collisionAvec(c)) {
|
||||
// Ignorer la collision si on est en mode immortel
|
||||
if (!immortel) {
|
||||
collisionOccur = true;
|
||||
estArrete = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 2. vérifier collision entre la Ligne et le Cercle (une seule passe de segments)
|
||||
if (ligneObjet != null && cercleReference != null) {
|
||||
double[] info = ligneObjet.contactInfo(
|
||||
cercleReference.getX(), cercleReference.getY(), cercleReference.getRayon());
|
||||
|
||||
boolean enContact = (info != null) && (info[1] <= cercleReference.getRayon());
|
||||
double ligneY = (info != null) ? info[0] : ligneObjet.getYAuX(cercleReference.getX());
|
||||
|
||||
// Phase initiale en mode immortel : force d'attraction depuis le début
|
||||
if (!hadBeenOnLine && immortel) {
|
||||
double delta = ligneY - cercleReference.y;
|
||||
cercleReference.vitesse += delta * 0.12;
|
||||
|
||||
// Marquer le premier contact
|
||||
if (enContact) {
|
||||
hadBeenOnLine = true;
|
||||
}
|
||||
} else if (hadBeenOnLine && immortel) {
|
||||
// Phase maintenance : après le premier contact, maintenir le cercle sur la ligne
|
||||
double rayon = cercleReference.getRayon();
|
||||
double limite = ligneY - rayon;
|
||||
double limiteBas = ligneY + rayon;
|
||||
|
||||
// Clamping : empêcher le cercle de sortir au-dessus
|
||||
if (cercleReference.y < limite) {
|
||||
cercleReference.y = limite;
|
||||
if (cercleReference.vitesse < 0) cercleReference.vitesse *= -0.3;
|
||||
}
|
||||
// Clamping : empêcher le cercle de sortir en-dessous
|
||||
else if (cercleReference.y > limiteBas) {
|
||||
cercleReference.y = limiteBas;
|
||||
if (cercleReference.vitesse > 0) cercleReference.vitesse *= -0.3;
|
||||
}
|
||||
} else if (info != null && !enContact && !immortel) {
|
||||
// Mode normal : mort si hors contact
|
||||
collisionOccur = true;
|
||||
estArrete = true;
|
||||
}
|
||||
|
||||
// Synchroniser tous les autres Cercle en mode immortel
|
||||
if (immortel) {
|
||||
for (ObjetGraphique obj : listeObjets) {
|
||||
if (obj instanceof Cercle && obj != cercleReference) {
|
||||
Cercle autre = (Cercle) obj;
|
||||
autre.y = cercleReference.y;
|
||||
autre.vitesse = cercleReference.vitesse;
|
||||
}
|
||||
}
|
||||
if (estArrete) break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,7 +235,7 @@ public class ZoneDessin extends JPanel {
|
||||
|
||||
//4. Détruire la boule si elle dépasse le joueur sans être touchée ---
|
||||
// Le cercle est à X = 400. Si la boule est à X < 350, elle est "passée".
|
||||
if (!collision && boule.getX() < 350) {
|
||||
if (!collision && boule.getX() < 320) {
|
||||
boolesBonus.remove(i);
|
||||
// On ne change pas bonusRecupere ici (donc rien ne se passe)
|
||||
}
|
||||
@@ -205,7 +276,8 @@ public class ZoneDessin extends JPanel {
|
||||
collisionOccur = false;
|
||||
hadBeenOnLine = false;
|
||||
bonusRecupere = 0;
|
||||
compteurBoule = 0;
|
||||
compteurBoule = -delaiInitialBoule;
|
||||
dernierJoueurY = null;
|
||||
repaint();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user