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 CarInfo(String name, Color color, boolean visual)
{
this.name = name;
this.color = color;
}
}
public record CarInfo(String name, 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)
.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)
.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(Track.class, "Piste Formule 1", 1000, 500, 1, 1)
.addVisual(Rankboard.class, "Score", 200, 200, 0, 510)
.run();
game.run();
}
}