package linea; import java.awt.Color; import java.util.ArrayList; import java.util.List; public class GestionnaireNiveau { public static final int FRAMES_PAR_NIVEAU = 25 * 10; // 10s a 25 FPS (timer 40ms) private final List niveaux = new ArrayList<>(); private int indexNiveau = 0; private int framesDepuisDebut = 0; private int framesDansNiveau = 0; // Duree du fade en frames private static final int DUREE_FADE = 75; // 3 secondes public GestionnaireNiveau() { // Niveau 1 : lisse, cercle large niveaux.add(new Niveau(1, new Color(0, 73, 220), 8, 1 / 80.0, 80, 100, 500)); // Niveau 2 niveaux.add(new Niveau(2, new Color(75, 0, 180), 10, 1 / 60.0, 60, 100, 500)); // Niveau 3 niveaux.add(new Niveau(3, new Color(83, 30, 39), 12, 1 / 40.0, 50, 100, 500)); // Niveau 4 niveaux.add(new Niveau(4, new Color(20, 100, 40), 14, 1 / 30.0, 40, 100, 500)); // Niveau 5 : chaos, cercle petit niveaux.add(new Niveau(5, new Color(30, 30, 30), 16, 1 / 20.0, 30, 100, 500)); } public void mettreAJour() { framesDepuisDebut++; framesDansNiveau++; if (framesDansNiveau >= FRAMES_PAR_NIVEAU && indexNiveau < niveaux.size() - 1) { indexNiveau++; framesDansNiveau = 0; } } public Niveau getNiveauActuel() { return niveaux.get(indexNiveau); } public int getNumeroNiveau() { return niveaux.get(indexNiveau).numero; } public Color getCouleurFondInterpolee() { if (framesDansNiveau < DUREE_FADE && indexNiveau > 0) { Color de = niveaux.get(indexNiveau - 1).couleurFond; Color vers = niveaux.get(indexNiveau).couleurFond; double t = (double) framesDansNiveau / DUREE_FADE; return interpolerCouleur(de, vers, t); } return niveaux.get(indexNiveau).couleurFond; } public double getVitesseScroll() { if (framesDansNiveau < DUREE_FADE && indexNiveau > 0) { double de = niveaux.get(indexNiveau - 1).vitesseScroll; double vers = niveaux.get(indexNiveau).vitesseScroll; double t = (double) framesDansNiveau / DUREE_FADE; return de + (vers - de) * t; } return niveaux.get(indexNiveau).vitesseScroll; } public double getNoiseFrequence() { if (framesDansNiveau < DUREE_FADE && indexNiveau > 0) { double de = niveaux.get(indexNiveau - 1).noiseFrequence; double vers = niveaux.get(indexNiveau).noiseFrequence; double t = (double) framesDansNiveau / DUREE_FADE; return de + (vers - de) * t; } return niveaux.get(indexNiveau).noiseFrequence; } public double getRayonCercle() { if (framesDansNiveau < DUREE_FADE && indexNiveau > 0) { double de = niveaux.get(indexNiveau - 1).rayonCercle; double vers = niveaux.get(indexNiveau).rayonCercle; double t = (double) framesDansNiveau / DUREE_FADE; return de + (vers - de) * t; } return niveaux.get(indexNiveau).rayonCercle; } public double getLimiteHaut() { return niveaux.get(indexNiveau).limiteHaut; } public double getLimiteBas() { return niveaux.get(indexNiveau).limiteBas; } public void reinitialiser() { indexNiveau = 0; framesDepuisDebut = 0; framesDansNiveau = 0; } private static Color interpolerCouleur(Color de, Color vers, double t) { int r = (int) (de.getRed() + (vers.getRed() - de.getRed()) * t); int g = (int) (de.getGreen() + (vers.getGreen() - de.getGreen()) * t); int b = (int) (de.getBlue() + (vers.getBlue() - de.getBlue()) * t); return new Color( Math.max(0, Math.min(255, r)), Math.max(0, Math.min(255, g)), Math.max(0, Math.min(255, b)) ); } }