Add: fonts, background

This commit is contained in:
2026-05-10 10:21:26 +02:00
parent f3cd29169c
commit be1b746363
13 changed files with 192 additions and 170 deletions
@@ -10,13 +10,14 @@ import javafx.stage.Stage;
public class GUI implements IView { // stessa interfaccia che implementa TUI
private final Stage stage;
private final MainView mainView = new MainView();
private final MainView mainView;
private Game model;
private ClientController controller;
private String username;
public GUI(Stage stage) {
this.stage = stage;
this.mainView = new MainView();
}
@Override
@@ -2,6 +2,7 @@ package it.polimi.ingsw.gc14.View.GUI;
import it.polimi.ingsw.gc14.Controller.ClientController;
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.Player;
import it.polimi.ingsw.gc14.Model.Slot;
@@ -9,11 +10,15 @@ import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXML;
import javafx.geometry.Bounds;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.image.*;
import javafx.scene.layout.*;
import javafx.scene.shape.*;
import javafx.scene.text.Font;
import javafx.stage.Popup;
import java.util.ArrayList;
import java.util.List;
@@ -21,18 +26,25 @@ import java.util.Map;
public class MainFXMLController {
@FXML private HBox mainHBox;
@FXML private HBox board;
@FXML private HBox upperList;
@FXML private HBox lowerList;
@FXML private HBox myHand;
@FXML private VBox playersHand;
@FXML private Button reload;
private Popup popup;
private HBox popupCards;
private Game model;
private ClientController controller;
private String username;
@FXML
public void initialize() {
initPopup();
}
public void setModel(Game model) {
this.model = model;
}
@@ -41,7 +53,7 @@ public class MainFXMLController {
public void render() {
//mainHBox.setBackground(new Background(new BackgroundImage(new Image(getClass().getResourceAsStream("/GUIImages/Background.png")), null, null, null, null)));
// Upper list
upperList.setSpacing(6);
upperList.setAlignment(Pos.CENTER);
@@ -51,14 +63,13 @@ public class MainFXMLController {
for (TribeCard card : model.getUpperListTribeCards()) {
final int index = i;
Image tribeImg = new Image(getClass().getResourceAsStream("/GUIImages/Fronts/card-" + card.getIdIMG() + ".png"));
ImageView view = new ImageView(tribeImg);
view.fitHeightProperty().bind(upperList.heightProperty().subtract(10));
view.setPreserveRatio(true);
ImageView img = new ImageView(new Image(getClass().getResourceAsStream("/GUIImages/Fronts/card-" + card.getIdIMG() + ".png")));
img.fitHeightProperty().bind(upperList.heightProperty().subtract(10));
img.setPreserveRatio(true);
view.setOnMouseClicked(e -> controller.drawUpperTribeCard(username, index));
img.setOnMouseClicked(e -> controller.drawUpperTribeCard(username, index));
upperList.getChildren().add(view);
upperList.getChildren().add(img);
i++;
}
@@ -73,15 +84,14 @@ public class MainFXMLController {
Slot slot = entry.getKey();
final int index = i;
Image slotImg = new Image(getClass().getResourceAsStream("/GUIImages/Fronts/card-"+slot.getSlotId()+".png"));
ImageView view = new ImageView(slotImg);
ImageView img = new ImageView(new Image(getClass().getResourceAsStream("/GUIImages/Fronts/card-"+slot.getSlotId()+".png")));
view.fitHeightProperty().bind(board.heightProperty().subtract(10));
view.setPreserveRatio(true);
img.fitHeightProperty().bind(board.heightProperty().subtract(10));
img.setPreserveRatio(true);
view.setOnMouseClicked(e -> controller.slotChoice(username, index));
img.setOnMouseClicked(e -> controller.slotChoice(username, index));
board.getChildren().add(view);
board.getChildren().add(img);
i++;
}
@@ -96,14 +106,13 @@ public class MainFXMLController {
for (TribeCard card : model.getLowerListTribeCards()) {
final int index = i;
Image tribeImg = new Image(getClass().getResourceAsStream("/GUIImages/Fronts/card-" + card.getIdIMG() + ".png"));
ImageView view = new ImageView(tribeImg);
view.fitHeightProperty().bind(lowerList.heightProperty().subtract(10));
view.setPreserveRatio(true);
ImageView img = new ImageView(new Image(getClass().getResourceAsStream("/GUIImages/Fronts/card-" + card.getIdIMG() + ".png")));
img.fitHeightProperty().bind(lowerList.heightProperty().subtract(10));
img.setPreserveRatio(true);
view.setOnMouseClicked(e -> controller.drawLowerTribeCard(username, index));
img.setOnMouseClicked(e -> controller.drawLowerTribeCard(username, index));
lowerList.getChildren().add(view);
lowerList.getChildren().add(img);
i++;
}
@@ -111,159 +120,79 @@ public class MainFXMLController {
// My hand
myHand.getChildren().clear();
myHand.setSpacing(6);
//myHand.setAlignment(Pos.CENTER_LEFT);
myHand.setAlignment(Pos.CENTER);
myHand.getChildren().add(createCardPane(model.getPlayerByUsername(username).artists.stream().map(x -> (TribeCard) x).toList(), myHand));
myHand.getChildren().add(createCardPane(model.getPlayerByUsername(username).gatherers.stream().map(x -> (TribeCard) x).toList(), myHand));
myHand.getChildren().add(createCardPane(model.getPlayerByUsername(username).inventors.stream().map(x -> (TribeCard) x).toList(), myHand));
myHand.getChildren().add(createCardPane(model.getPlayerByUsername(username).builders.stream().map(x -> (TribeCard) x).toList(), myHand));
myHand.getChildren().add(createCardPane(model.getPlayerByUsername(username).shamans.stream().map(x -> (TribeCard) x).toList(), myHand));
myHand.getChildren().add(createCardPane(model.getPlayerByUsername(username).hunters.stream().map(x -> (TribeCard) x).toList(), myHand));
drawMyHandCard(myHand, model.getPlayerByUsername(username).artists);
drawMyHandCard(myHand, model.getPlayerByUsername(username).gatherers);
drawMyHandCard(myHand, model.getPlayerByUsername(username).inventors);
drawMyHandCard(myHand, model.getPlayerByUsername(username).builders);
drawMyHandCard(myHand, model.getPlayerByUsername(username).shamans);
drawMyHandCard(myHand, model.getPlayerByUsername(username).hunters);
}
/**
// Artists
Pane artists = new Pane();
artists.prefHeightProperty().bind(myHand.heightProperty());
artists.prefWidthProperty().bind(
artists.heightProperty().multiply(0.63).add((model.getPlayerByUsername(username).artists.size() - 1) * 50)
);
for (int j=0;j<model.getPlayerByUsername(username).artists.size();j++) {
TribeCard card=model.getPlayerByUsername(username).artists.get(j);
void drawMyHandCard(HBox myHand, ArrayList<? extends TribeCard> cardList) {
if (!cardList.isEmpty()) {
ImageView img = new ImageView(new Image(getClass().getResourceAsStream("/GUIImages/Fronts/card-" + cardList.getLast().getIdIMG() + ".png")));
img.fitHeightProperty().bind(myHand.heightProperty().subtract(10));
img.setPreserveRatio(true);
Image tribeImg = new Image(getClass().getResourceAsStream("/GUIImages/Fronts/card-" + card.getIdIMG() + ".png"));
ImageView view = new ImageView(tribeImg);
view.fitHeightProperty().bind(artists.heightProperty().subtract(10));
view.setPreserveRatio(true);
view.setLayoutX((model.getPlayerByUsername(username).artists.size() -j ) * 50); // solo X cambia
view.setLayoutY(5);
artists.getChildren().addLast(view);
i++;
Label label = new Label(String.valueOf(cardList.size()));
label.setTranslateY(-55);
label.setTranslateX(10);
Font.loadFont(getClass().getResourceAsStream("/Fonts/InknutAntiqua-Regular.ttf"), 16);
label.setStyle("-fx-font-family: 'Inknut Antiqua'; -fx-font-size: 50px; -fx-font-weight: bold; -fx-text-fill: black;");
StackPane.setAlignment(label, Pos.TOP_RIGHT);
StackPane stack = new StackPane(img, label);
stack.setClip(null);
stack.setOnMouseClicked(e -> openPopup(cardList));
myHand.getChildren().add(stack);
}
myHand.getChildren().add(artists);
// Gatherers
Pane gatherers=new Pane();
gatherers.prefHeightProperty().bind(myHand.heightProperty());
gatherers.prefWidthProperty().bind(
gatherers.heightProperty().multiply(0.63).add((model.getPlayerByUsername(username).gatherers.size() - 1) * 50)
);
for (int j=0;j<model.getPlayerByUsername(username).gatherers.size();j++) {
TribeCard card=model.getPlayerByUsername(username).gatherers.get(j);
Image tribeImg = new Image(getClass().getResourceAsStream("/GUIImages/Fronts/card-" + card.getIdIMG() + ".png"));
ImageView view = new ImageView(tribeImg);
view.fitHeightProperty().bind(artists.heightProperty().subtract(10));
view.setPreserveRatio(true);
view.setLayoutX((model.getPlayerByUsername(username).gatherers.size() -j ) * 50); // solo X cambia
view.setLayoutY(5);
gatherers.getChildren().addLast(view);
i++;
}
myHand.getChildren().add(gatherers);
// Inventors
Pane inventors=new Pane();
inventors.prefHeightProperty().bind(myHand.heightProperty());
for (int j=0;j<model.getPlayerByUsername(username).inventors.size();j++) {
TribeCard card=model.getPlayerByUsername(username).inventors.get(j);
Image tribeImg = new Image(getClass().getResourceAsStream("/GUIImages/Fronts/card-" + card.getIdIMG() + ".png"));
ImageView view = new ImageView(tribeImg);
view.fitHeightProperty().bind(inventors.heightProperty().subtract(10));
view.setPreserveRatio(true);
view.setLayoutX((model.getPlayerByUsername(username).inventors.size() -j )* 50); // solo X cambia
view.setLayoutY(5);
inventors.getChildren().addLast(view);
i++;
}
myHand.getChildren().add(inventors);
// Builders
Pane builders=new Pane();
builders.prefHeightProperty().bind(myHand.heightProperty());
for (int j=0;j<model.getPlayerByUsername(username).builders.size();j++) {
TribeCard card=model.getPlayerByUsername(username).builders.get(j);
Image tribeImg = new Image(getClass().getResourceAsStream("/GUIImages/Fronts/card-" + card.getIdIMG() + ".png"));
ImageView view = new ImageView(tribeImg);
view.fitHeightProperty().bind(builders.heightProperty().subtract(10));
view.setPreserveRatio(true);
view.setLayoutX((model.getPlayerByUsername(username).builders.size() -j ) * 50); // solo X cambia
view.setLayoutY(5);
builders.getChildren().addLast(view);
i++;
}
myHand.getChildren().add(builders);
// Shamans
Pane shamans=new Pane();
shamans.prefHeightProperty().bind(myHand.heightProperty());
for (int j=0;j<model.getPlayerByUsername(username).shamans.size();j++) {
TribeCard card=model.getPlayerByUsername(username).shamans.get(j);
Image tribeImg = new Image(getClass().getResourceAsStream("/GUIImages/Fronts/card-" + card.getIdIMG() + ".png"));
ImageView view = new ImageView(tribeImg);
view.fitHeightProperty().bind(shamans.heightProperty().subtract(10));
view.setPreserveRatio(true);
view.setLayoutX((model.getPlayerByUsername(username).shamans.size() -j ) * 50); // solo X cambia
view.setLayoutY(5);
shamans.getChildren().addLast(view);
i++;
}
myHand.getChildren().add(shamans);
// Hunters
Pane hunters=new Pane();
hunters.prefHeightProperty().bind(myHand.heightProperty());
for (int j=0;j<model.getPlayerByUsername(username).hunters.size();j++) {
TribeCard card=model.getPlayerByUsername(username).hunters.get(j);
Image tribeImg = new Image(getClass().getResourceAsStream("/GUIImages/Fronts/card-" + card.getIdIMG() + ".png"));
ImageView view = new ImageView(tribeImg);
view.fitHeightProperty().bind(hunters.heightProperty().subtract(10));
view.setPreserveRatio(true);
view.setLayoutX((model.getPlayerByUsername(username).hunters.size() -j )* 50); // solo X cambia
view.setLayoutY(5);
hunters.getChildren().addLast(view);
i++;
}
myHand.getChildren().add(hunters);
*/
}
private void initPopup() {
popupCards = new HBox(10);
popupCards.setAlignment(Pos.CENTER);
popupCards.setPadding(new Insets(10));
Button closeBtn = new Button("X");
closeBtn.setOnAction(e -> popup.hide());
VBox content = new VBox(10, closeBtn, popupCards);
content.setPadding(new Insets(20));
content.setStyle("-fx-background-color: #222; -fx-border-color: white; -fx-border-width: 2; -fx-border-radius: 10; -fx-background-radius: 10;");
private Pane createCardPane(List<TribeCard> cards, HBox container) {
Pane pane = new Pane();
int n = cards.size();
pane.prefHeightProperty().bind(container.heightProperty());
for (int j = 0; j < n; j++) {
TribeCard card = cards.get(j);
Image tribeImg = new Image(getClass().getResourceAsStream("/GUIImages/Fronts/card-" + card.getIdIMG() + ".png"));
ImageView view = new ImageView(tribeImg);
view.fitHeightProperty().bind(pane.heightProperty().subtract(10));
view.setPreserveRatio(true);
view.setLayoutX(j * 50);
view.setLayoutY(5);
pane.getChildren().add(view);
if (j == 0) {
view.layoutBoundsProperty().addListener(new ChangeListener<Bounds>() {
@Override
public void changed(ObservableValue<? extends Bounds> obs, Bounds old, Bounds bounds) {
if (bounds.getWidth() > 0) {
pane.setPrefWidth(bounds.getWidth() + (n - 1) * 50);
view.layoutBoundsProperty().removeListener(this);
}
}
});
}
}
return pane;
popup = new Popup();
popup.getContent().add(content);
popup.setAutoHide(true); // si chiude anche cliccando fuori
}
private void openPopup(ArrayList<? extends TribeCard> cardList) {
popupCards.getChildren().clear();
for (TribeCard card : cardList) {
ImageView img = new ImageView(new Image(getClass().getResourceAsStream(
"/GUIImages/Fronts/card-" + card.getIdIMG() + ".png")));
img.setFitHeight(200);
img.setPreserveRatio(true);
popupCards.getChildren().add(img);
}
javafx.stage.Window window = myHand.getScene().getWindow();
// Mostralo prima fuori schermo
popup.show(window, 0, 0);
// Poi centralo con le dimensioni reali
double x = window.getX() + (window.getWidth() - popup.getWidth()) / 2;
double y = window.getY() + (window.getHeight() - popup.getHeight()) / 2;
popup.setX(x);
popup.setY(y);
}
}