diff --git a/src/Track.java b/src/Track.java index 3b2a893..c49af6d 100644 --- a/src/Track.java +++ b/src/Track.java @@ -1,3 +1,4 @@ +import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; @@ -5,46 +6,73 @@ import java.awt.Graphics; import java.awt.Point; import java.util.ArrayList; +/** + * Track est une vue graphique représentant le circuit de course + * ainsi que les voitures qui y circulent. + * Cette classe hérite de GameView pour être intégrée au système de vues. + *

+ * Le rendu est basé sur une grille définie par Map et chaque cellule + * est dessinée selon son type. Les voitures sont superposées sur la grille. + *

+ */ public class Track extends GameView { + /** La carte du circuit */ private Map map; + /** Liste des voitures à dessiner */ private ArrayList cars; + /** Échelle utilisée pour ajuster la taille des voitures dans les cellules */ + private final int scale = 80; - private final int scale = 75; - + /** + * Construit la vue Track avec une carte et une liste de voitures. + * + * @param map La carte du circuit + * @param cars Liste des voitures + * @param title Titre de la fenêtre + * @param width Largeur de la fenêtre + * @param height Hauteur de la fenêtre + * @param x Position X de la fenêtre + * @param y Position Y de la fenêtre + */ protected Track(Map map, ArrayList cars, String title, int width, int height, int x, int y) { super(title, width, height, x, y); this.map = map; this.cars = cars; } + /** + * Méthode de dessin appelée automatiquement par Swing. + * Dessine chaque cellule de la carte ainsi que les voitures. + */ @Override - protected void paintComponent(Graphics g) - { + protected void paintComponent(Graphics g) { super.paintComponent(g); int rows = map.getHeight(); int cols = map.getWidth(); + // Calcul de la taille d'une cellule en pixels selon la taille de la fenêtre int[] cellSize = new int[] { - (getWidth() + 10) / cols, // width - (getHeight() + 10) / rows // height + (getWidth() + 10) / cols, + (getHeight() + 10) / rows }; - // Caractere bold de la taille de la longueur de l'ecran /2 + // Définir une police monospace en gras pour les caractères du circuit g.setFont(new Font("Monospaced", Font.BOLD, cellSize[1] / 2)); - for (int y = 0; y < rows; y++) - { - for (int x = 0; x < cols; x++) - { + // Parcours de toutes les cellules du circuit + for (int y = 0; y < rows; y++) { + for (int x = 0; x < cols; x++) { Circuit cell = this.map.getElement(x, y); drawCell(g, cell, new int[] {x, y}, cellSize); } } } - private Color getCellColor(Circuit.Cell cell) - { + /** + * Retourne la couleur d'une cellule selon son type. + */ + private Color getCellColor(Circuit.Cell cell) { return switch (cell) { case ROAD -> Color.GRAY; case START -> Color.YELLOW; @@ -54,46 +82,54 @@ public class Track extends GameView { }; } - private char getCellChar(Circuit cell) - { + /** + * Retourne le caractère à afficher pour une cellule du circuit. + */ + private char getCellChar(Circuit cell) { return switch (cell.getType()) { - case Circuit.Cell.ROAD -> '\0'; - case Circuit.Cell.START -> 'D'; - case Circuit.Cell.FINISH -> 'A'; - case Circuit.Cell.EMPTY -> '\0'; - case Circuit.Cell.YROAD -> (char)('0' + cell.getValue()); + case ROAD -> '\0'; + case START -> 'D'; + case FINISH -> 'A'; + case EMPTY -> '\0'; + case YROAD -> (char)('0' + cell.getValue()); }; } - private void drawCars(Graphics g, int[] cellCoord) - { + /** + * Dessine toutes les voitures sur une cellule donnée. + * Les voitures sont légèrement décalées pour ne pas avoir exactement la même taille. + */ + private void drawCars(Graphics g, int[] cellCoord) { int size = 1; - for (Car c : cars) - { - // index de pathMap + for (Car c : cars) { int i = c.getPos(); Point p = this.map.getPath(i); int[] ncoord = new int[] {p.x, p.y}; drawInnerBlock(g, ncoord, cellCoord, c.getColor(), scale - size); - // ne jamais avoir la meme taille pour les voitures - size += 3; + size += 3; // pour différencier visuellement les voitures } } - private void drawCell(Graphics g, Circuit cell, int[] coord, int[] cellCoord) - { + /** + * Dessine une cellule complète avec son contenu (caractère et voitures). + */ + private void drawCell(Graphics g, Circuit cell, int[] coord, int[] cellCoord) { drawBlock(g, cell, coord, cellCoord); char c = getCellChar(cell); - if (c != '\0') + if (c != '\0') { drawCharacter(g, coord, cellCoord, c); - + } + drawCars(g, cellCoord); } - private void drawCharacter(Graphics g, int[] coord, int[] cellCoord, char c) - { - int x = coord[0]; int y = coord[1]; + /** + * Dessine un caractère centré dans une cellule. + */ + private void drawCharacter(Graphics g, int[] coord, int[] cellCoord, char c) { + int x = coord[0]; + int y = coord[1]; int cellWidth = cellCoord[0]; int cellHeight = cellCoord[1]; @@ -102,7 +138,6 @@ public class Track extends GameView { g.setColor(Color.BLACK); FontMetrics fm = g.getFontMetrics(); - // taille du string + font int textWidth = fm.stringWidth(s); // hauteur haute par exemple: h depasse en haut @@ -116,8 +151,10 @@ public class Track extends GameView { g.drawString(s, cx, cy); } - private void drawInnerBlock(Graphics g, int[] coord, int[] cellCoord, Color c, int scale) - { + /** + * Dessine un bloc intérieur plus petit, utilisé pour représenter une voiture + */ + private void drawInnerBlock(Graphics g, int[] coord, int[] cellCoord, Color c, int scale) { // scale de la taille du bloc int w = cellCoord[0] * scale / 100; int h = cellCoord[1] * scale / 100; @@ -131,9 +168,12 @@ public class Track extends GameView { g.fillRect(ox, oy, w, h); } - private void drawBlock(Graphics g, Circuit cell, int[] coord, int[] cellCoord) - { - int x = coord[0]; int y = coord[1]; + /** + * Dessine une cellule de base selon son type et ajoute un contour noir. + */ + private void drawBlock(Graphics g, Circuit cell, int[] coord, int[] cellCoord) { + int x = coord[0]; + int y = coord[1]; int cellWidth = cellCoord[0]; int cellHeight = cellCoord[1]; @@ -143,7 +183,8 @@ public class Track extends GameView { // dessine le bloc de route g.setColor(getCellColor(Circuit.Cell.ROAD)); g.fillRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight); - + + // dessine le sous bloc de route drawInnerBlock(g, coord, cellCoord, getCellColor(cell.getType()), scale); break; default: @@ -152,14 +193,16 @@ public class Track extends GameView { break; } + // contour noir g.setColor(Color.BLACK); g.drawRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight); } + /** + * Méthode appelée automatiquement pour mettre à jour l'affichage. + */ @Override - protected void run() - { + protected void run() { repaint(); } - }