fix(Game.java): deplacer addVisual dans le Builder

This commit is contained in:
2025-11-10 21:38:52 +01:00
parent 7415af4b72
commit 9570ed96fd
2 changed files with 74 additions and 45 deletions

View File

@@ -15,19 +15,30 @@ public class Game
* {@link CarInfo} est une structure simple qui contient les informations
* nécessaires pour créer une voiture dans le jeu : son nom et sa couleur.
*/
public static class CarInfo
{
/** Nom de la voiture */
public final String name;
/** Couleur de la voiture */
public final Color color;
public record CarInfo(String name, Color color) {}
public CarInfo(String name, Color color, boolean visual)
{
this.name = name;
this.color = color;
}
}
/**
* {@link VisualInfo} est un enregistrement (record) qui décrit une vue graphique
* à afficher dans le jeu (par exemple un tableau de bord, une piste ou un classement).
* <p>
* Chaque instance contient toutes les informations nécessaires pour créer et positionner
* cette vue à lécran.
* </p>
*
* @param type le type concret de la vue (classe héritant de {@link GameView})
* @param title le titre de la fenêtre ou du panneau associé
* @param width la largeur en pixels de la vue
* @param height la hauteur en pixels de la vue
* @param x la position horizontale (en pixels) de la vue sur lécran
* @param y la position verticale (en pixels) de la vue sur lécran
*/
public record VisualInfo
(
Class<? extends GameView> type,
String title,
int width, int height,
int x, int y
) {}
/**
* Builder pour créer une instance de {@link Game} de façon fluide.
@@ -40,6 +51,8 @@ public class Game
{
/** Liste des voitures à créer pour le jeu */
private ArrayList<CarInfo> cars = new ArrayList<>();
/** Liste des voitures à créer pour le jeu */
private ArrayList<VisualInfo> visuals = new ArrayList<>();
/** État initial du jeu */
private State state = new State();
/** Temps entre chaque step du jeu */
@@ -82,6 +95,39 @@ public class Game
return this;
}
public Builder addVisual(Class<? extends GameView> type, String title, int width, int height, int x, int y)
{
visuals.add(new VisualInfo(type, title, width, height, x, y));
return this;
}
private void buildVisual(Game game)
{
for (VisualInfo v : visuals)
{
if (v.type == Rankboard.class)
game.addObserver(new Rankboard(game, v.title, v.width, v.height, v.x, v.y));
else if (v.type == Track.class)
game.addObserver(new Track(game, v.title, v.width, v.height, v.x, v.y));
else if (v.type == Dashboard.class)
{
for (CarInfo info : cars)
{
if (info.name.equals(v.title))
{
Car car = game.getCars().stream()
.filter(c -> c.getName().equals(info.name))
.findFirst()
.orElse(null);
if (car != null)
game.addObserver(new Dashboard(game, car, v.title, v.width, v.height, v.x, v.y));
break;
}
}
}
}
}
/**
* Construit l'instance de {@link Game} avec les paramètres définis.
* <p>
@@ -95,7 +141,10 @@ public class Game
System.err.println("Vous devez définir une carte avant de construire le jeu !");
System.exit(1);
}
return new Game(map, cars, state, time);
Game game = new Game(map, cars, state, time);
buildVisual(game);
return game;
}
}
@@ -294,24 +343,4 @@ public class Game
{
return isPaused;
}
/** Carte sur laquelle le jeu se déroule */
public Game addVisual(Class<? extends GameView> c, String title, int width, int height, int x, int y)
{
if (c == Rankboard.class)
obs.add(new Rankboard(this, title, width, height, x, y));
else if (c == Track.class)
obs.add(new Track(this, title, width, height, x, y));
else if (c == Dashboard.class)
{
for (Car car : cars)
if (car.getName().equals(title))
{
obs.add(new Dashboard(this, car, title, width, height, x, y));
break;
}
}
return this;
}
}

View File

@@ -20,18 +20,18 @@ public class Main {
Map m = Map.fromInts(map);
Game game = new Game.Builder()
.addCar(new Game.CarInfo("Voiture 1", Color.BLUE, true))
.addCar(new Game.CarInfo("Voiture 2", Color.PINK, true))
.addCar(new Game.CarInfo("Voiture 3", Color.RED, true))
.addCar(new Game.CarInfo("Voiture à LUWIK", Color.BLUE))
.addCar(new Game.CarInfo("Voiture à CHARAZADE", Color.PINK))
.addCar(new Game.CarInfo("Voiture de UPEC", Color.RED))
.setTime(1000)
.setMap(m)
.build();
game
.addVisual(Dashboard.class, "Voiture 1", 300, 200, 1000, 0)
.addVisual(Dashboard.class, "Voiture 2", 300, 200, 1000, 200)
.addVisual(Dashboard.class, "Voiture 3", 300, 200, 1000, 400)
.addVisual(Dashboard.class, "Voiture à LUWIK", 300, 200, 1000, 0)
.addVisual(Dashboard.class, "Voiture à CHARAZADE", 300, 200, 1000, 200)
.addVisual(Dashboard.class, "Voiture de UPEC", 300, 200, 1000, 400)
.addVisual(Track.class, "Piste Formule 1", 1000, 500, 1, 1)
.addVisual(Rankboard.class, "Score", 200, 200, 0, 510)
.run();
.build();
game.run();
}
}