diff --git a/src/Game.java b/src/Game.java index de2c652..266fd54 100644 --- a/src/Game.java +++ b/src/Game.java @@ -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). + *

+ * Chaque instance contient toutes les informations nécessaires pour créer et positionner + * cette vue à l’écran. + *

+ * + * @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 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 cars = new ArrayList<>(); + /** Liste des voitures à créer pour le jeu */ + private ArrayList 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 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. *

@@ -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 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; - } -} \ No newline at end of file +} diff --git a/src/Main.java b/src/Main.java index 7bd48af..23972b5 100644 --- a/src/Main.java +++ b/src/Main.java @@ -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(); } } \ No newline at end of file