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

View File

@@ -1,10 +1,12 @@
package controller;
import model.Tile;
import model.TileDatabaseManager;
import view.HexagonTile;
import javax.swing.*;
import java.awt.Point;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -15,19 +17,31 @@ public class GameController implements TilePlacer {
private Tile nextTile;
private HexagonTile nextTilePreview;
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.gridPanel = gridPanel;
this.hexagonMap = gameContext.getHexagonMap();
this.availablePositions = gameContext.getAvailablePositions();
this.nextTile = nextTile;
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();
}
public void loadSeries(int idSeries) {
currentTiles = dbManager.getTilesBySeries(idSeries);
tileIndex = 0;
System.out.println("Série " + idSeries + " chargée avec " + currentTiles.size() + " tuiles.");
}
@Override
public void placeTile(Point position) {
if (availablePositions.contains(position)) {
@@ -37,7 +51,9 @@ public class GameController implements TilePlacer {
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.repaint();
@@ -52,32 +68,52 @@ public class GameController implements TilePlacer {
}
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 centerY = gridPanel.getPreferredSize().height / 2;
Point initialPosition = new Point(0, 0);
initialPosition.setLocation(centerX / 50, centerY / 50);
placeInitialTile(initialPosition, cameraController, initialTile);
initialPosition.setLocation(centerX / 50, centerY / 50); // Calcule la position centrale
placeInitialTile(initialPosition, cameraController, initialTile); // Place la première tuile
generateNextTile();
}
public void placeInitialTile(Point position, CameraController cameraController, Tile tile) {
addHexagonTile(position, gridPanel, 50, cameraController, tile);
availablePositions.remove(position);
if (tile == null) {
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);
for (Point adj : adjacentPositions) {
if (!hexagonMap.containsKey(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");
return;
}
int xOffset = position.x * (int) (hexSize * 3 / 2);
int yOffset = position.y * (int) (Math.sqrt(3) * hexSize);
if (cameraController != null) {
Point viewOffset = cameraController.getViewOffset();
xOffset += viewOffset.x;
yOffset += viewOffset.y;
}
if (position.x % 2 != 0) {
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) {
hexTile.setTile(tile);
} else {
System.out.println("Aucun tile n'a été fourni pour cette position : " + position);
}
hexTile.setBounds(xOffset, yOffset, hexSize, hexSize);
hexTile.addMouseListener(new HexagonMouseListener(hexTile, this, availablePositions));
hexagonMap.put(position, hexTile);
panel.add(hexTile);
panel.revalidate();
panel.repaint();
}
public void generateNextTile() {
nextTile = new Tile();
updatePreview();
if (tileIndex < currentTiles.size()) {
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() {
nextTilePreview.setTile(nextTile);
nextTilePreview.repaint();
if (nextTilePreview != null) {
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) {
@@ -148,12 +208,4 @@ public class GameController implements TilePlacer {
};
}
}
private Tile generateRandomTile() {
return new Tile();
}
public Tile getNextTile() {
return nextTile;
}
}

View File

@@ -10,6 +10,8 @@ public class MouseWheelController implements MouseWheelListener {
private HexagonTile previewTile;
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) {
this.previewTile = previewTile;
@@ -18,14 +20,21 @@ public class MouseWheelController implements MouseWheelListener {
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
Tile nextTile = gameController.getNextTile();
long currentTime = System.currentTimeMillis();
if (e.getWheelRotation() < 0) {
nextTile.rotateClockwise();
} else if (e.getWheelRotation() > 0) {
nextTile.rotateClockwise();
// Si le délai entre les rotations est respecté, on procède à la rotation
if (currentTime - lastRotationTime >= ROTATION_DELAY) {
Tile nextTile = gameController.getNextTile();
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
}
}