Tile par rapport a la base de donnée + fix rotation tuile

This commit is contained in:
Vincent
2024-10-26 22:31:34 +02:00
parent f5c3fa6149
commit 70acc18573
42 changed files with 189 additions and 135 deletions
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Before

Width:  |  Height:  |  Size: 322 KiB

After

Width:  |  Height:  |  Size: 322 KiB

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+86 -34
View File
@@ -1,10 +1,12 @@
package controller; package controller;
import model.Tile; import model.Tile;
import model.TileDatabaseManager;
import view.HexagonTile; import view.HexagonTile;
import javax.swing.*; import javax.swing.*;
import java.awt.Point; import java.awt.Point;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@@ -15,19 +17,31 @@ public class GameController implements TilePlacer {
private Tile nextTile; private Tile nextTile;
private HexagonTile nextTilePreview; private HexagonTile nextTilePreview;
private GameContext gameContext; private GameContext gameContext;
private TileDatabaseManager dbManager;
private List<Tile> currentTiles;
private int tileIndex;
public GameController(GameContext gameContext, JPanel gridPanel, Tile nextTile, HexagonTile nextTilePreview) { public GameController(GameContext gameContext, JPanel gridPanel, HexagonTile nextTilePreview) {
this.gameContext = gameContext; this.gameContext = gameContext;
this.gridPanel = gridPanel; this.gridPanel = gridPanel;
this.hexagonMap = gameContext.getHexagonMap(); this.hexagonMap = gameContext.getHexagonMap();
this.availablePositions = gameContext.getAvailablePositions(); this.availablePositions = gameContext.getAvailablePositions();
this.nextTile = nextTile;
this.nextTilePreview = nextTilePreview; this.nextTilePreview = nextTilePreview;
// Mettre à jour la preview initiale this.dbManager = new TileDatabaseManager();
this.tileIndex = 0;
loadSeries(1); // Charger la série par défaut (ex. série 1)
updatePreview(); updatePreview();
} }
public void loadSeries(int idSeries) {
currentTiles = dbManager.getTilesBySeries(idSeries);
tileIndex = 0;
System.out.println("Série " + idSeries + " chargée avec " + currentTiles.size() + " tuiles.");
}
@Override @Override
public void placeTile(Point position) { public void placeTile(Point position) {
if (availablePositions.contains(position)) { if (availablePositions.contains(position)) {
@@ -37,7 +51,9 @@ public class GameController implements TilePlacer {
return; return;
} }
hexTile.setTile(nextTile); System.out.println("Placement de la tuile avec ID : " + (nextTile != null ? nextTile.getId() : "null") + " à la position : " + position);
hexTile.setTile(nextTile); // Place la tuile actuelle
gridPanel.revalidate(); gridPanel.revalidate();
gridPanel.repaint(); gridPanel.repaint();
@@ -52,32 +68,52 @@ public class GameController implements TilePlacer {
} }
gameContext.repaintGrid(gridPanel); gameContext.repaintGrid(gridPanel);
generateNextTile(); generateNextTile(); // Génère la tuile suivante
} }
} }
public void initializeGame(CameraController cameraController) {
Tile initialTile = generateRandomTile();
public void initializeGame(CameraController cameraController) {
generateNextTile(); // Génère la première tuile et assigne une tuile valide à `nextTile`
Tile initialTile = getNextTile(); // Récupère la tuile générée
if (initialTile == null) {
System.out.println("Erreur : aucune tuile initiale générée.");
return; // Arrête l'initialisation si aucune tuile n'a été générée
}
System.out.println("ID de la tuile initiale générée : " + initialTile.getId()); // Affiche l'ID de la tuile initiale
int centerX = gridPanel.getPreferredSize().width / 2; int centerX = gridPanel.getPreferredSize().width / 2;
int centerY = gridPanel.getPreferredSize().height / 2; int centerY = gridPanel.getPreferredSize().height / 2;
Point initialPosition = new Point(0, 0); Point initialPosition = new Point(0, 0);
initialPosition.setLocation(centerX / 50, centerY / 50); initialPosition.setLocation(centerX / 50, centerY / 50); // Calcule la position centrale
placeInitialTile(initialPosition, cameraController, initialTile); placeInitialTile(initialPosition, cameraController, initialTile); // Place la première tuile
generateNextTile(); generateNextTile();
} }
public void placeInitialTile(Point position, CameraController cameraController, Tile tile) { public void placeInitialTile(Point position, CameraController cameraController, Tile tile) {
addHexagonTile(position, gridPanel, 50, cameraController, tile); if (tile == null) {
availablePositions.remove(position); System.out.println("Erreur : tuile initiale non définie.");
return;
}
System.out.println("Placement de la tuile initiale avec ID : " + tile.getId() + " à la position : " + position);
addHexagonTile(position, gridPanel, 50, cameraController, tile); // Place la première tuile
availablePositions.remove(position); // Marque la position comme occupée
Point[] adjacentPositions = getAdjacentPositions(position); Point[] adjacentPositions = getAdjacentPositions(position);
for (Point adj : adjacentPositions) { for (Point adj : adjacentPositions) {
if (!hexagonMap.containsKey(adj)) { if (!hexagonMap.containsKey(adj)) {
availablePositions.add(adj); availablePositions.add(adj);
addHexagonTile(adj, gridPanel, 50, cameraController, null); addHexagonTile(adj, gridPanel, 50, cameraController, null); // Placeholder vide pour les positions adjacentes
} }
} }
} }
@@ -87,44 +123,68 @@ public class GameController implements TilePlacer {
System.out.println("Erreur : position ou panel est null"); System.out.println("Erreur : position ou panel est null");
return; return;
} }
int xOffset = position.x * (int) (hexSize * 3 / 2); int xOffset = position.x * (int) (hexSize * 3 / 2);
int yOffset = position.y * (int) (Math.sqrt(3) * hexSize); int yOffset = position.y * (int) (Math.sqrt(3) * hexSize);
if (cameraController != null) { if (cameraController != null) {
Point viewOffset = cameraController.getViewOffset(); Point viewOffset = cameraController.getViewOffset();
xOffset += viewOffset.x; xOffset += viewOffset.x;
yOffset += viewOffset.y; yOffset += viewOffset.y;
} }
if (position.x % 2 != 0) { if (position.x % 2 != 0) {
yOffset += (int) (Math.sqrt(3) * hexSize / 2); yOffset += (int) (Math.sqrt(3) * hexSize / 2);
} }
HexagonTile hexTile = new HexagonTile(position); boolean isPlaceholder = (tile == null); // Si tile est null, c'est un placeholder
HexagonTile hexTile = new HexagonTile(position, isPlaceholder);
if (tile != null) { if (tile != null) {
hexTile.setTile(tile); hexTile.setTile(tile);
} else { } else {
System.out.println("Aucun tile n'a été fourni pour cette position : " + position); System.out.println("Aucun tile n'a été fourni pour cette position : " + position);
} }
hexTile.setBounds(xOffset, yOffset, hexSize, hexSize); hexTile.setBounds(xOffset, yOffset, hexSize, hexSize);
hexTile.addMouseListener(new HexagonMouseListener(hexTile, this, availablePositions)); hexTile.addMouseListener(new HexagonMouseListener(hexTile, this, availablePositions));
hexagonMap.put(position, hexTile); hexagonMap.put(position, hexTile);
panel.add(hexTile); panel.add(hexTile);
panel.revalidate(); panel.revalidate();
panel.repaint(); panel.repaint();
} }
public void generateNextTile() { public void generateNextTile() {
nextTile = new Tile(); if (tileIndex < currentTiles.size()) {
updatePreview(); nextTile = currentTiles.get(tileIndex++);
System.out.println("Génération de la prochaine tuile avec ID : " + nextTile.getId() + " (index " + tileIndex + ")");
updatePreview(); // Met à jour l'aperçu de la tuile suivante
} else {
nextTile = null; // Fin de la série, plus de tuiles à placer
updatePreview(); // Met à jour l'aperçu pour refléter l'absence de prochaine tuile
System.out.println("Fin de la série. Plus de tuiles à placer.");
}
} }
private void updatePreview() { private void updatePreview() {
nextTilePreview.setTile(nextTile); if (nextTilePreview != null) {
nextTilePreview.repaint(); if (nextTile != null) {
nextTilePreview.setTile(nextTile); // Met à jour avec une tuile valide
} else {
nextTilePreview.setTile(null); // Affiche un placeholder ou un message si `nextTile` est null
}
nextTilePreview.repaint();
}
}
public Tile getNextTile() {
return nextTile;
} }
private Point[] getAdjacentPositions(Point position) { private Point[] getAdjacentPositions(Point position) {
@@ -148,12 +208,4 @@ public class GameController implements TilePlacer {
}; };
} }
} }
private Tile generateRandomTile() {
return new Tile();
}
public Tile getNextTile() {
return nextTile;
}
} }
@@ -10,6 +10,8 @@ public class MouseWheelController implements MouseWheelListener {
private HexagonTile previewTile; private HexagonTile previewTile;
private GameController gameController; private GameController gameController;
private long lastRotationTime = 0; // Stocke le temps de la dernière rotation
private static final int ROTATION_DELAY = 100; // Délai minimum en millisecondes entre chaque rotation
public MouseWheelController(HexagonTile previewTile, GameController gameController) { public MouseWheelController(HexagonTile previewTile, GameController gameController) {
this.previewTile = previewTile; this.previewTile = previewTile;
@@ -18,14 +20,21 @@ public class MouseWheelController implements MouseWheelListener {
@Override @Override
public void mouseWheelMoved(MouseWheelEvent e) { public void mouseWheelMoved(MouseWheelEvent e) {
Tile nextTile = gameController.getNextTile(); long currentTime = System.currentTimeMillis();
if (e.getWheelRotation() < 0) { // Si le délai entre les rotations est respecté, on procède à la rotation
nextTile.rotateClockwise(); if (currentTime - lastRotationTime >= ROTATION_DELAY) {
} else if (e.getWheelRotation() > 0) { Tile nextTile = gameController.getNextTile();
nextTile.rotateClockwise(); if (nextTile != null) {
if (e.getWheelRotation() < 0) {
nextTile.rotateClockwise();
} else if (e.getWheelRotation() > 0) {
nextTile.rotateCounterClockwise();
}
previewTile.repaint(); // Mettre à jour l'aperçu avec la nouvelle rotation
lastRotationTime = currentTime; // Mise à jour du temps de la dernière rotation
}
} }
previewTile.repaint(); // Mettre à jour l'aperçu avec la nouvelle rotation
} }
} }
+18 -53
View File
@@ -1,76 +1,41 @@
package model; package model;
import java.util.Random;
public class Tile { public class Tile {
private int id; // Ajoute l'attribut id
private TerrainType[] terrains; // 2 terrains maximum par tuile private TerrainType[] terrains; // 2 terrains maximum par tuile
private int segmentsForTerrain1; // Nombre de segments pour le premier terrain private int segmentsForTerrain1;
private static final Random random = new Random();
private int rotation; private int rotation;
public Tile() { // Constructeur modifié pour inclure l'ID
this.terrains = new TerrainType[2]; // Seulement deux terrains public Tile(int id, TerrainType terrain1, TerrainType terrain2, int segmentsForTerrain1) {
generateTerrains(); this.id = id;
assignSegments(); this.terrains = new TerrainType[]{terrain1, terrain2};
this.rotation = 0; // Rotation initiale à 0 this.segmentsForTerrain1 = segmentsForTerrain1;
this.rotation = 0;
} }
// Méthode pour tourner la tuile dans le sens des aiguilles d'une montre
public void rotateClockwise() { public void rotateClockwise() {
rotation = (rotation + 1) % 6; // Modulo 6 pour garder une rotation entre 0 et 5 rotation = (rotation + 1) % 6;
} }
// Méthode pour obtenir la rotation actuelle public void rotateCounterClockwise() {
rotation = (rotation + 5) % 6; // Tourner dans le sens inverse, équivalent à -1 dans un modulo 6
}
public int getRotation() { public int getRotation() {
return rotation; return rotation;
} }
// Génère deux terrains aléatoires pour la tuile public int getId() {
private void generateTerrains() { return id;
terrains[0] = generateRandomTerrain();
terrains[1] = generateRandomTerrain();
// Assure que les deux terrains sont différents
while (terrains[0] == terrains[1]) {
terrains[1] = generateRandomTerrain();
}
}
// Assigner le nombre de segments pour chaque terrain avec plus de diversité
private void assignSegments() {
// Terrain 1 occupe entre 1 et 5 segments, le reste pour le terrain 2
this.segmentsForTerrain1 = random.nextInt(5) + 1;
}
// Génère un terrain aléatoire avec plus de variété dans les probabilités
private TerrainType generateRandomTerrain() {
int rand = random.nextInt(100);
if (rand < 15) {
return TerrainType.MER; // 15% MER
} else if (rand < 30) {
return TerrainType.CHAMP; // 15% CHAMP
} else if (rand < 50) {
return TerrainType.PRE; // 20% PRE
} else if (rand < 75) {
return TerrainType.FORET; // 25% FORET
} else {
return TerrainType.MONTAGNE; // 25% MONTAGNE
}
} }
public TerrainType getTerrain(int index) { public TerrainType getTerrain(int index) {
if (index >= 0 && index < 2) { return index >= 0 && index < 2 ? terrains[index] : null;
return terrains[index];
}
return null;
} }
public int getSegmentsForTerrain(int index) { public int getSegmentsForTerrain(int index) {
if (index == 0) { return index == 0 ? segmentsForTerrain1 : 6 - segmentsForTerrain1;
return segmentsForTerrain1; // Nombre de segments pour le premier terrain
} else {
return 6 - segmentsForTerrain1; // Le reste pour le second terrain
}
} }
} }
@@ -0,0 +1,44 @@
package model;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class TileDatabaseManager {
private static final String DB_URL = "jdbc:mariadb://dwarves.iut-fbleau.fr/akagundu";
private static final String USER = "akagundu";
private static final String PASSWORD = "dersim62Lodek";
public List<Tile> getTilesBySeries(int idSeries) {
List<Tile> tiles = new ArrayList<>();
String query = "SELECT id, couleur1, couleur2, chiffre FROM Tuile WHERE id_serie = ? ORDER BY id ASC";
try (Connection cnx = DriverManager.getConnection(DB_URL, USER, PASSWORD);
PreparedStatement pst = cnx.prepareStatement(query)) {
pst.setInt(1, idSeries);
try (ResultSet rs = pst.executeQuery()) {
while (rs.next()) {
int id = rs.getInt("id"); // Récupère l'ID de la tuile
String couleur1 = rs.getString("couleur1");
String couleur2 = rs.getString("couleur2");
int segmentsForTerrain1 = rs.getInt("chiffre");
System.out.println("Récupération de la tuile avec ID : " + id); // Message de débogage
// Crée la tuile avec l'ID et les autres paramètres
Tile tile = new Tile(id, TerrainType.valueOf(couleur1),
couleur2 != null ? TerrainType.valueOf(couleur2) : null,
segmentsForTerrain1);
tiles.add(tile);
}
}
} catch (SQLException e) {
System.err.println("Database error: " + e.getMessage());
}
return tiles;
}
}
+5 -8
View File
@@ -4,15 +4,13 @@ import controller.GameController;
import controller.CameraController; import controller.CameraController;
import controller.GameContext; import controller.GameContext;
import controller.MouseWheelController; import controller.MouseWheelController;
import model.Tile;
import javax.swing.*; import javax.swing.*;
import java.awt.*; import java.awt.*;
public class GameView extends JFrame { public class GameView extends JFrame {
private JPanel gridPanel; private JPanel gridPanel;
private Tile nextTile; // Tuile en attente private HexagonTile nextTilePreview;
private HexagonTile nextTilePreview; // Composant pour afficher la tuile en attente
private GameController gameController; private GameController gameController;
private CameraController cameraController; private CameraController cameraController;
private GameContext gameContext; private GameContext gameContext;
@@ -35,16 +33,15 @@ public class GameView extends JFrame {
add(gridPanel, BorderLayout.CENTER); add(gridPanel, BorderLayout.CENTER);
// Initialiser la tuile en attente et la preview // Initialiser la preview pour la prochaine tuile
nextTile = new Tile(); nextTilePreview = new HexagonTile(null, false);
nextTilePreview = new HexagonTile(null);
nextTilePreview.setTile(nextTile); // Lier nextTile à la preview
JPanel controlPanel = createControlPanel(); JPanel controlPanel = createControlPanel();
controlPanel.setPreferredSize(new Dimension(200, 600)); controlPanel.setPreferredSize(new Dimension(200, 600));
add(controlPanel, BorderLayout.EAST); add(controlPanel, BorderLayout.EAST);
// Initialiser les contrôleurs avec le contexte de jeu // Initialiser les contrôleurs avec le contexte de jeu
gameController = new GameController(gameContext, gridPanel, nextTile, nextTilePreview); // Passer nextTile et nextTilePreview gameController = new GameController(gameContext, gridPanel, nextTilePreview);
cameraController = new CameraController(gridPanel, gameContext); cameraController = new CameraController(gridPanel, gameContext);
// Ajouter un écouteur pour la molette de la souris // Ajouter un écouteur pour la molette de la souris
+20 -33
View File
@@ -8,14 +8,15 @@ import java.awt.*;
import java.awt.geom.Path2D; import java.awt.geom.Path2D;
public class HexagonTile extends JPanel { public class HexagonTile extends JPanel {
private Tile tile; private Tile tile;
private Point position; private Point position;
private boolean isPlaceholder; // Nouveau champ pour indiquer si l'hexagone est un placeholder
public HexagonTile(Point position) { public HexagonTile(Point position, boolean isPlaceholder) {
this.position = position; this.position = position;
this.isPlaceholder = isPlaceholder;
this.tile = null; this.tile = null;
setPreferredSize(new Dimension(100, 100)); // Ajuste selon la taille de la tuile setPreferredSize(new Dimension(100, 100));
} }
public Point getPosition() { public Point getPosition() {
@@ -24,6 +25,7 @@ public class HexagonTile extends JPanel {
public void setTile(Tile tile) { public void setTile(Tile tile) {
this.tile = tile; this.tile = tile;
this.isPlaceholder = false; // Une fois la tuile posée, ce n'est plus un placeholder
repaint(); repaint();
} }
@@ -32,7 +34,7 @@ public class HexagonTile extends JPanel {
} }
public boolean isFilled() { public boolean isFilled() {
return this.tile != null; // Vérifie si la tuile a déjà été placée return this.tile != null;
} }
@Override @Override
@@ -42,42 +44,35 @@ public class HexagonTile extends JPanel {
int centerX = getWidth() / 2; int centerX = getWidth() / 2;
int centerY = getHeight() / 2; int centerY = getHeight() / 2;
int largeRadius = 50; int largeRadius = isPlaceholder ? 40 : 50; // Réduction de taille pour les placeholders
// Créer la zone de découpe pour le grand hexagone
Shape largeHexagon = createHexagon(centerX, centerY, largeRadius); Shape largeHexagon = createHexagon(centerX, centerY, largeRadius);
g2d.setClip(largeHexagon); g2d.setClip(largeHexagon);
if (tile != null) { if (tile != null) {
// Dessiner les 6 segments de terrain en fonction des proportions et de la rotation
drawTerrainSegments(g2d, centerX, centerY, largeRadius, tile.getRotation()); drawTerrainSegments(g2d, centerX, centerY, largeRadius, tile.getRotation());
} else { } else {
g2d.setColor(Color.LIGHT_GRAY); // Couleur par défaut pour une case vide g2d.setColor(Color.LIGHT_GRAY);
g2d.fill(largeHexagon); g2d.fill(largeHexagon);
} }
// Dessiner la bordure de l'hexagone
g2d.setClip(null); g2d.setClip(null);
g2d.setColor(Color.BLACK); g2d.setColor(Color.BLACK);
g2d.setStroke(new BasicStroke(3)); // Bordure épaisse g2d.setStroke(new BasicStroke(3));
g2d.draw(largeHexagon); g2d.draw(largeHexagon);
} }
// Dessiner les 6 segments de terrain avec la rotation
private void drawTerrainSegments(Graphics2D g2d, int centerX, int centerY, int radius, int rotation) { private void drawTerrainSegments(Graphics2D g2d, int centerX, int centerY, int radius, int rotation) {
int segmentsTerrain1 = tile.getSegmentsForTerrain(0); int segmentsTerrain1 = tile.getSegmentsForTerrain(0);
for (int i = 0; i < 6; i++) { for (int i = 0; i < 6; i++) {
int segmentIndex = (i + rotation) % 6; // Appliquer la rotation aux segments int segmentIndex = (i + rotation) % 6;
if (segmentIndex < segmentsTerrain1) { g2d.setColor(segmentIndex < segmentsTerrain1 ?
g2d.setColor(getTerrainColor(tile.getTerrain(0))); // Premier terrain getTerrainColor(tile.getTerrain(0)) :
} else { getTerrainColor(tile.getTerrain(1)));
g2d.setColor(getTerrainColor(tile.getTerrain(1))); // Deuxième terrain
}
g2d.fillArc(centerX - radius, centerY - radius, 2 * radius, 2 * radius, 60 * i, 60); g2d.fillArc(centerX - radius, centerY - radius, 2 * radius, 2 * radius, 60 * i, 60);
} }
} }
// Créer la forme hexagonale
private Shape createHexagon(int centerX, int centerY, int radius) { private Shape createHexagon(int centerX, int centerY, int radius) {
Path2D hexagon = new Path2D.Double(); Path2D hexagon = new Path2D.Double();
for (int i = 0; i < 6; i++) { for (int i = 0; i < 6; i++) {
@@ -94,25 +89,17 @@ public class HexagonTile extends JPanel {
return hexagon; return hexagon;
} }
// Obtenir la couleur en fonction du type de terrain
private Color getTerrainColor(TerrainType terrain) { private Color getTerrainColor(TerrainType terrain) {
if (terrain == null) { if (terrain == null) {
return Color.WHITE; // Par défaut si le terrain est nul return Color.WHITE;
} }
switch (terrain) { switch (terrain) {
case MER: case MER: return Color.BLUE;
return Color.BLUE; case CHAMP: return Color.YELLOW;
case CHAMP: case PRE: return Color.GREEN;
return Color.YELLOW; case FORET: return new Color(34, 139, 34);
case PRE: case MONTAGNE: return Color.GRAY;
return Color.GREEN; default: return Color.WHITE;
case FORET:
return new Color(34, 139, 34); // Vert foncé
case MONTAGNE:
return Color.GRAY;
default:
return Color.WHITE;
} }
} }
} }