order, totems, visual effects

This commit is contained in:
2026-05-11 18:04:58 +02:00
parent bcdc129e67
commit 874091e9cc
25 changed files with 107 additions and 20 deletions
@@ -1,13 +1,9 @@
package it.polimi.ingsw.gc14.View.GUI;
import it.polimi.ingsw.gc14.Controller.ClientController;
import it.polimi.ingsw.gc14.Model.*;
import it.polimi.ingsw.gc14.Model.Cards.BuildingCard;
import it.polimi.ingsw.gc14.Model.Cards.TribeCard;
import it.polimi.ingsw.gc14.Model.Cards.TribeCards.Characters.*;
import it.polimi.ingsw.gc14.Model.Game;
import it.polimi.ingsw.gc14.Model.PlayableCard;
import it.polimi.ingsw.gc14.Model.Player;
import it.polimi.ingsw.gc14.Model.Slot;
import javafx.animation.ScaleTransition;
import javafx.fxml.FXML;
import javafx.geometry.Insets;
@@ -86,18 +82,56 @@ public class MainFXMLController {
}
// ==== HELPER ====
private ImageView createSlot(Slot slot) {
ImageView img = new ImageView(new Image(getClass().getResourceAsStream("/GUIImages/Fronts/card-"+slot.getSlotId()+".png")));
private StackPane createOrder(String num, boolean withZoom, boolean withShadow) {
ImageView img = new ImageView(new Image(getClass().getResourceAsStream("/GUIImages/Orders/order-" + num + ".png")));
img.setFitHeight(240);
img.setPreserveRatio(true);
Rectangle clip = new Rectangle();
clip.setWidth(img.getBoundsInLocal().getWidth());
clip.setHeight(240);
clip.setArcWidth(20);
clip.setArcHeight(20);
img.setClip(clip);
return img;
StackPane wrapper = new StackPane(img);
if (withShadow) {
addShadow(wrapper);
}
if (withZoom) {
addHoverZoom(wrapper);
}
return wrapper;
}
private StackPane createSlot(Slot slot, boolean withZoom, boolean withShadow) {
ImageView img = new ImageView(new Image(getClass().getResourceAsStream("/GUIImages/Fronts/card-" + slot.getSlotId() + ".png")));
img.setFitHeight(240);
img.setPreserveRatio(true);
Rectangle clip = new Rectangle();
clip.setWidth(img.getBoundsInLocal().getWidth());
clip.setHeight(240);
clip.setArcWidth(20);
clip.setArcHeight(20);
img.setClip(clip);
StackPane wrapper = new StackPane(img);
Player player = model.getSlotMap().get(slot);
if (player != null) {
int index = model.getPlayers().indexOf(player);
ImageView totem = new ImageView(new Image(getClass().getResourceAsStream("/GUIImages/Totems/totem_" + index + ".png")));
totem.setFitHeight(70);
totem.setPreserveRatio(true);
StackPane.setAlignment(totem, Pos.TOP_LEFT);
StackPane.setMargin(totem, new Insets(8, 0, 0, 57));
wrapper.getChildren().add(totem);
}
if (withShadow) {
addShadow(wrapper);
}
if (withZoom) {
addHoverZoom(wrapper);
}
return wrapper;
}
private StackPane createCard(PlayableCard card, boolean withZoom, boolean withShadow) {
String id = card.getIdIMG();
@@ -201,16 +235,42 @@ public class MainFXMLController {
i++;
}
}
private void renderOrder() {
StackPane card = createOrder(Integer.toString(model.getNPlayers()), true, true);
VBox overlay = new VBox(-20);
overlay.setPickOnBounds(false);
StackPane.setAlignment(overlay, Pos.TOP_LEFT);
StackPane.setMargin(overlay, new Insets(9, 0, 0, 57));
int i = 0;
for (Player player : model.getPlayers()) {
final int index = i;
ImageView totem = new ImageView(new Image(getClass().getResourceAsStream("/GUIImages/Totems/totem_" + index + ".png")));
totem.setFitHeight(70);
totem.setPreserveRatio(true);
if (!(model.orderLogicCard.getPosition(player.getUserName()) != -1 && !model.getSlotMap().containsValue(player))) {
totem.setOpacity(0.0);
}
overlay.getChildren().add(totem);
i++;
}
card.getChildren().add(overlay);
board.getChildren().add(card);
}
private void renderBoard() {
board.setSpacing(14);
board.setAlignment(Pos.CENTER);
board.getChildren().clear();
renderOrder();
int i = 0;
for (Map.Entry<Slot, Player> entry : model.getSlotMap().entrySet()) {
Slot slot = entry.getKey();
final int index = i;
ImageView img = createSlot(slot);
StackPane img = createSlot(slot, true, true);
img.setOnMouseClicked(e -> controller.slotChoice(username, index));
board.getChildren().add(img);
i++;
@@ -289,18 +349,16 @@ public class MainFXMLController {
}
private void renderPlayers(VBox playersHand) {
for (Player player : model.getPlayers()) {
if(player.getUserName().equals(username)) {
continue;
}
VBox card = new VBox();
VBox.setMargin(card, new Insets(5, 5, 5, 5));
card.setAlignment(Pos.CENTER);
card.getStyleClass().add("player-card");
Label usernameLabel;
if(player.getUserName().equals(username)) {
usernameLabel = new Label(player.getUserName()+" (you)");
Label usernameLabel = new Label(player.getUserName());
} else {
usernameLabel = new Label(player.getUserName());
}
usernameLabel.getStyleClass().add("label-medium");
Label foodLabel = new Label("Food: " + player.getFoodValue());
foodLabel.getStyleClass().add("label-small");
@@ -314,6 +372,34 @@ public class MainFXMLController {
playersHand.getChildren().add(card);
}
Region spacer = new Region();
VBox.setVgrow(spacer, Priority.ALWAYS);
playersHand.getChildren().add(spacer);
VBox card = new VBox();
VBox.setMargin(card, new Insets(5, 5, 5, 5));
card.setAlignment(Pos.CENTER);
card.getStyleClass().add("frame");
Label usernameLabel = new Label(username);
usernameLabel.getStyleClass().add("label-medium");
int index = model.getPlayers().indexOf(
model.getPlayers().stream()
.filter(p -> p.getUserName().equals(username))
.findFirst()
.orElse(null)
);
ImageView totem = new ImageView(new Image(getClass().getResourceAsStream("/GUIImages/Totems/totem_" + index + ".png")));
totem.setFitHeight(10);
totem.setPreserveRatio(true);
Label foodLabel = new Label("Food: " + model.getPlayerByUsername(username).getFoodValue());
foodLabel.getStyleClass().add("label-small");
Label prestigeLabel = new Label("Prestige: " + model.getPlayerByUsername(username).getPrestigeValue());
prestigeLabel.getStyleClass().add("label-small");
card.getChildren().addAll(usernameLabel, totem, foodLabel, prestigeLabel);
playersHand.getChildren().add(card);
}
private void renderIcons(HBox icons, Player player) {
String[][] iconTypes = {