diff --git a/Projekte/jme-common/src/main/java/pp/dialog/DialogManager.java b/Projekte/jme-common/src/main/java/pp/dialog/DialogManager.java index f84b6e7..ab4ea16 100644 --- a/Projekte/jme-common/src/main/java/pp/dialog/DialogManager.java +++ b/Projekte/jme-common/src/main/java/pp/dialog/DialogManager.java @@ -19,6 +19,8 @@ import java.util.Deque; import static java.lang.Math.max; +import java.lang.System.Logger; + /** * Manages dialog boxes within the application, handling their display, positioning, and focus. */ @@ -28,11 +30,15 @@ public class DialogManager { */ private final SimpleApplication app; + + private final static Logger LOGGER = System.getLogger(DialogManager.class.getName()); /** * A stack to keep track of the dialogs. */ private final Deque dialogStack = new ArrayDeque<>(); + private final Deque popUpStack = new ArrayDeque<>(); + /** * Constructs a DialogManager for the specified application. * @@ -112,11 +118,45 @@ public class DialogManager { * @param dialog the dialog to open */ public void open(Dialog dialog) { + + if(dialog instanceof PopupDialog) { + popUpStack.push((PopupDialog) dialog); + processPopUps(); + } else { + showDialog(dialog); + } + + } + + private void showDialog(Dialog dialog) { dialogStack.push(dialog); + if(dialog instanceof PopupDialog) { + ((PopupDialog)dialog).show(); + } dialog.update(); app.getGuiNode().attachChild(dialog); } + private void processPopUps() { + if (popUpStack.isEmpty()) { + return; // Nothing to process + } + + // Check if a popup dialog is already on top + if (dialogStack.peek() instanceof PopupDialog) { + LOGGER.log(Logger.Level.DEBUG, "Popup dialog already on top"); + return; // Already a popup dialog on top + } else { + + // Pop the next popup from the stack and validate before showing + PopupDialog popUp = popUpStack.pop(); + + showDialog( (Dialog) popUp); + } + + } + + /** * Checks if the specified dialog is the topmost dialog in the dialog stack. * @@ -140,6 +180,8 @@ public class DialogManager { if (!dialogStack.isEmpty()) dialogStack.peek().update(); app.getGuiNode().detachChild(dialog); + + processPopUps(); } /** diff --git a/Projekte/jme-common/src/main/java/pp/dialog/PopupDialog.java b/Projekte/jme-common/src/main/java/pp/dialog/PopupDialog.java new file mode 100644 index 0000000..7bc3d63 --- /dev/null +++ b/Projekte/jme-common/src/main/java/pp/dialog/PopupDialog.java @@ -0,0 +1,5 @@ +package pp.dialog; + +public interface PopupDialog { + void show(); +} diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/BoardAppState.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/BoardAppState.java index 352eae4..e85bedb 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/BoardAppState.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/BoardAppState.java @@ -29,6 +29,8 @@ import pp.monopoly.client.gui.BobTheBuilder; import pp.monopoly.client.gui.Toolbar; import pp.monopoly.model.Board; import pp.monopoly.client.gui.FigureControl; + +import static java.lang.Math.divideExact; import static pp.util.FloatMath.TWO_PI; import static pp.util.FloatMath.cos; import static pp.util.FloatMath.sin; @@ -97,6 +99,8 @@ public class BoardAppState extends MonopolyAppState { getApp().getRootNode().detachAllChildren(); getApp().getGuiNode().detachAllChildren(); + getApp().getDialogManager().close(getApp().getDialogManager().getDialogStack().peek()); + new Toolbar(getApp()).open(); sceneNode.detachAllChildren(); setupScene(); diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/PopUpManager.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/PopUpManager.java index 53e6dfa..d16ac1e 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/PopUpManager.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/PopUpManager.java @@ -56,7 +56,7 @@ public class PopUpManager implements GameEventListener { } }); } - }, 2500); + }, 6000); } else if (event.msg().equals("Winner")) { new WinnerPopUp(app).open(); } else if (event.msg().equals("Looser")) { diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/FigureControl.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/FigureControl.java index 9c152af..ee028b6 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/FigureControl.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/FigureControl.java @@ -14,15 +14,15 @@ import pp.monopoly.model.Figure; import pp.monopoly.notification.GameEventListener; import pp.monopoly.notification.UpdatePlayerView; -import java.lang.System.Logger; -import java.lang.System.Logger.Level; +// import java.lang.System.Logger; +// import java.lang.System.Logger.Level; import java.util.LinkedList; import java.util.Queue; public class FigureControl extends AbstractControl implements GameEventListener { - private static final Logger LOGGER = System.getLogger(FigureControl.class.getName()); + // // // private static final Logger LOGGER = System.getLogger(FigureControl.class.getName()); private final Figure figure; private final Node spatial; private final MonopolyApp app; @@ -51,7 +51,7 @@ public class FigureControl extends AbstractControl implements GameEventListener return; // Warte, bis die Verzögerung abgeschlossen ist } delayTime = 0; // Verzögerung abgeschlossen - System.out.println("Delay completed. Starting animation..."); + } if (currentTarget == null && !path.isEmpty()) { @@ -74,7 +74,7 @@ public class FigureControl extends AbstractControl implements GameEventListener } - System.out.println("Next target: " + currentTarget); + } if (currentTarget != null) { @@ -96,8 +96,6 @@ public class FigureControl extends AbstractControl implements GameEventListener spatial.setLocalTranslation(currentTarget); figure.moveTo(currentTarget); // Synchronisiere die interne Position currentTarget = null; // Setze Ziel zurück - - System.out.println("Target reached."); } } } @@ -116,34 +114,34 @@ public class FigureControl extends AbstractControl implements GameEventListener } public void setPath(int startField, int endField) { - LOGGER.log(Level.TRACE, "setPath called with startField: {0} to endField {1}", startField, endField); + // LOGGER.log(Level.TRACE, "setPath called with startField: {0} to endField {1}", startField, endField); path.clear(); for (int fieldId = startField; fieldId != endField; fieldId = (fieldId + 1) % 40) { Vector3f position = figure.calculateFieldPosition(fieldId); - LOGGER.log(Level.DEBUG, "Adding postition to path: {0}", position); + // LOGGER.log(Level.DEBUG, "Adding postition to path: {0}", position); path.add(position); } Vector3f finalPosition = figure.calculateFieldPosition(endField); path.add(finalPosition); - LOGGER.log(Level.DEBUG, "Final position added to path: {0}", finalPosition); + // LOGGER.log(Level.DEBUG, "Final position added to path: {0}", finalPosition); - LOGGER.log(Level.TRACE, "Path size: {0}", path.size()); + // LOGGER.log(Level.TRACE, "Path size: {0}", path.size()); } @Override public void receivedEvent(UpdatePlayerView event) { - LOGGER.log(Level.TRACE, "receivedEvent called with event: {0}", event); + // LOGGER.log(Level.TRACE, "receivedEvent called with event: {0}", event); int newPos = app.getGameLogic().getPlayerHandler().getPlayerById(figure.getId()).getFieldID(); int currentField = figure.getCurrentFieldID(); if (currentField == newPos) { - LOGGER.log(Level.DEBUG, "No movement required. Current field: {0}, New field: {1}", currentField, newPos); + // LOGGER.log(Level.DEBUG, "No movement required. Current field: {0}, New field: {1}", currentField, newPos); return; } - LOGGER.log(Level.DEBUG, "Movement required. Current field: {0}, New field: {1}", currentField, newPos); + // LOGGER.log(Level.DEBUG, "Movement required. Current field: {0}, New field: {1}", currentField, newPos); setPath(currentField, newPos); diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/LobbyMenu.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/LobbyMenu.java index 3c5768d..8fa904c 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/LobbyMenu.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/LobbyMenu.java @@ -154,6 +154,7 @@ public class LobbyMenu extends Dialog { figures.add("Katze"); figures.add("OOP"); figures.add("Handyholster"); + figures.add("Panzer"); figureDropdown = new Selector<>(figures, "glass"); diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/Toolbar.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/Toolbar.java index 740df8c..de25d50 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/Toolbar.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/Toolbar.java @@ -99,6 +99,7 @@ public class Toolbar extends Dialog implements GameEventListener { container.setBackground(background); setupBorders(container); + setupSpacer(container); setupPlayerInfoSection(container); setupDiceSection(container); setupActionMenu(container); @@ -135,6 +136,17 @@ public class Toolbar extends Dialog implements GameEventListener { app.getGuiNode().attachChild(border); } + /** + * Adds a spacer to the specified container. + * + * @param container the container to which the spacer is added + */ + private void setupSpacer(Container container) { + Container spacer = container.addChild(new Container()); + spacer.setPreferredSize(new Vector3f(20, 10, 0)); + spacer.setBackground(null); + } + /** * Sets up the player information section of the toolbar interface. * @@ -334,8 +346,7 @@ public class Toolbar extends Dialog implements GameEventListener { endTurnButton.setIcon(icon); endTurnButton.addClickCommands(s -> ifTopDialog(() -> { - app.getGameLogic().send(new EndTurn()); - receivedEvent(new ButtonStatusEvent(false)); + handleEndTurn(); })); return endTurnButton; diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/AcceptTrade.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/AcceptTrade.java index 067cd65..37c17aa 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/AcceptTrade.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/AcceptTrade.java @@ -12,33 +12,31 @@ import com.simsilica.lemur.Label; import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.style.ElementId; import pp.dialog.Dialog; +import pp.dialog.PopupDialog; import pp.monopoly.client.MonopolyApp; +import pp.monopoly.client.gui.SettingsMenu; import pp.monopoly.message.server.TradeReply; import pp.monopoly.notification.Sound; /** - * Represents a confirmation dialog that appears when a trade is accepted . - *

- * Displays a message to the user informing them that the trade they proposed has been accepted, - * along with a confirmation button to close the dialog. - *

+ * Represents a confirmation dialog that appears when a trade is accepted. + * Displays a message to the user informing them that the trade was accepted. */ -public class AcceptTrade extends Dialog { +public class AcceptTrade extends Dialog implements PopupDialog { /** Reference to the Monopoly application instance. */ private final MonopolyApp app; /** Semi-transparent overlay background for the dialog. */ - private final Geometry overlayBackground; + private Geometry overlayBackground; /** Container for the warning message content. */ - private final Container noMoneyWarningContainer; + private Container noMoneyWarningContainer; /** Background container providing a border for the dialog. */ - private final Container backgroundContainer; - + private Container backgroundContainer; /** - * Constructs the accept trade dialog. + * Constructs the AcceptTrade dialog. * * @param app the Monopoly application instance * @param msg the trade reply message containing details about the trade @@ -47,80 +45,99 @@ public class AcceptTrade extends Dialog { super(app.getDialogManager()); this.app = app; - - // Halbtransparentes Overlay hinzufügen - overlayBackground = createOverlayBackground(); - app.getGuiNode().attachChild(overlayBackground); - - // Create the background container - backgroundContainer = new Container(); - backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background - app.getGuiNode().attachChild(backgroundContainer); - - - // Hauptcontainer für die Warnung - noMoneyWarningContainer = new Container(); - noMoneyWarningContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); - noMoneyWarningContainer.setPreferredSize(new Vector3f(550,250,10)); - - float padding = 10; // Passt den backgroundContainer an die Größe des bankruptContainers an - backgroundContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(padding, padding, 0)); - - // Titel - Label gateFieldTitle = noMoneyWarningContainer.addChild(new Label("Handel angenommen!", new ElementId("warning-title"))); - gateFieldTitle.setFontSize(48); - gateFieldTitle.setColor(ColorRGBA.Black); - - // Text, der im Popup steht - Container textContainer = noMoneyWarningContainer.addChild(new Container()); - textContainer.addChild(new Label("Du hast Spieler"+ " " + msg.getTradeHandler().getReceiver().getName() + " " + "einen Handel vorgeschlagen", new ElementId("label-Text"))); - textContainer.addChild(new Label("", new ElementId("label-Text"))); - textContainer.addChild(new Label("Der Handel wurde angenommen", new ElementId("label-Text"))); - textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); - - // Passt den textContainer an die Größe des bankruptContainers an - textContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(-250,-200,0)); - - // Beenden-Button - Button quitButton = noMoneyWarningContainer.addChild(new Button("Bestätigen", new ElementId("button"))); - quitButton.setFontSize(32); - quitButton.addClickCommands(source -> ifTopDialog(() -> { - app.getGameLogic().playSound(Sound.BUTTON); - close(); - })); - - - // Zentriere das Popup - noMoneyWarningContainer.setLocalTranslation( - (app.getCamera().getWidth() - noMoneyWarningContainer.getPreferredSize().x) / 2, - (app.getCamera().getHeight() + noMoneyWarningContainer.getPreferredSize().y) / 2, - 8 - ); - - // Zentriere das Popup - backgroundContainer.setLocalTranslation( - (app.getCamera().getWidth() - noMoneyWarningContainer.getPreferredSize().x - padding) / 2, - (app.getCamera().getHeight() + noMoneyWarningContainer.getPreferredSize().y+ padding) / 2, - 7 - ); - - app.getGuiNode().attachChild(noMoneyWarningContainer); + // Initialize GUI elements + createOverlayBackground(); + createBackgroundContainer(); + createWarningContainer(msg); } /** * Creates a semi-transparent background overlay for the dialog. - * - * @return the geometry of the overlay */ - private Geometry createOverlayBackground() { + private void createOverlayBackground() { Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight()); - Geometry overlay = new Geometry("Overlay", quad); + overlayBackground = new Geometry("Overlay", quad); Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); - material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Halbtransparent + material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Semi-transparent material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); - overlay.setMaterial(material); - overlay.setLocalTranslation(0, 0, 0); - return overlay; + overlayBackground.setMaterial(material); + overlayBackground.setLocalTranslation(0, 0, 0); + } + + /** + * Creates the background container for the dialog. + */ + private void createBackgroundContainer() { + backgroundContainer = new Container(); + backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background + } + + /** + * Creates the main warning container for the dialog. + * + * @param msg the trade reply message + */ + private void createWarningContainer(TradeReply msg) { + noMoneyWarningContainer = new Container(); + noMoneyWarningContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); + noMoneyWarningContainer.setPreferredSize(new Vector3f(550, 250, 10)); + + float padding = 10; + backgroundContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(padding, padding, 0)); + + // Title + Label title = noMoneyWarningContainer.addChild(new Label("Handel angenommen!", new ElementId("warning-title"))); + title.setFontSize(48); + title.setColor(ColorRGBA.Black); + + // Message + Container textContainer = noMoneyWarningContainer.addChild(new Container()); + textContainer.addChild(new Label("Du hast Spieler " + msg.getTradeHandler().getReceiver().getName() + " einen Handel vorgeschlagen.", new ElementId("label-Text"))); + textContainer.addChild(new Label("", new ElementId("label-Text"))); + textContainer.addChild(new Label("Der Handel wurde angenommen.", new ElementId("label-Text"))); + textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); + textContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(-250, -200, 0)); + + // Confirmation button + Button confirmButton = noMoneyWarningContainer.addChild(new Button("Bestätigen", new ElementId("button"))); + confirmButton.setFontSize(32); + confirmButton.addClickCommands(source -> ifTopDialog(() -> { + app.getGameLogic().playSound(Sound.BUTTON); + close(); + })); + } + + /** + * Centers the warning and background containers on the screen. + */ + private void centerContainers() { + float padding = 10; + + // Center main container + noMoneyWarningContainer.setLocalTranslation( + (app.getCamera().getWidth() - noMoneyWarningContainer.getPreferredSize().x) / 2, + (app.getCamera().getHeight() + noMoneyWarningContainer.getPreferredSize().y) / 2, + 8 + ); + + // Center background container with padding + backgroundContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(padding, padding, 0)); + backgroundContainer.setLocalTranslation( + (app.getCamera().getWidth() - backgroundContainer.getPreferredSize().x) / 2, + (app.getCamera().getHeight() + backgroundContainer.getPreferredSize().y) / 2, + 7 + ); + } + + /** + * Displays the dialog by attaching it to the GUI through the DialogManager. + */ + @Override + public void show() { + app.getGuiNode().attachChild(overlayBackground); + app.getGuiNode().attachChild(backgroundContainer); + app.getGuiNode().attachChild(noMoneyWarningContainer); + centerContainers(); } /** @@ -128,9 +145,9 @@ public class AcceptTrade extends Dialog { */ @Override public void close() { - app.getGuiNode().detachChild(noMoneyWarningContainer); // Entferne das Menü - app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand - app.getGuiNode().detachChild(overlayBackground); // Entferne das Overlay + app.getGuiNode().detachChild(overlayBackground); + app.getGuiNode().detachChild(backgroundContainer); + app.getGuiNode().detachChild(noMoneyWarningContainer); super.close(); } @@ -139,6 +156,6 @@ public class AcceptTrade extends Dialog { */ @Override public void escape() { - close(); + new SettingsMenu(app).open(); } -} \ No newline at end of file +} diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/Bankrupt.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/Bankrupt.java index 12eda4a..ac31bea 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/Bankrupt.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/Bankrupt.java @@ -12,24 +12,24 @@ import com.simsilica.lemur.Label; import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.style.ElementId; import pp.dialog.Dialog; +import pp.dialog.PopupDialog; import pp.monopoly.client.MonopolyApp; /** - * Bankrupt is a Warning-Popup which appears when the balance is negative at the end of a player´s turn + * Bankrupt is a Warning-Popup which appears when the balance is negative at the end of a player´s turn. */ -public class Bankrupt extends Dialog { +public class Bankrupt extends Dialog implements PopupDialog { /** Reference to the Monopoly application instance. */ private final MonopolyApp app; /** Semi-transparent overlay background for the popup. */ - private final Geometry overlayBackground; + private Geometry overlayBackground; /** Main container for the bankruptcy warning content. */ - private final Container bankruptContainer; + private Container bankruptContainer; /** Background container providing a border for the popup. */ - private final Container backgroundContainer; - + private Container backgroundContainer; /** * Constructs the bankruptcy warning popup. @@ -40,86 +40,102 @@ public class Bankrupt extends Dialog { super(app.getDialogManager()); this.app = app; - - // Halbtransparentes Overlay hinzufügen - overlayBackground = createOverlayBackground(); - app.getGuiNode().attachChild(overlayBackground); - - // Create the background container - backgroundContainer = new Container(); - backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background - app.getGuiNode().attachChild(backgroundContainer); - - - // Hauptcontainer für die Warnung - bankruptContainer = new Container(); - bankruptContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); - bankruptContainer.setPreferredSize(new Vector3f(550,250,10)); - - float padding = 10; // Passt den backgroundContainer an die Größe des bankruptContainers an - backgroundContainer.setPreferredSize(bankruptContainer.getPreferredSize().addLocal(padding, padding, 0)); - - // Titel - Label gateFieldTitle = bankruptContainer.addChild(new Label("Vorsicht !", new ElementId("warning-title"))); - gateFieldTitle.setFontSize(48); - gateFieldTitle.setColor(ColorRGBA.Black); - - // Text, der im Popup steht - Container textContainer = bankruptContainer.addChild(new Container()); - textContainer.addChild(new Label("Du hast noch einen negativen Kontostand. Wenn du jetzt deinen Zug beendest, gehst du Bankrott und verlierst das Spiel!\n"+ - "Dieses PopUp wird nicht erneut angezeigt!", new ElementId("label-Text"))); - textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); - - // Passt den textContainer an die Größe des bankruptContainers an - textContainer.setPreferredSize(bankruptContainer.getPreferredSize().addLocal(-250,-200,0)); - - // Beenden-Button - Button quitButton = bankruptContainer.addChild(new Button("Bestätigen", new ElementId("button"))); - quitButton.setFontSize(32); - quitButton.addClickCommands(source -> ifTopDialog(this::close)); - - - // Zentriere das Popup - bankruptContainer.setLocalTranslation( - (app.getCamera().getWidth() - bankruptContainer.getPreferredSize().x) / 2, - (app.getCamera().getHeight() + bankruptContainer.getPreferredSize().y) / 2, - 8 - ); - - // Zentriere das Popup - backgroundContainer.setLocalTranslation( - (app.getCamera().getWidth() - bankruptContainer.getPreferredSize().x - padding) / 2, - (app.getCamera().getHeight() + bankruptContainer.getPreferredSize().y+ padding) / 2, - 7 - ); - - app.getGuiNode().attachChild(bankruptContainer); + // Initialize the components + createOverlayBackground(); + createBackgroundContainer(); + createBankruptContainer(); } /** * Creates a semi-transparent background overlay for the popup. - * - * @return the geometry of the overlay */ - private Geometry createOverlayBackground() { + private void createOverlayBackground() { Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight()); - Geometry overlay = new Geometry("Overlay", quad); + overlayBackground = new Geometry("Overlay", quad); Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); - material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Halbtransparent + material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Semi-transparent material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); - overlay.setMaterial(material); - overlay.setLocalTranslation(0, 0, 0); - return overlay; + overlayBackground.setMaterial(material); + overlayBackground.setLocalTranslation(0, 0, 0); } /** - * Closes the menu and removes the GUI elements. + * Creates the background container for the popup. + */ + private void createBackgroundContainer() { + backgroundContainer = new Container(); + backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background + } + + /** + * Creates the main container for the bankruptcy warning content. + */ + private void createBankruptContainer() { + bankruptContainer = new Container(); + bankruptContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); + bankruptContainer.setPreferredSize(new Vector3f(550, 250, 10)); + + // Title + Label title = bankruptContainer.addChild(new Label("Vorsicht!", new ElementId("warning-title"))); + title.setFontSize(48); + title.setColor(ColorRGBA.Black); + + // Text content + Container textContainer = bankruptContainer.addChild(new Container()); + textContainer.addChild(new Label( + "Du hast einen negativen Kontostand. Wenn du jetzt deinen Zug beendest, gehst du bankrott und verlierst das Spiel!\n" + + "Dieses Pop-Up wird nicht erneut angezeigt!", + new ElementId("label-Text"))); + textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); + textContainer.setPreferredSize(bankruptContainer.getPreferredSize().addLocal(-250, -200, 0)); + + // Confirmation button + Button confirmButton = bankruptContainer.addChild(new Button("Bestätigen", new ElementId("button"))); + confirmButton.setFontSize(32); + confirmButton.addClickCommands(source -> ifTopDialog(this::close)); + } + + /** + * Centers the popup containers on the screen. + */ + private void centerContainers() { + float padding = 10; + + // Center bankrupt container + bankruptContainer.setLocalTranslation( + (app.getCamera().getWidth() - bankruptContainer.getPreferredSize().x) / 2, + (app.getCamera().getHeight() + bankruptContainer.getPreferredSize().y) / 2, + 8 + ); + + // Center background container with padding + backgroundContainer.setPreferredSize(bankruptContainer.getPreferredSize().addLocal(padding, padding, 0)); + backgroundContainer.setLocalTranslation( + (app.getCamera().getWidth() - backgroundContainer.getPreferredSize().x) / 2, + (app.getCamera().getHeight() + backgroundContainer.getPreferredSize().y) / 2, + 7 + ); + } + + /** + * Displays the popup by attaching it to the GUI. + */ + @Override + public void show() { + app.getGuiNode().attachChild(overlayBackground); + app.getGuiNode().attachChild(backgroundContainer); + app.getGuiNode().attachChild(bankruptContainer); + centerContainers(); + } + + /** + * Closes the popup and removes the associated GUI elements. */ @Override public void close() { - app.getGuiNode().detachChild(bankruptContainer); // Entferne das Menü - app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand - app.getGuiNode().detachChild(overlayBackground); // Entferne das Overlay + app.getGuiNode().detachChild(overlayBackground); + app.getGuiNode().detachChild(backgroundContainer); + app.getGuiNode().detachChild(bankruptContainer); super.close(); } @@ -130,4 +146,4 @@ public class Bankrupt extends Dialog { public void escape() { close(); } -} \ No newline at end of file +} diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/BuildingPropertyCard.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/BuildingPropertyCard.java index b16430d..e3fcc07 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/BuildingPropertyCard.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/BuildingPropertyCard.java @@ -8,6 +8,7 @@ import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.style.ElementId; import pp.dialog.Dialog; +import pp.dialog.PopupDialog; import pp.monopoly.client.MonopolyApp; import pp.monopoly.client.gui.SettingsMenu; import pp.monopoly.message.client.BuyPropertyResponse; @@ -16,16 +17,12 @@ import pp.monopoly.model.fields.BuildingProperty; import pp.monopoly.notification.Sound; /** - * BuildingPropertyCard creates the popup for field information + * BuildingPropertyCard creates a popup for displaying field information. */ -public class BuildingPropertyCard extends Dialog { - /** Reference to the Monopoly application instance. */ +public class BuildingPropertyCard extends Dialog implements PopupDialog { + private final MonopolyApp app; - - /** Main container for the building property information. */ private final Container buildingPropertyContainer; - - /** Background container providing a border for the property card. */ private final Container backgroundContainer; /** @@ -37,83 +34,116 @@ public class BuildingPropertyCard extends Dialog { super(app.getDialogManager()); this.app = app; - //Generate the corresponding field int index = app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()).getFieldID(); BuildingProperty field = (BuildingProperty) new BoardManager().getFieldAtIndex(index); - // Create the background container - backgroundContainer = new Container(); - backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background - attachChild(backgroundContainer); - - // Hauptcontainer für die Gebäudekarte + // Create the main container for the popup buildingPropertyContainer = new Container(); buildingPropertyContainer.setBackground(new QuadBackgroundComponent(field.getColor().getColor())); + addContentToContainer(buildingPropertyContainer, field); - float padding = 10; // Passt den backgroundContainer an die Größe des buildingPropertyContainer an + // Create the background container + backgroundContainer = new Container(); + backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray + + // Add padding to the background + float padding = 10f; backgroundContainer.setPreferredSize(buildingPropertyContainer.getPreferredSize().addLocal(padding, padding, 0)); - //Titel - Label settingsTitle = buildingPropertyContainer.addChild(new Label( field.getName(), new ElementId("label-Bold"))); - settingsTitle.setBackground(new QuadBackgroundComponent(field.getColor().getColor())); - settingsTitle.setFontSize(48); + // Position the containers + centerContainers(padding); + } - // Text, der auf der Karte steht - // Die Preise werden dynamisch dem BoardManager entnommen - Container propertyValuesContainer = buildingPropertyContainer.addChild(new Container()); - propertyValuesContainer.addChild(new Label("„Grundstückswert: " + field.getPrice() + " EUR", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile - propertyValuesContainer.addChild(new Label("„Miete allein: " + field.getAllRent().get(0)+ " EUR", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("„-mit 1 Haus: " + field.getAllRent().get(1) + " EUR", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("„-mit 2 Häuser: " + field.getAllRent().get(2) + " EUR", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("„-mit 3 Häuser: " + field.getAllRent().get(3) + " EUR", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("„-mit 4 Häuser: " + field.getAllRent().get(4) + " EUR", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("„-mit 1 Hotel: " + field.getAllRent().get(5) + " EUR", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("„-1 Haus kostet: " + field.getHousePrice()+ " EUR", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile - propertyValuesContainer.addChild(new Label("„Hypothek: " + field.getHypo() + " EUR", new ElementId("label-Text"))); + /** + * Adds the property details and buttons to the container. + * + * @param container the main container for the property card + * @param field the building property to display + */ + private void addContentToContainer(Container container, BuildingProperty field) { + // Title + Label title = container.addChild(new Label(field.getName(), new ElementId("label-Bold"))); + title.setBackground(new QuadBackgroundComponent(field.getColor().getColor())); + title.setFontSize(48); + + // Property details + Container propertyValuesContainer = container.addChild(new Container()); + propertyValuesContainer.addChild(new Label("Grundstückswert: " + field.getPrice() + " EUR", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("Miete allein: " + field.getAllRent().get(0) + " EUR", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("- mit 1 Haus: " + field.getAllRent().get(1) + " EUR", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("- mit 2 Häusern: " + field.getAllRent().get(2) + " EUR", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("- mit 3 Häusern: " + field.getAllRent().get(3) + " EUR", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("- mit 4 Häusern: " + field.getAllRent().get(4) + " EUR", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("- mit 1 Hotel: " + field.getAllRent().get(5) + " EUR", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("1 Haus kostet: " + field.getHousePrice() + " EUR", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("Hypothek: " + field.getHypo() + " EUR", new ElementId("label-Text"))); propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); - // Beenden-Button - Button quitButton = buildingPropertyContainer.addChild(new Button("Beenden", new ElementId("button"))); + // Add buttons + addButtons(container); + } + + /** + * Adds the buttons for closing or buying the property. + * + * @param container the main container + */ + private void addButtons(Container container) { + // Quit button + Button quitButton = container.addChild(new Button("Beenden", new ElementId("button"))); quitButton.setFontSize(32); - quitButton.addClickCommands(s -> ifTopDialog( () -> { + quitButton.addClickCommands(s -> ifTopDialog(() -> { app.getGameLogic().playSound(Sound.BUTTON); close(); })); - // Kaufen-Button - Button buyButton = buildingPropertyContainer.addChild(new Button("Kaufen", new ElementId("button"))); + + // Buy button + Button buyButton = container.addChild(new Button("Kaufen", new ElementId("button"))); buyButton.setFontSize(32); - buyButton.addClickCommands(s -> ifTopDialog( () -> { + buyButton.addClickCommands(s -> ifTopDialog(() -> { app.getGameLogic().playSound(Sound.BUTTON); close(); app.getGameLogic().send(new BuyPropertyResponse()); })); + } - // Zentriere das Popup + /** + * Centers the containers on the screen. + * + * @param padding the padding size + */ + private void centerContainers(float padding) { + // Center main container buildingPropertyContainer.setLocalTranslation( (app.getCamera().getWidth() - buildingPropertyContainer.getPreferredSize().x) / 2, (app.getCamera().getHeight() + buildingPropertyContainer.getPreferredSize().y) / 2, - 16 + 8 ); - // Zentriere das Popup + // Center background container with padding backgroundContainer.setLocalTranslation( - (app.getCamera().getWidth() - buildingPropertyContainer.getPreferredSize().x - padding) / 2, - (app.getCamera().getHeight() + buildingPropertyContainer.getPreferredSize().y+ padding) / 2, - 15 + (app.getCamera().getWidth() - buildingPropertyContainer.getPreferredSize().x - padding) / 2, + (app.getCamera().getHeight() + buildingPropertyContainer.getPreferredSize().y + padding) / 2, + 7 ); + } + /** + * Attaches the popup to the GUI through the DialogManager. + */ + @Override + public void show() { + app.getGuiNode().attachChild(backgroundContainer); app.getGuiNode().attachChild(buildingPropertyContainer); } /** - * Closes the popup and removes the associated GUI elements. + * Closes the popup and removes associated GUI elements. */ @Override public void close() { - app.getGuiNode().detachChild(buildingPropertyContainer); // Entferne das Menü - app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand + app.getGuiNode().detachChild(buildingPropertyContainer); + app.getGuiNode().detachChild(backgroundContainer); super.close(); } @@ -124,4 +154,4 @@ public class BuildingPropertyCard extends Dialog { public void escape() { new SettingsMenu(app).open(); } -} \ No newline at end of file +} diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/BuyHouse.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/BuyHouse.java index 1d9bfaa..36bd553 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/BuyHouse.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/BuyHouse.java @@ -125,13 +125,13 @@ public class BuyHouse extends Dialog { buyHouseContainer.setLocalTranslation( (app.getCamera().getWidth() - buyHouseContainer.getPreferredSize().x) / 2, (app.getCamera().getHeight() + buyHouseContainer.getPreferredSize().y) / 2, - 9 + 8 ); backgroundContainer.setLocalTranslation( (app.getCamera().getWidth() - buyHouseContainer.getPreferredSize().x - padding) / 2, (app.getCamera().getHeight() + buyHouseContainer.getPreferredSize().y + padding) / 2, - 8 + 7 ); app.getGuiNode().attachChild(buyHouseContainer); diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/ConfirmTrade.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/ConfirmTrade.java index 6d6e835..123ff41 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/ConfirmTrade.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/ConfirmTrade.java @@ -7,6 +7,7 @@ import com.simsilica.lemur.Label; import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.style.ElementId; import pp.dialog.Dialog; +import pp.dialog.PopupDialog; import pp.monopoly.client.MonopolyApp; import pp.monopoly.client.gui.SettingsMenu; import pp.monopoly.client.gui.TradeMenu; @@ -18,18 +19,18 @@ import pp.monopoly.notification.Sound; /** * ConfirmTrade is a popup which appears when a trade is proposed to this certain player. */ -public class ConfirmTrade extends Dialog { +public class ConfirmTrade extends Dialog implements PopupDialog { /** Reference to the Monopoly application instance. */ private final MonopolyApp app; /** Main container for the "Confirm Trade" popup UI. */ - private final Container confirmTradeContainer; + private Container confirmTradeContainer; /** Background container providing a border for the popup. */ - private final Container backgroundContainer; + private Container backgroundContainer; /** The trade handler managing the details of the trade proposal. */ - private TradeHandler tradeHandler; + private final TradeHandler tradeHandler; /** * Constructs the "Confirm Trade" popup. @@ -39,53 +40,61 @@ public class ConfirmTrade extends Dialog { public ConfirmTrade(MonopolyApp app) { super(app.getDialogManager()); this.app = app; - tradeHandler = app.getGameLogic().getTradeHandler(); + this.tradeHandler = app.getGameLogic().getTradeHandler(); - // Create the background container + // Initialize components + createBackgroundContainer(); + createConfirmTradeContainer(); + } + + /** + * Initializes the background container. + */ + private void createBackgroundContainer() { backgroundContainer = new Container(); backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); - attachChild(backgroundContainer); + } + /** + * Initializes the main confirm trade container and its UI components. + */ + private void createConfirmTradeContainer() { confirmTradeContainer = new Container(); - float padding = 10; - backgroundContainer.setPreferredSize(confirmTradeContainer.getPreferredSize().addLocal(padding, padding, 0)); - - // Titel - Label title = confirmTradeContainer.addChild(new Label( "Handel", new ElementId("warning-title"))); + // Title + Label title = confirmTradeContainer.addChild(new Label("Handel", new ElementId("warning-title"))); title.setFontSize(48); title.setColor(ColorRGBA.Black); + // Build trade information strings StringBuilder offeredProperties = new StringBuilder(); for (PropertyField field : tradeHandler.getOfferedProperties()) { - offeredProperties.append(field.getName()); - offeredProperties.append(", "); + offeredProperties.append(field.getName()).append(", "); } StringBuilder requestedProperties = new StringBuilder(); for (PropertyField field : tradeHandler.getRequestedProperties()) { - requestedProperties.append(field.getName()); - requestedProperties.append(", "); + requestedProperties.append(field.getName()).append(", "); } - // Text, der auf der Karte steht + // Trade details Container propertyValuesContainer = confirmTradeContainer.addChild(new Container()); - propertyValuesContainer.addChild(new Label("„Spieler " + " " + tradeHandler.getSender().getName() + " " +" möchte:", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile + propertyValuesContainer.addChild(new Label("„Spieler " + tradeHandler.getSender().getName() + " möchte:", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("- " + offeredProperties, new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("- " + tradeHandler.getOfferedAmount() + " EUR", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("- " + tradeHandler.getOfferedJailCards() +" Sonderkarten", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile + propertyValuesContainer.addChild(new Label("- " + tradeHandler.getOfferedJailCards() + " Sonderkarten", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("gegen:", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile - propertyValuesContainer.addChild(new Label("- "+ requestedProperties, new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("- "+ tradeHandler.getRequestedAmount() +" EUR", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("- "+ tradeHandler.getRequestedJailCards() +" Sonderkarten", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile + propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("- " + requestedProperties, new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("- " + tradeHandler.getRequestedAmount() + " EUR", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("- " + tradeHandler.getRequestedJailCards() + " Sonderkarten", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); propertyValuesContainer.addChild(new Label("tauschen, willst du das Angebot annehmen?", new ElementId("label-Text"))); propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); - // Ablehnen-Button + // Decline button Button declineButton = confirmTradeContainer.addChild(new Button("Ablehnen", new ElementId("button"))); declineButton.setFontSize(32); declineButton.addClickCommands(s -> ifTopDialog(() -> { @@ -93,39 +102,50 @@ public class ConfirmTrade extends Dialog { app.getGameLogic().send(new TradeResponse(false, tradeHandler)); close(); })); - // Verhandeln-Button + + // Negotiate button Button negotiateButton = confirmTradeContainer.addChild(new Button("Verhandeln", new ElementId("button"))); negotiateButton.setFontSize(32); - negotiateButton.addClickCommands(s -> ifTopDialog( () -> { + negotiateButton.addClickCommands(s -> ifTopDialog(() -> { app.getGameLogic().playSound(Sound.BUTTON); close(); TradeHandler t = new TradeHandler(app.getGameLogic().getPlayerHandler().getPlayerById(tradeHandler.getSender().getId())); t.setReceiver(app.getGameLogic().getPlayerHandler().getPlayerById(tradeHandler.getReceiver().getId())); new TradeMenu(app, t).open(); })); - // Confirm-Button + + // Confirm button Button confirmButton = confirmTradeContainer.addChild(new Button("Bestätigen", new ElementId("button"))); confirmButton.setFontSize(32); - confirmButton.addClickCommands(s -> ifTopDialog( () -> { + confirmButton.addClickCommands(s -> ifTopDialog(() -> { app.getGameLogic().playSound(Sound.BUTTON); app.getGameLogic().send(new TradeResponse(true, tradeHandler)); close(); })); + } - // Zentriere das Menü + /** + * Displays the popup by attaching it to the GUI. + */ + @Override + public void show() { + float padding = 10; + + // Center and adjust sizes + backgroundContainer.setPreferredSize(confirmTradeContainer.getPreferredSize().addLocal(padding, padding, 0)); confirmTradeContainer.setLocalTranslation( - (app.getCamera().getWidth() - confirmTradeContainer.getPreferredSize().x) / 2, - (app.getCamera().getHeight() + confirmTradeContainer.getPreferredSize().y) / 2, - 8 + (app.getCamera().getWidth() - confirmTradeContainer.getPreferredSize().x) / 2, + (app.getCamera().getHeight() + confirmTradeContainer.getPreferredSize().y) / 2, + 8 ); - - // Zentriere das Menü backgroundContainer.setLocalTranslation( (app.getCamera().getWidth() - confirmTradeContainer.getPreferredSize().x - padding) / 2, - (app.getCamera().getHeight() + confirmTradeContainer.getPreferredSize().y+ padding) / 2, + (app.getCamera().getHeight() + confirmTradeContainer.getPreferredSize().y + padding) / 2, 7 ); + // Attach to GUI node + app.getGuiNode().attachChild(backgroundContainer); app.getGuiNode().attachChild(confirmTradeContainer); } diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/EventCardPopup.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/EventCardPopup.java index 7db7f63..fdcf9f8 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/EventCardPopup.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/EventCardPopup.java @@ -12,25 +12,25 @@ import com.simsilica.lemur.Label; import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.style.ElementId; import pp.dialog.Dialog; +import pp.dialog.PopupDialog; import pp.monopoly.client.MonopolyApp; import pp.monopoly.notification.Sound; /** - * EventCardPopup is a popup which appears when a certain EventCard is triggered by entering a EventCardField + * EventCardPopup is a popup which appears when a certain EventCard is triggered by entering an EventCardField. */ -public class EventCardPopup extends Dialog { +public class EventCardPopup extends Dialog implements PopupDialog { /** Reference to the Monopoly application instance. */ private final MonopolyApp app; /** Semi-transparent overlay background for the popup. */ - private final Geometry overlayBackground; + private Geometry overlayBackground; /** Main container for the event card information. */ - private final Container eventCardContainer; + private Container eventCardContainer; /** Background container providing a border for the popup. */ - private final Container backgroundContainer; - + private Container backgroundContainer; /** * Constructs the EventCardPopup to display the details of a triggered event card. @@ -42,74 +42,87 @@ public class EventCardPopup extends Dialog { super(app.getDialogManager()); this.app = app; - // Halbtransparentes Overlay hinzufügen - overlayBackground = createOverlayBackground(); - app.getGuiNode().attachChild(overlayBackground); - - // Create the background container - backgroundContainer = new Container(); - backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background - app.getGuiNode().attachChild(backgroundContainer); - - - eventCardContainer = new Container(); - eventCardContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); - eventCardContainer.setPreferredSize(new Vector3f(550,400,10)); - - float padding = 10; - backgroundContainer.setPreferredSize(eventCardContainer.getPreferredSize().addLocal(padding, padding, 0)); - - // Titel - Label gateFieldTitle = eventCardContainer.addChild(new Label("Ereigniskarte", new ElementId("settings-title"))); - gateFieldTitle.setFontSize(48); - gateFieldTitle.setColor(ColorRGBA.Black); - - // Text, der auf der Karte steht - // Die Erklärungsfelder werden automatisch den descriptions der Message entnommen - Container propertyValuesContainer = eventCardContainer.addChild(new Container()); - propertyValuesContainer.addChild(new Label(description, new ElementId("label-Text"))); - propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); - propertyValuesContainer.setPreferredSize(new Vector3f(300,200,0)); - - // Beenden-Button - Button quitButton = eventCardContainer.addChild(new Button("Jawohl", new ElementId("button"))); - quitButton.setFontSize(32); - quitButton.addClickCommands(source -> ifTopDialog( () -> { - app.getGameLogic().playSound(Sound.BUTTON); - close(); - })); - - // Zentriere das Popup - eventCardContainer.setLocalTranslation( - (app.getCamera().getWidth() - eventCardContainer.getPreferredSize().x) / 2, - (app.getCamera().getHeight() + eventCardContainer.getPreferredSize().y) / 2, - 10 - ); - - // Zentriere das Popup - backgroundContainer.setLocalTranslation( - (app.getCamera().getWidth() - eventCardContainer.getPreferredSize().x - padding) / 2, - (app.getCamera().getHeight() + eventCardContainer.getPreferredSize().y+ padding) / 2, - 9 - ); - - app.getGuiNode().attachChild(eventCardContainer); + // Initialize the UI components + createOverlayBackground(); + createBackgroundContainer(); + createEventCardContainer(description); } /** - * Creates a semi-transparent background overlay for the popup. - * - * @return the geometry of the overlay + * Initializes the semi-transparent background overlay. */ - private Geometry createOverlayBackground() { + private void createOverlayBackground() { Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight()); - Geometry overlay = new Geometry("Overlay", quad); + overlayBackground = new Geometry("Overlay", quad); Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); - material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); + material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Semi-transparent black material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); - overlay.setMaterial(material); - overlay.setLocalTranslation(0, 0, 0); - return overlay; + overlayBackground.setMaterial(material); + overlayBackground.setLocalTranslation(0, 0, 0); + } + + /** + * Initializes the background container. + */ + private void createBackgroundContainer() { + backgroundContainer = new Container(); + backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background + } + + /** + * Initializes the main event card container and its UI components. + * + * @param description the description of the triggered event card + */ + private void createEventCardContainer(String description) { + eventCardContainer = new Container(); + eventCardContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); + eventCardContainer.setPreferredSize(new Vector3f(550, 400, 10)); + + // Title + Label title = eventCardContainer.addChild(new Label("Ereigniskarte", new ElementId("settings-title"))); + title.setFontSize(48); + title.setColor(ColorRGBA.Black); + + // Event description + Container textContainer = eventCardContainer.addChild(new Container()); + textContainer.addChild(new Label(description, new ElementId("label-Text"))); + textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); + textContainer.setPreferredSize(new Vector3f(300, 200, 0)); + + // Confirm button + Button confirmButton = eventCardContainer.addChild(new Button("Jawohl", new ElementId("button"))); + confirmButton.setFontSize(32); + confirmButton.addClickCommands(source -> ifTopDialog(() -> { + app.getGameLogic().playSound(Sound.BUTTON); + close(); + })); + } + + /** + * Displays the popup by attaching it to the GUI. + */ + @Override + public void show() { + float padding = 10; + + // Adjust sizes and center elements + backgroundContainer.setPreferredSize(eventCardContainer.getPreferredSize().addLocal(padding, padding, 0)); + eventCardContainer.setLocalTranslation( + (app.getCamera().getWidth() - eventCardContainer.getPreferredSize().x) / 2, + (app.getCamera().getHeight() + eventCardContainer.getPreferredSize().y) / 2, + 8 + ); + backgroundContainer.setLocalTranslation( + (app.getCamera().getWidth() - eventCardContainer.getPreferredSize().x - padding) / 2, + (app.getCamera().getHeight() + eventCardContainer.getPreferredSize().y + padding) / 2, + 7 + ); + + // Attach components to the GUI + app.getGuiNode().attachChild(overlayBackground); + app.getGuiNode().attachChild(backgroundContainer); + app.getGuiNode().attachChild(eventCardContainer); } /** @@ -117,9 +130,9 @@ public class EventCardPopup extends Dialog { */ @Override public void close() { + app.getGuiNode().detachChild(overlayBackground); app.getGuiNode().detachChild(eventCardContainer); app.getGuiNode().detachChild(backgroundContainer); - app.getGuiNode().detachChild(overlayBackground); super.close(); } @@ -130,4 +143,4 @@ public class EventCardPopup extends Dialog { public void escape() { close(); } -} \ No newline at end of file +} diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/FoodFieldCard.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/FoodFieldCard.java index c84e967..64c2d64 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/FoodFieldCard.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/FoodFieldCard.java @@ -12,27 +12,27 @@ import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.style.ElementId; import pp.dialog.Dialog; +import pp.dialog.PopupDialog; import pp.monopoly.client.MonopolyApp; -import pp.monopoly.client.gui.SettingsMenu; import pp.monopoly.message.client.BuyPropertyResponse; import pp.monopoly.model.fields.FoodField; import pp.monopoly.notification.Sound; /** - * FoodFieldCard creates the popup for field information + * FoodFieldCard creates the popup for field information. */ -public class FoodFieldCard extends Dialog { +public class FoodFieldCard extends Dialog implements PopupDialog { /** Reference to the Monopoly application instance. */ private final MonopolyApp app; /** Semi-transparent overlay background for the popup. */ - private final Geometry overlayBackground; + private Geometry overlayBackground; /** Main container for the food field information. */ - private final Container foodFieldContainer; + private Container foodFieldContainer; /** Background container providing a border for the popup. */ - private final Container backgroundContainer; + private Container backgroundContainer; /** * Constructs a FoodFieldCard popup displaying details about a food field. @@ -43,89 +43,103 @@ public class FoodFieldCard extends Dialog { super(app.getDialogManager()); this.app = app; + // Retrieve field information int index = app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()).getFieldID(); FoodField field = (FoodField) app.getGameLogic().getBoardManager().getFieldAtIndex(index); - overlayBackground = createOverlayBackground(); - app.getGuiNode().attachChild(overlayBackground); + // Create UI elements + createOverlayBackground(); + createBackgroundContainer(); + createFoodFieldContainer(field); + } + /** + * Initializes the semi-transparent background overlay. + */ + private void createOverlayBackground() { + Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight()); + overlayBackground = new Geometry("Overlay", quad); + Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); + material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Semi-transparent + material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); + overlayBackground.setMaterial(material); + overlayBackground.setLocalTranslation(0, 0, 0); + } + + /** + * Initializes the background container. + */ + private void createBackgroundContainer() { backgroundContainer = new Container(); - backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background - attachChild(backgroundContainer); + backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background + } + /** + * Initializes the main food field container and its UI components. + * + * @param field the food field information to display + */ + private void createFoodFieldContainer(FoodField field) { foodFieldContainer = new Container(); foodFieldContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.1f, 0.1f, 0.1f, 0.9f))); - float padding = 10; - backgroundContainer.setPreferredSize(foodFieldContainer.getPreferredSize().addLocal(padding, padding, 0)); - - Label settingsTitle = foodFieldContainer.addChild(new Label(field.getName(), new ElementId("label-Bold"))); - settingsTitle.setFontSize(48); - settingsTitle.setColor(ColorRGBA.White); + // Title + Label title = foodFieldContainer.addChild(new Label(field.getName(), new ElementId("label-Bold"))); + title.setFontSize(48); + title.setColor(ColorRGBA.White); + // Field details Container propertyValuesContainer = foodFieldContainer.addChild(new Container()); propertyValuesContainer.addChild(new Label("„Preis: " + field.getPrice() + " EUR", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Leerzeile - propertyValuesContainer.addChild(new Label("„Wenn man Besitzer des", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label(field.getName()+" ist, so ist die", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("Miete 40-mal so hoch, wie", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("Augen auf den zwei Würfeln sind.", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Leerzeile - propertyValuesContainer.addChild(new Label("„Wenn man Besitzer beider", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("Restaurants ist, so ist die", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("Miete 100-mal so hoch, wie", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("Augen auf den zwei Würfeln sind.", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Leerzeile + propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Empty line + propertyValuesContainer.addChild(new Label("„Miete: 40x Würfel-Augen, wenn Besitzer eines Restaurants.", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("„Miete: 100x Würfel-Augen, wenn Besitzer beider Restaurants.", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Empty line propertyValuesContainer.addChild(new Label("„Hypothek: " + field.getHypo() + " EUR", new ElementId("label-Text"))); propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); - // Beenden-Button + // Quit button Button quitButton = foodFieldContainer.addChild(new Button("Beenden", new ElementId("button"))); quitButton.setFontSize(32); - quitButton.addClickCommands(s -> ifTopDialog( () -> { + quitButton.addClickCommands(s -> ifTopDialog(() -> { app.getGameLogic().playSound(Sound.BUTTON); close(); })); - // Kaufen-Button + + // Buy button Button buyButton = foodFieldContainer.addChild(new Button("Kaufen", new ElementId("button"))); buyButton.setFontSize(32); - buyButton.addClickCommands(s -> ifTopDialog( () -> { + buyButton.addClickCommands(s -> ifTopDialog(() -> { app.getGameLogic().playSound(Sound.BUTTON); app.getGameLogic().send(new BuyPropertyResponse()); close(); })); - - // Zentriere das Popup - foodFieldContainer.setLocalTranslation( - (app.getCamera().getWidth() - foodFieldContainer.getPreferredSize().x) / 2, - (app.getCamera().getHeight() + foodFieldContainer.getPreferredSize().y) / 2, - 8 - ); - - // Zentriere das Popup - backgroundContainer.setLocalTranslation( - (app.getCamera().getWidth() - foodFieldContainer.getPreferredSize().x - padding) / 2, - (app.getCamera().getHeight() + foodFieldContainer.getPreferredSize().y+ padding) / 2, - 7 - ); - - app.getGuiNode().attachChild(foodFieldContainer); } /** - * Creates a semi-transparent background overlay for the popup. - * - * @return the geometry of the overlay + * Displays the popup by attaching its elements to the GUI. */ - private Geometry createOverlayBackground() { - Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight()); - Geometry overlay = new Geometry("Overlay", quad); - Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); - material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Halbtransparent - material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); - overlay.setMaterial(material); - overlay.setLocalTranslation(0, 0, 0); - return overlay; + @Override + public void show() { + float padding = 10; + + // Adjust sizes and center elements + backgroundContainer.setPreferredSize(foodFieldContainer.getPreferredSize().addLocal(padding, padding, 0)); + foodFieldContainer.setLocalTranslation( + (app.getCamera().getWidth() - foodFieldContainer.getPreferredSize().x) / 2, + (app.getCamera().getHeight() + foodFieldContainer.getPreferredSize().y) / 2, + 8 + ); + backgroundContainer.setLocalTranslation( + (app.getCamera().getWidth() - foodFieldContainer.getPreferredSize().x - padding) / 2, + (app.getCamera().getHeight() + foodFieldContainer.getPreferredSize().y + padding) / 2, + 7 + ); + + // Attach components to the GUI + app.getGuiNode().attachChild(overlayBackground); + app.getGuiNode().attachChild(backgroundContainer); + app.getGuiNode().attachChild(foodFieldContainer); } /** @@ -133,18 +147,17 @@ public class FoodFieldCard extends Dialog { */ @Override public void close() { - app.getGuiNode().detachChild(foodFieldContainer); // Entferne das Menü - app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand - app.getGuiNode().detachChild(overlayBackground); // Entferne das Overlay + app.getGuiNode().detachChild(overlayBackground); + app.getGuiNode().detachChild(foodFieldContainer); + app.getGuiNode().detachChild(backgroundContainer); super.close(); } /** - * Opens the settings menu when the escape key is pressed. + * Handles the escape key action by closing the popup. */ @Override public void escape() { - new SettingsMenu(app).open(); + close(); } - } diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/GateFieldCard.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/GateFieldCard.java index 6a4400f..2a27ee7 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/GateFieldCard.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/GateFieldCard.java @@ -6,7 +6,9 @@ import com.simsilica.lemur.Container; import com.simsilica.lemur.Label; import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.style.ElementId; + import pp.dialog.Dialog; +import pp.dialog.PopupDialog; import pp.monopoly.client.MonopolyApp; import pp.monopoly.client.gui.SettingsMenu; import pp.monopoly.message.client.BuyPropertyResponse; @@ -14,17 +16,17 @@ import pp.monopoly.model.fields.GateField; import pp.monopoly.notification.Sound; /** - * GateFieldCard creates the popup for field information + * GateFieldCard creates the popup for field information. */ -public class GateFieldCard extends Dialog { +public class GateFieldCard extends Dialog implements PopupDialog { /** Reference to the Monopoly application instance. */ private final MonopolyApp app; /** Main container for the gate field information. */ - private final Container gateFieldContainer; + private Container gateFieldContainer; /** Background container providing a border for the popup. */ - private final Container backgroundContainer; + private Container backgroundContainer; /** * Constructs a GateFieldCard popup displaying details about a gate field. @@ -35,73 +37,89 @@ public class GateFieldCard extends Dialog { super(app.getDialogManager()); this.app = app; - //Generate the corresponfing field + // Generate the corresponding field int index = app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()).getFieldID(); GateField field = (GateField) app.getGameLogic().getBoardManager().getFieldAtIndex(index); - // Create the background container - backgroundContainer = new Container(); - backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background - attachChild(backgroundContainer); + // Initialize UI elements + createBackgroundContainer(); + createGateFieldContainer(field); + } - // Hauptcontainer für die Gebäudekarte + /** + * Initializes the background container. + */ + private void createBackgroundContainer() { + backgroundContainer = new Container(); + backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background + } + + /** + * Initializes the main gate field container and its UI components. + * + * @param field the gate field information to display + */ + private void createGateFieldContainer(GateField field) { gateFieldContainer = new Container(); gateFieldContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); - float padding = 10; // Passt den backgroundContainer an die Größe des gateFieldContainers an - backgroundContainer.setPreferredSize(gateFieldContainer.getPreferredSize().addLocal(padding, padding, 0)); - - // Titel, bestehend aus dynamischen Namen anhand der ID und der Schriftfarbe/größe + // Title Label gateFieldTitle = gateFieldContainer.addChild(new Label(field.getName(), new ElementId("label-Bold"))); gateFieldTitle.setFontSize(48); gateFieldTitle.setColor(ColorRGBA.Black); - // Text, der auf der Karte steht - // Die Preise werden dynamisch dem BoardManager entnommen + // Field details Container propertyValuesContainer = gateFieldContainer.addChild(new Container()); propertyValuesContainer.addChild(new Label("„Preis: " + field.getPrice() + " EUR", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Empty line propertyValuesContainer.addChild(new Label("Miete: 250 EUR", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("Wenn man", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("2 Bahnhof besitzt: 500 EUR", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("Wenn man", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("3 Bahnhof besitzt: 1000 EUR", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("Wenn man", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("4 Bahnhof besitzt: 2000 EUR", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("Wenn man 2 Bahnhöfe besitzt: 500 EUR", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("Wenn man 3 Bahnhöfe besitzt: 1000 EUR", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("Wenn man 4 Bahnhöfe besitzt: 2000 EUR", new ElementId("label-Text"))); + propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Empty line propertyValuesContainer.addChild(new Label("„Hypothek: " + field.getHypo() + " EUR", new ElementId("label-Text"))); propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); - // Beenden-Button + // Quit button Button quitButton = gateFieldContainer.addChild(new Button("Beenden", new ElementId("button"))); quitButton.setFontSize(32); - quitButton.addClickCommands(s -> ifTopDialog( () -> { + quitButton.addClickCommands(s -> ifTopDialog(() -> { app.getGameLogic().playSound(Sound.BUTTON); close(); })); - // Kaufen-Button + + // Buy button Button buyButton = gateFieldContainer.addChild(new Button("Kaufen", new ElementId("button"))); buyButton.setFontSize(32); - buyButton.addClickCommands(s -> ifTopDialog( () -> { + buyButton.addClickCommands(s -> ifTopDialog(() -> { app.getGameLogic().playSound(Sound.BUTTON); app.getGameLogic().send(new BuyPropertyResponse()); close(); })); + } - // Zentriere das Popup + /** + * Displays the popup by attaching its elements to the GUI. + */ + @Override + public void show() { + float padding = 10; + + // Adjust sizes and center elements + backgroundContainer.setPreferredSize(gateFieldContainer.getPreferredSize().addLocal(padding, padding, 0)); gateFieldContainer.setLocalTranslation( (app.getCamera().getWidth() - gateFieldContainer.getPreferredSize().x) / 2, (app.getCamera().getHeight() + gateFieldContainer.getPreferredSize().y) / 2, 8 ); - - // Zentriere das Popup backgroundContainer.setLocalTranslation( (app.getCamera().getWidth() - gateFieldContainer.getPreferredSize().x - padding) / 2, - (app.getCamera().getHeight() + gateFieldContainer.getPreferredSize().y+ padding) / 2, + (app.getCamera().getHeight() + gateFieldContainer.getPreferredSize().y + padding) / 2, 7 ); + // Attach components to the GUI + app.getGuiNode().attachChild(backgroundContainer); app.getGuiNode().attachChild(gateFieldContainer); } @@ -110,8 +128,8 @@ public class GateFieldCard extends Dialog { */ @Override public void close() { - app.getGuiNode().detachChild(gateFieldContainer); // Entferne das Menü - app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand + app.getGuiNode().detachChild(gateFieldContainer); // Remove main container + app.getGuiNode().detachChild(backgroundContainer); // Remove background container super.close(); } diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/Gulag.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/Gulag.java index 554f994..f280093 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/Gulag.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/Gulag.java @@ -11,7 +11,9 @@ import com.simsilica.lemur.Container; import com.simsilica.lemur.Label; import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.style.ElementId; + import pp.dialog.Dialog; +import pp.dialog.PopupDialog; import pp.monopoly.client.MonopolyApp; import pp.monopoly.notification.Sound; @@ -21,21 +23,21 @@ import pp.monopoly.notification.Sound; * This popup informs the player that they are being sent to the Gulag and includes a confirmation button. *

*/ -public class Gulag extends Dialog { +public class Gulag extends Dialog implements PopupDialog { /** Reference to the Monopoly application instance. */ private final MonopolyApp app; /** Semi-transparent overlay background for the popup. */ - private final Geometry overlayBackground; + private Geometry overlayBackground; /** Main container for the Gulag warning message. */ - private final Container gulagContainer; + private Container gulagContainer; /** Background container providing a border for the popup. */ - private final Container backgroundContainer; + private Container backgroundContainer; /** - * Constructs the Gulag popup, displaying a warning when a player lands on the "Wache" field. + * Constructs the Gulag popup. * * @param app the Monopoly application instance */ @@ -43,71 +45,79 @@ public class Gulag extends Dialog { super(app.getDialogManager()); this.app = app; - - // Halbtransparentes Overlay hinzufügen - overlayBackground = createOverlayBackground(); - app.getGuiNode().attachChild(overlayBackground); - - // Create the background container - backgroundContainer = new Container(); - backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background - app.getGuiNode().attachChild(backgroundContainer); - - - - // Hauptcontainer für die Warnung - gulagContainer = new Container(); - gulagContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); - gulagContainer.setPreferredSize(new Vector3f(550,250,10)); - - float padding = 10; // Passt den backgroundContainer an die Größe des bankruptContainers an - backgroundContainer.setPreferredSize(gulagContainer.getPreferredSize().addLocal(padding, padding, 0)); - - // Titel - Label gateFieldTitle = gulagContainer.addChild(new Label("Du kommst ins Gulag!", new ElementId("warning-title"))); - gateFieldTitle.setFontSize(48); - gateFieldTitle.setColor(ColorRGBA.Black); - - // Beenden-Button - Button quitButton = gulagContainer.addChild(new Button("Jawohl Gulag", new ElementId("button"))); - quitButton.setFontSize(32); - quitButton.addClickCommands(source -> ifTopDialog(() -> { - app.getGameLogic().playSound(Sound.BUTTON); - close(); - })); - - - // Zentriere das Popup - gulagContainer.setLocalTranslation( - (app.getCamera().getWidth() - gulagContainer.getPreferredSize().x) / 2, - (app.getCamera().getHeight() + gulagContainer.getPreferredSize().y) / 2, - 12 - ); - - // Zentriere das Popup - backgroundContainer.setLocalTranslation( - (app.getCamera().getWidth() - gulagContainer.getPreferredSize().x - padding) / 2, - (app.getCamera().getHeight() + gulagContainer.getPreferredSize().y+ padding) / 2, - 11 - ); - - app.getGuiNode().attachChild(gulagContainer); + // Initialize UI elements + createOverlayBackground(); + createBackgroundContainer(); + createGulagContainer(); } /** - * Creates a semi-transparent overlay background for the popup. - * - * @return the geometry of the overlay + * Creates the semi-transparent overlay background for the popup. */ - private Geometry createOverlayBackground() { + private void createOverlayBackground() { Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight()); - Geometry overlay = new Geometry("Overlay", quad); + overlayBackground = new Geometry("Overlay", quad); Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); - material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Halbtransparent + material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Semi-transparent black material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); - overlay.setMaterial(material); - overlay.setLocalTranslation(0, 0, 0); - return overlay; + overlayBackground.setMaterial(material); + overlayBackground.setLocalTranslation(0, 0, 0); + } + + /** + * Creates the background container providing a border for the popup. + */ + private void createBackgroundContainer() { + backgroundContainer = new Container(); + backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background + } + + /** + * Creates the main container for the Gulag warning message. + */ + private void createGulagContainer() { + gulagContainer = new Container(); + gulagContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); + gulagContainer.setPreferredSize(new Vector3f(550, 250, 10)); + + // Title + Label title = gulagContainer.addChild(new Label("Du kommst ins Gulag!", new ElementId("warning-title"))); + title.setFontSize(48); + title.setColor(ColorRGBA.Black); + + // Confirmation Button + Button confirmButton = gulagContainer.addChild(new Button("Jawohl Gulag", new ElementId("button"))); + confirmButton.setFontSize(32); + confirmButton.addClickCommands(source -> ifTopDialog(() -> { + app.getGameLogic().playSound(Sound.BUTTON); + close(); + })); + } + + /** + * Displays the popup by attaching its elements to the GUI. + */ + @Override + public void show() { + float padding = 10; + + // Adjust and position the containers + backgroundContainer.setPreferredSize(gulagContainer.getPreferredSize().addLocal(padding, padding, 0)); + gulagContainer.setLocalTranslation( + (app.getCamera().getWidth() - gulagContainer.getPreferredSize().x) / 2, + (app.getCamera().getHeight() + gulagContainer.getPreferredSize().y) / 2, + 8 + ); + backgroundContainer.setLocalTranslation( + (app.getCamera().getWidth() - gulagContainer.getPreferredSize().x - padding) / 2, + (app.getCamera().getHeight() + gulagContainer.getPreferredSize().y + padding) / 2, + 7 + ); + + // Attach components to the GUI + app.getGuiNode().attachChild(overlayBackground); + app.getGuiNode().attachChild(backgroundContainer); + app.getGuiNode().attachChild(gulagContainer); } /** @@ -115,18 +125,17 @@ public class Gulag extends Dialog { */ @Override public void close() { - app.getGuiNode().detachChild(gulagContainer); // Entferne das Menü - app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand - app.getGuiNode().detachChild(overlayBackground); // Entferne das Overlay + app.getGuiNode().detachChild(overlayBackground); + app.getGuiNode().detachChild(gulagContainer); + app.getGuiNode().detachChild(backgroundContainer); super.close(); } /** - * Handles the escape action to close the popup. + * Handles the escape action by closing the popup. */ @Override public void escape() { close(); } - -} \ No newline at end of file +} diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/GulagInfo.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/GulagInfo.java index c1314e7..b00e84c 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/GulagInfo.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/GulagInfo.java @@ -7,112 +7,138 @@ import com.simsilica.lemur.Label; import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.style.ElementId; import pp.dialog.Dialog; +import pp.dialog.PopupDialog; import pp.monopoly.client.MonopolyApp; -import pp.monopoly.client.gui.SettingsMenu; import pp.monopoly.message.client.NotificationAnswer; import pp.monopoly.notification.Sound; /** * GulagInfo is a popup that provides options for a player who is stuck in the "Gulag" (jail) field. - *

* This dialog offers multiple actions, including paying a bribe, using a "Get Out of Jail" card, or waiting. - *

*/ -public class GulagInfo extends Dialog { +public class GulagInfo extends Dialog implements PopupDialog { /** Reference to the Monopoly application instance. */ private final MonopolyApp app; /** Main container for the Gulag information dialog. */ - private final Container gulagInfoContainer; + private Container gulagInfoContainer; /** Background container providing a styled border around the dialog. */ - private final Container backgroundContainer; + private Container backgroundContainer; /** * Constructs a GulagInfo popup that provides the player with options for getting out of the "Gulag" field. * - * @param app the Monopoly application instance + * @param app the Monopoly application instance * @param trys the number of failed attempts to roll doubles for release */ public GulagInfo(MonopolyApp app, int trys) { super(app.getDialogManager()); this.app = app; - // Create the background container + // Initialize UI components + createBackgroundContainer(); + createGulagInfoContainer(trys); + } + + /** + * Creates the background container providing a border for the dialog. + */ + private void createBackgroundContainer() { backgroundContainer = new Container(); - backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background - attachChild(backgroundContainer); + backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background + } - // Hauptcontainer für das Bestätigungspopup + /** + * Creates the main container for the Gulag information dialog. + * + * @param trys the number of failed attempts to roll doubles for release + */ + private void createGulagInfoContainer(int trys) { gulagInfoContainer = new Container(); + gulagInfoContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); - float padding = 10; // Passt den backgroundContainer an die Größe des confirmTradeContainer an - backgroundContainer.setPreferredSize(gulagInfoContainer.getPreferredSize().addLocal(padding, padding, 0)); - - // Titel - Label title = gulagInfoContainer.addChild(new Label( "Gulag", new ElementId("warning-title"))); + // Title + Label title = gulagInfoContainer.addChild(new Label("Gulag", new ElementId("warning-title"))); title.setFontSize(48); title.setColor(ColorRGBA.Black); - // Text, der auf der Karte steht - // Die Werte werden dem Handel entnommen (Iwas auch immer da dann ist) - Container propertyValuesContainer = gulagInfoContainer.addChild(new Container()); - propertyValuesContainer.addChild(new Label("„Du sitzt im Gefänginis und kommst nicht raus ...", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("Es sei denn, du ...", new ElementId("label-Text")));// Leerzeile - propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("- bestichst die Wache mit 500 EUR", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("- löst eine Gulag-Frei-Karte ein", new ElementId("label-Text"))); - propertyValuesContainer.addChild(new Label("- wartest 3 Runden und bezahlst dann", new ElementId("label-Text")));// Leerzeile - propertyValuesContainer.addChild(new Label("- oder du würfelst einen Pasch", new ElementId("label-Text"))); - propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); + // Text Description + Container textContainer = gulagInfoContainer.addChild(new Container()); + textContainer.addChild(new Label("„Du sitzt im Gefängnis und kommst nicht raus ...", new ElementId("label-Text"))); + textContainer.addChild(new Label("Es sei denn, du ...", new ElementId("label-Text"))); + textContainer.addChild(new Label("- bestichst die Wache mit 500 EUR", new ElementId("label-Text"))); + textContainer.addChild(new Label("- löst eine Gulag-Frei-Karte ein", new ElementId("label-Text"))); + textContainer.addChild(new Label("- wartest 3 Runden und bezahlst dann", new ElementId("label-Text"))); + textContainer.addChild(new Label("- oder du würfelst einen Pasch", new ElementId("label-Text"))); + textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); + // Action Buttons + addActionButtons(trys); + } - // Bezahlen-Button + /** + * Adds action buttons to the dialog. + * + * @param trys the number of failed attempts to roll doubles for release + */ + private void addActionButtons(int trys) { + // Bribe Button Button payButton = gulagInfoContainer.addChild(new Button("Bestechungsgeld bezahlen", new ElementId("button"))); payButton.setFontSize(32); - payButton.addClickCommands(s -> ifTopDialog( () -> { + payButton.addClickCommands(s -> ifTopDialog(() -> { app.getGameLogic().playSound(Sound.BUTTON); app.getGameLogic().send(new NotificationAnswer("PayJail")); close(); })); - // Ereigniskarte-Button + + // Use Jail-Free Card Button Button eventCardButton = gulagInfoContainer.addChild(new Button("Ereigniskarte nutzen", new ElementId("button"))); eventCardButton.setFontSize(32); - eventCardButton.addClickCommands(s -> ifTopDialog( () -> { + eventCardButton.addClickCommands(s -> ifTopDialog(() -> { app.getGameLogic().playSound(Sound.BUTTON); app.getGameLogic().send(new NotificationAnswer("UseJailCard")); close(); })); - // Schließen-Button + + // Close Button Button closeButton = gulagInfoContainer.addChild(new Button("Schließen", new ElementId("button"))); closeButton.setFontSize(32); - closeButton.addClickCommands(s -> ifTopDialog(() -> { - app.getGameLogic().playSound(Sound.BUTTON); - close(); - })); + closeButton.addClickCommands(s -> ifTopDialog(this::close)); - // Zentriere das Menü + // Disable options based on conditions + if (app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()).getNumJailCard() == 0) { + eventCardButton.setEnabled(false); + } + if (trys == 3) { + closeButton.setEnabled(false); + } + } + + /** + * Displays the popup by attaching its elements to the GUI. + */ + @Override + public void show() { + float padding = 10; + + // Adjust the background size + backgroundContainer.setPreferredSize(gulagInfoContainer.getPreferredSize().addLocal(padding, padding, 0)); + + // Center the dialog and background gulagInfoContainer.setLocalTranslation( (app.getCamera().getWidth() - gulagInfoContainer.getPreferredSize().x) / 2, (app.getCamera().getHeight() + gulagInfoContainer.getPreferredSize().y) / 2, - 14 + 8 ); - - // Zentriere das Menü backgroundContainer.setLocalTranslation( - (app.getCamera().getWidth() - gulagInfoContainer.getPreferredSize().x - padding) / 2, - (app.getCamera().getHeight() + gulagInfoContainer.getPreferredSize().y+ padding) / 2, - 13 + (app.getCamera().getWidth() - gulagInfoContainer.getPreferredSize().x - padding) / 2, + (app.getCamera().getHeight() + gulagInfoContainer.getPreferredSize().y + padding) / 2, + 7 ); - if(app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()).getNumJailCard() == 0) { - eventCardButton.setEnabled(false); - } - - if(trys == 3) { - closeButton.setEnabled(false); - } - + // Attach containers to the GUI + app.getGuiNode().attachChild(backgroundContainer); app.getGuiNode().attachChild(gulagInfoContainer); } @@ -121,16 +147,8 @@ public class GulagInfo extends Dialog { */ @Override public void close() { - app.getGuiNode().detachChild(gulagInfoContainer); // Entferne das Menü - app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand + app.getGuiNode().detachChild(gulagInfoContainer); // Remove dialog + app.getGuiNode().detachChild(backgroundContainer); // Remove background super.close(); } - - /** - * Handles the escape action to close the GulagInfo dialog. - */ - @Override - public void escape() { - new SettingsMenu(app).open(); - } } diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/NoMoneyWarning.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/NoMoneyWarning.java index eb28a0d..1c1547c 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/NoMoneyWarning.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/NoMoneyWarning.java @@ -12,19 +12,14 @@ import com.simsilica.lemur.Label; import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.style.ElementId; import pp.dialog.Dialog; +import pp.dialog.PopupDialog; import pp.monopoly.client.MonopolyApp; import pp.monopoly.notification.Sound; /** - * NoMoneyWarning is a warning popup that appears when a player tries to perform - * an action they cannot afford due to insufficient funds, such as attempting - * to purchase a property or building. - *

- * This dialog notifies the player of their lack of funds and provides a single - * confirmation button to close the dialog. - *

+ * NoMoneyWarning is a warning popup that informs the player they lack sufficient funds to proceed with an action. */ -public class NoMoneyWarning extends Dialog { +public class NoMoneyWarning extends Dialog implements PopupDialog { /** Reference to the Monopoly application instance. */ private final MonopolyApp app; @@ -46,66 +41,15 @@ public class NoMoneyWarning extends Dialog { super(app.getDialogManager()); this.app = app; - - // Halbtransparentes Overlay hinzufügen overlayBackground = createOverlayBackground(); - app.getGuiNode().attachChild(overlayBackground); + backgroundContainer = createBackgroundContainer(); + noMoneyWarningContainer = createNoMoneyWarningContainer(); - // Create the background container - backgroundContainer = new Container(); - backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background - app.getGuiNode().attachChild(backgroundContainer); - - - // Hauptcontainer für die Warnung - noMoneyWarningContainer = new Container(); - noMoneyWarningContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); - noMoneyWarningContainer.setPreferredSize(new Vector3f(550,250,10)); - - float padding = 10; // Passt den backgroundContainer an die Größe des bankruptContainers an - backgroundContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(padding, padding, 0)); - - // Titel - Label gateFieldTitle = noMoneyWarningContainer.addChild(new Label("Na, schon wieder Pleite?", new ElementId("warning-title"))); - gateFieldTitle.setFontSize(38); - gateFieldTitle.setColor(ColorRGBA.Black); - - // Text, der im Popup steht - Container textContainer = noMoneyWarningContainer.addChild(new Container()); - textContainer.addChild(new Label("Du hast nicht genug Geld, um dieses Gebäude zu kaufen", new ElementId("label-Text"))); - textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); - - // Passt den textContainer an die Größe des bankruptContainers an - textContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(-250,-200,0)); - - // Bestätigen-Button - Button quitButton = noMoneyWarningContainer.addChild(new Button("Bestätigen", new ElementId("button"))); - quitButton.setFontSize(32); - quitButton.addClickCommands(source -> ifTopDialog(() -> { - app.getGameLogic().playSound(Sound.BUTTON); - close(); - })); - - - // Zentriere das Popup - noMoneyWarningContainer.setLocalTranslation( - (app.getCamera().getWidth() - noMoneyWarningContainer.getPreferredSize().x) / 2, - (app.getCamera().getHeight() + noMoneyWarningContainer.getPreferredSize().y) / 2, - 8 - ); - - // Zentriere das Popup - backgroundContainer.setLocalTranslation( - (app.getCamera().getWidth() - noMoneyWarningContainer.getPreferredSize().x - padding) / 2, - (app.getCamera().getHeight() + noMoneyWarningContainer.getPreferredSize().y+ padding) / 2, - 7 - ); - - app.getGuiNode().attachChild(noMoneyWarningContainer); + adjustPaddingAndCenter(); } /** - * Creates a semi-transparent overlay background for the dialog. + * Creates the semi-transparent overlay background. * * @return The geometry representing the overlay background. */ @@ -113,7 +57,7 @@ public class NoMoneyWarning extends Dialog { Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight()); Geometry overlay = new Geometry("Overlay", quad); Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); - material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Halbtransparent + material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Semi-transparent black material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); overlay.setMaterial(material); overlay.setLocalTranslation(0, 0, 0); @@ -121,13 +65,86 @@ public class NoMoneyWarning extends Dialog { } /** - * Closes the menu and removes the GUI elements. + * Creates the background container for the dialog. + * + * @return A styled container for the dialog background. + */ + private Container createBackgroundContainer() { + Container container = new Container(); + container.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray + return container; + } + + /** + * Creates the main container for the NoMoneyWarning dialog UI. + * + * @return The container for the dialog content. + */ + private Container createNoMoneyWarningContainer() { + Container container = new Container(); + container.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); + container.setPreferredSize(new Vector3f(550, 250, 10)); + + // Title + Label title = container.addChild(new Label("Na, schon wieder Pleite?", new ElementId("warning-title"))); + title.setFontSize(38); + title.setColor(ColorRGBA.Black); + + // Warning message + Container textContainer = container.addChild(new Container()); + textContainer.addChild(new Label("Du hast nicht genug Geld, um dieses Gebäude zu kaufen", new ElementId("label-Text"))); + textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); + textContainer.setPreferredSize(container.getPreferredSize().addLocal(-250, -200, 0)); + + // Confirmation button + Button confirmButton = container.addChild(new Button("Bestätigen", new ElementId("button"))); + confirmButton.setFontSize(32); + confirmButton.addClickCommands(source -> ifTopDialog(() -> { + app.getGameLogic().playSound(Sound.BUTTON); + close(); + })); + + return container; + } + + /** + * Adjusts the padding and centers the dialog on the screen. + */ + private void adjustPaddingAndCenter() { + float padding = 10; + backgroundContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(padding, padding, 0)); + + noMoneyWarningContainer.setLocalTranslation( + (app.getCamera().getWidth() - noMoneyWarningContainer.getPreferredSize().x) / 2, + (app.getCamera().getHeight() + noMoneyWarningContainer.getPreferredSize().y) / 2, + 8 + ); + + backgroundContainer.setLocalTranslation( + (app.getCamera().getWidth() - backgroundContainer.getPreferredSize().x) / 2, + (app.getCamera().getHeight() + backgroundContainer.getPreferredSize().y) / 2, + 7 + ); + } + + /** + * Displays the dialog by attaching its components to the GUI node. + */ + @Override + public void show() { + app.getGuiNode().attachChild(overlayBackground); + app.getGuiNode().attachChild(backgroundContainer); + app.getGuiNode().attachChild(noMoneyWarningContainer); + } + + /** + * Closes the dialog and removes its components from the GUI node. */ @Override public void close() { - app.getGuiNode().detachChild(noMoneyWarningContainer); // Entferne das Menü - app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand - app.getGuiNode().detachChild(overlayBackground); // Entferne das Overlay + app.getGuiNode().detachChild(overlayBackground); + app.getGuiNode().detachChild(backgroundContainer); + app.getGuiNode().detachChild(noMoneyWarningContainer); super.close(); } @@ -138,4 +155,4 @@ public class NoMoneyWarning extends Dialog { public void escape() { close(); } -} \ No newline at end of file +} diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/ReceivedRent.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/ReceivedRent.java index bd26a29..5553c8c 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/ReceivedRent.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/ReceivedRent.java @@ -12,115 +12,95 @@ import com.simsilica.lemur.Label; import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.style.ElementId; import pp.dialog.Dialog; +import pp.dialog.PopupDialog; import pp.monopoly.client.MonopolyApp; import pp.monopoly.notification.Sound; /** - * Rent is a popup that is triggered when a player lands on a property owned by another player - * and needs to pay rent in the Monopoly application. - *

- * Displays the rent amount and the recipient player's name, with an option to confirm the payment. - *

+ * ReceivedRent is a popup that informs a player about rent they have received. */ -public class ReceivedRent extends Dialog { +public class ReceivedRent extends Dialog implements PopupDialog { + /** Reference to the Monopoly application instance. */ private final MonopolyApp app; /** Semi-transparent overlay background for the popup. */ - private final Geometry overlayBackground; + private Geometry overlayBackground; /** Main container for the rent information and action. */ - private final Container rentContainer; + private Container rentContainer; /** Background container providing a border for the rent popup. */ - private final Container backgroundContainer; + private Container backgroundContainer; /** - * Constructs the Rent popup displaying the rent amount and recipient player. + * Constructs the ReceivedRent popup displaying the rent amount and payer. * * @param app the Monopoly application instance - * @param playerName the name of the player to whom the rent is owed - * @param amount the amount of rent to be paid + * @param playerName the name of the player who paid the rent + * @param amount the amount of rent received */ public ReceivedRent(MonopolyApp app, String playerName, int amount) { super(app.getDialogManager()); this.app = app; - // Create the overlay - overlayBackground = createOverlayBackground(); - app.getGuiNode().attachChild(overlayBackground); - - // Create and position the background container - backgroundContainer = createBackgroundContainer(); - app.getGuiNode().attachChild(backgroundContainer); - - // Create and position the rent container - rentContainer = createRentContainer(playerName, amount); - app.getGuiNode().attachChild(rentContainer); - - centerContainers(); + // Initialize GUI elements + createOverlayBackground(); + createBackgroundContainer(); + createRentContainer(playerName, amount); } /** * Creates a semi-transparent overlay background. - * - * @return the overlay geometry */ - private Geometry createOverlayBackground() { + private void createOverlayBackground() { Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight()); - Geometry overlay = new Geometry("Overlay", quad); + overlayBackground = new Geometry("Overlay", quad); Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Semi-transparent black material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); - overlay.setMaterial(material); - overlay.setLocalTranslation(0, 0, 0); - return overlay; + overlayBackground.setMaterial(material); + overlayBackground.setLocalTranslation(0, 0, 0); } /** * Creates the background container with styling. - * - * @return the styled background container */ - private Container createBackgroundContainer() { - Container container = new Container(); - container.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background - return container; + private void createBackgroundContainer() { + backgroundContainer = new Container(); + backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background } /** * Creates the main rent container with title, text, and button. * - * @param playerName the name of the player to whom the rent is owed + * @param playerName the name of the player who paid the rent * @param amount the rent amount - * @return the rent container */ - private Container createRentContainer(String playerName, int amount) { - Container container = new Container(); - container.setBackground(new QuadBackgroundComponent(ColorRGBA.Gray)); - container.setPreferredSize(new Vector3f(550, 250, 10)); + private void createRentContainer(String playerName, int amount) { + rentContainer = new Container(); + rentContainer.setBackground(new QuadBackgroundComponent(ColorRGBA.Gray)); + rentContainer.setPreferredSize(new Vector3f(550, 250, 10)); // Title - Label title = container.addChild(new Label("Miete!", new ElementId("warning-title"))); + Label title = rentContainer.addChild(new Label("Miete!", new ElementId("warning-title"))); title.setFontSize(48); title.setColor(ColorRGBA.Black); // Rent message - Container textContainer = container.addChild(new Container()); - textContainer.addChild(new Label(playerName+ " zahlt dir " + amount + " EUR Miete", + Container textContainer = rentContainer.addChild(new Container()); + textContainer.addChild(new Label(playerName + " zahlt dir " + amount + " EUR Miete", new ElementId("label-Text"))); textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); - textContainer.setPreferredSize(container.getPreferredSize().addLocal(-250, -200, 0)); + textContainer.setPreferredSize(rentContainer.getPreferredSize().addLocal(-250, -200, 0)); - // Payment button - Button payButton = container.addChild(new Button("Bestätigen", new ElementId("button"))); - payButton.setFontSize(32); - payButton.addClickCommands(s -> ifTopDialog( () -> { - app.getGameLogic().playSound(Sound.BUTTON); - close(); + // Confirmation button + Button confirmButton = rentContainer.addChild(new Button("Bestätigen", new ElementId("button"))); + confirmButton.setFontSize(32); + confirmButton.addClickCommands(s -> ifTopDialog(() -> { + app.getGameLogic().playSound(Sound.BUTTON); + close(); })); - - return container; } /** @@ -145,14 +125,25 @@ public class ReceivedRent extends Dialog { ); } + /** + * Displays the popup by attaching it to the GUI through the DialogManager. + */ + @Override + public void show() { + app.getGuiNode().attachChild(overlayBackground); + app.getGuiNode().attachChild(backgroundContainer); + app.getGuiNode().attachChild(rentContainer); + centerContainers(); + } + /** * Closes the popup and removes GUI elements. */ @Override public void close() { - app.getGuiNode().detachChild(rentContainer); - app.getGuiNode().detachChild(backgroundContainer); app.getGuiNode().detachChild(overlayBackground); + app.getGuiNode().detachChild(backgroundContainer); + app.getGuiNode().detachChild(rentContainer); super.close(); } diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/RejectTrade.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/RejectTrade.java index fc98bf6..f38f9dc 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/RejectTrade.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/RejectTrade.java @@ -12,19 +12,16 @@ import com.simsilica.lemur.Label; import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.style.ElementId; import pp.dialog.Dialog; +import pp.dialog.PopupDialog; import pp.monopoly.client.MonopolyApp; import pp.monopoly.message.server.TradeReply; import pp.monopoly.notification.Sound; /** - * RejectTrade is a popup that appears when a trade proposal is rejected by another player - * in the Monopoly application. - *

- * Displays a message indicating that the proposed trade has been declined, along with - * details of the involved players and provides an option to close the popup. - *

+ * RejectTrade is a popup that appears when a trade proposal is rejected by another player. + * Displays a message indicating the rejection and provides an option to close the popup. */ -public class RejectTrade extends Dialog { +public class RejectTrade extends Dialog implements PopupDialog { /** Reference to the Monopoly application instance. */ private final MonopolyApp app; @@ -32,12 +29,11 @@ public class RejectTrade extends Dialog { private final Geometry overlayBackground; /** Main container for the rejection message content. */ - private final Container noMoneyWarningContainer; + private final Container rejectTradeContainer; /** Background container providing a border for the popup. */ private final Container backgroundContainer; - /** * Constructs the RejectTrade popup displaying the rejection of a trade proposal. * @@ -48,68 +44,15 @@ public class RejectTrade extends Dialog { super(app.getDialogManager()); this.app = app; - - // Halbtransparentes Overlay hinzufügen overlayBackground = createOverlayBackground(); - app.getGuiNode().attachChild(overlayBackground); + backgroundContainer = createBackgroundContainer(); + rejectTradeContainer = createRejectTradeContainer(msg); - // Create the background container - backgroundContainer = new Container(); - backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background - app.getGuiNode().attachChild(backgroundContainer); - - - // Hauptcontainer für die Warnung - noMoneyWarningContainer = new Container(); - noMoneyWarningContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); - noMoneyWarningContainer.setPreferredSize(new Vector3f(550,250,10)); - - float padding = 10; // Passt den backgroundContainer an die Größe des bankruptContainers an - backgroundContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(padding, padding, 0)); - - // Titel - Label gateFieldTitle = noMoneyWarningContainer.addChild(new Label("Handel abgelehnt!", new ElementId("warning-title"))); - gateFieldTitle.setFontSize(48); - gateFieldTitle.setColor(ColorRGBA.Black); - - // Text, der im Popup steht - Container textContainer = noMoneyWarningContainer.addChild(new Container()); - textContainer.addChild(new Label("Du hast Spieler"+ " " + msg.getTradeHandler().getReceiver().getName() + " " + "einen Handel vorgeschlagen", new ElementId("label-Text"))); - textContainer.addChild(new Label("", new ElementId("label-Text"))); - textContainer.addChild(new Label("Der Handel wurde abgelehnt", new ElementId("label-Text"))); - textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); - - // Passt den textContainer an die Größe des bankruptContainers an - textContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(-250,-200,0)); - - // Beenden-Button - Button quitButton = noMoneyWarningContainer.addChild(new Button("Bestätigen", new ElementId("button"))); - quitButton.setFontSize(32); - quitButton.addClickCommands(source -> ifTopDialog(() -> { - app.getGameLogic().playSound(Sound.BUTTON); - close(); - })); - - - // Zentriere das Popup - noMoneyWarningContainer.setLocalTranslation( - (app.getCamera().getWidth() - noMoneyWarningContainer.getPreferredSize().x) / 2, - (app.getCamera().getHeight() + noMoneyWarningContainer.getPreferredSize().y) / 2, - 8 - ); - - // Zentriere das Popup - backgroundContainer.setLocalTranslation( - (app.getCamera().getWidth() - noMoneyWarningContainer.getPreferredSize().x - padding) / 2, - (app.getCamera().getHeight() + noMoneyWarningContainer.getPreferredSize().y+ padding) / 2, - 7 - ); - - app.getGuiNode().attachChild(noMoneyWarningContainer); + adjustPaddingAndCenter(); } /** - * Creates a semi-transparent background overlay for the popup. + * Creates the semi-transparent background overlay for the popup. * * @return the geometry of the overlay */ @@ -117,21 +60,98 @@ public class RejectTrade extends Dialog { Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight()); Geometry overlay = new Geometry("Overlay", quad); Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); - material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Halbtransparent + material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Semi-transparent black material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); overlay.setMaterial(material); overlay.setLocalTranslation(0, 0, 0); return overlay; } + /** + * Creates the background container for the dialog. + * + * @return A styled container for the dialog background. + */ + private Container createBackgroundContainer() { + Container container = new Container(); + container.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background + return container; + } + + /** + * Creates the main container for the RejectTrade dialog UI. + * + * @param msg the trade reply message containing details about the rejected trade + * @return The container for the rejection message and action button + */ + private Container createRejectTradeContainer(TradeReply msg) { + Container container = new Container(); + container.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); + container.setPreferredSize(new Vector3f(550, 250, 10)); + + // Title + Label title = container.addChild(new Label("Handel abgelehnt!", new ElementId("warning-title"))); + title.setFontSize(48); + title.setColor(ColorRGBA.Black); + + // Rejection message + Container textContainer = container.addChild(new Container()); + textContainer.addChild(new Label("Du hast Spieler " + msg.getTradeHandler().getReceiver().getName() + + " einen Handel vorgeschlagen.", new ElementId("label-Text"))); + textContainer.addChild(new Label("", new ElementId("label-Text"))); + textContainer.addChild(new Label("Der Handel wurde abgelehnt.", new ElementId("label-Text"))); + textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); + textContainer.setPreferredSize(container.getPreferredSize().addLocal(-250, -200, 0)); + + // Confirmation button + Button confirmButton = container.addChild(new Button("Bestätigen", new ElementId("button"))); + confirmButton.setFontSize(32); + confirmButton.addClickCommands(source -> ifTopDialog(() -> { + app.getGameLogic().playSound(Sound.BUTTON); + close(); + })); + + return container; + } + + /** + * Adjusts the padding and centers the dialog on the screen. + */ + private void adjustPaddingAndCenter() { + float padding = 10; + backgroundContainer.setPreferredSize(rejectTradeContainer.getPreferredSize().addLocal(padding, padding, 0)); + + rejectTradeContainer.setLocalTranslation( + (app.getCamera().getWidth() - rejectTradeContainer.getPreferredSize().x) / 2, + (app.getCamera().getHeight() + rejectTradeContainer.getPreferredSize().y) / 2, + 8 + ); + + backgroundContainer.setLocalTranslation( + (app.getCamera().getWidth() - backgroundContainer.getPreferredSize().x) / 2, + (app.getCamera().getHeight() + backgroundContainer.getPreferredSize().y) / 2, + 7 + ); + } + + /** + * Displays the popup by attaching its elements to the GUI node. + */ + @Override + public void show() { + app.getGuiNode().attachChild(overlayBackground); + app.getGuiNode().attachChild(backgroundContainer); + app.getGuiNode().attachChild(rejectTradeContainer); + } + /** * Closes the menu and removes the GUI elements. */ @Override public void close() { - app.getGuiNode().detachChild(noMoneyWarningContainer); // Entferne das Menü - app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand - app.getGuiNode().detachChild(overlayBackground); // Entferne das Overlay + app.getGuiNode().detachChild(overlayBackground); + app.getGuiNode().detachChild(backgroundContainer); + app.getGuiNode().detachChild(rejectTradeContainer); super.close(); } @@ -142,4 +162,4 @@ public class RejectTrade extends Dialog { public void escape() { close(); } -} \ No newline at end of file +} diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/Rent.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/Rent.java index ce77774..e559f96 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/Rent.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/Rent.java @@ -12,6 +12,7 @@ import com.simsilica.lemur.Label; import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.style.ElementId; import pp.dialog.Dialog; +import pp.dialog.PopupDialog; import pp.monopoly.client.MonopolyApp; import pp.monopoly.notification.Sound; @@ -22,122 +23,77 @@ import pp.monopoly.notification.Sound; * Displays the rent amount and the recipient player's name, with an option to confirm the payment. *

*/ -public class Rent extends Dialog { - /** Reference to the Monopoly application instance. */ +public class Rent extends Dialog implements PopupDialog { private final MonopolyApp app; - /** Semi-transparent overlay background for the popup. */ private final Geometry overlayBackground; - - /** Main container for the rent information and action. */ private final Container rentContainer; - - /** Background container providing a border for the rent popup. */ private final Container backgroundContainer; - /** - * Constructs the Rent popup displaying the rent amount and recipient player. - * - * @param app the Monopoly application instance - * @param playerName the name of the player to whom the rent is owed - * @param amount the amount of rent to be paid - */ public Rent(MonopolyApp app, String playerName, int amount) { super(app.getDialogManager()); this.app = app; - // Create the overlay + // Create the overlay and containers overlayBackground = createOverlayBackground(); - app.getGuiNode().attachChild(overlayBackground); - - // Create and position the background container backgroundContainer = createBackgroundContainer(); - app.getGuiNode().attachChild(backgroundContainer); - - // Create and position the rent container rentContainer = createRentContainer(playerName, amount); - app.getGuiNode().attachChild(rentContainer); + // Center containers (positioning logic only, no GUI attachment) centerContainers(); } - /** - * Creates a semi-transparent overlay background. - * - * @return the overlay geometry - */ private Geometry createOverlayBackground() { Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight()); Geometry overlay = new Geometry("Overlay", quad); Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); - material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Semi-transparent black + material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); overlay.setMaterial(material); overlay.setLocalTranslation(0, 0, 0); return overlay; } - /** - * Creates the background container with styling. - * - * @return the styled background container - */ private Container createBackgroundContainer() { Container container = new Container(); - container.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background + container.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); return container; } - /** - * Creates the main rent container with title, text, and button. - * - * @param playerName the name of the player to whom the rent is owed - * @param amount the rent amount - * @return the rent container - */ private Container createRentContainer(String playerName, int amount) { Container container = new Container(); container.setBackground(new QuadBackgroundComponent(ColorRGBA.Gray)); container.setPreferredSize(new Vector3f(550, 250, 10)); - // Title Label title = container.addChild(new Label("Miete!", new ElementId("warning-title"))); title.setFontSize(48); title.setColor(ColorRGBA.Black); - // Rent message Container textContainer = container.addChild(new Container()); - textContainer.addChild(new Label("Du musst " + amount + " EUR Miete an " + playerName + " zahlen", + textContainer.addChild(new Label("Du musst " + amount + " EUR Miete an " + playerName + " zahlen", new ElementId("label-Text"))); textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); textContainer.setPreferredSize(container.getPreferredSize().addLocal(-250, -200, 0)); - // Payment button Button payButton = container.addChild(new Button("Überweisen", new ElementId("button"))); payButton.setFontSize(32); - payButton.addClickCommands(s -> ifTopDialog( () -> { - app.getGameLogic().playSound(Sound.BUTTON); - close(); - + payButton.addClickCommands(s -> ifTopDialog(() -> { + app.getGameLogic().playSound(Sound.BUTTON); + close(); })); return container; } - /** - * Centers the rent and background containers on the screen. - */ private void centerContainers() { float padding = 10; - // Center rent container rentContainer.setLocalTranslation( (app.getCamera().getWidth() - rentContainer.getPreferredSize().x) / 2, (app.getCamera().getHeight() + rentContainer.getPreferredSize().y) / 2, 8 ); - // Center background container with padding backgroundContainer.setPreferredSize(rentContainer.getPreferredSize().addLocal(padding, padding, 0)); backgroundContainer.setLocalTranslation( (app.getCamera().getWidth() - backgroundContainer.getPreferredSize().x) / 2, @@ -146,22 +102,25 @@ public class Rent extends Dialog { ); } - /** - * Closes the popup and removes GUI elements. - */ + @Override + public void show() { + // Attach components to GUI only when the dialog is displayed via DialogManager + app.getGuiNode().attachChild(overlayBackground); + app.getGuiNode().attachChild(backgroundContainer); + app.getGuiNode().attachChild(rentContainer); + } + @Override public void close() { - app.getGuiNode().detachChild(rentContainer); - app.getGuiNode().detachChild(backgroundContainer); app.getGuiNode().detachChild(overlayBackground); + app.getGuiNode().detachChild(backgroundContainer); + app.getGuiNode().detachChild(rentContainer); super.close(); } - /** - * Handles the escape action to close the dialog. - */ @Override public void escape() { close(); } } + diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/RepayMortage.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/RepayMortage.java index 4d933fa..0083b92 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/RepayMortage.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/RepayMortage.java @@ -128,14 +128,14 @@ public class RepayMortage extends Dialog { repayMortageContainer.setLocalTranslation( (app.getCamera().getWidth() - repayMortageContainer.getPreferredSize().x) / 2, (app.getCamera().getHeight() + repayMortageContainer.getPreferredSize().y) / 2, - 9 + 8 ); // Zentriere das Popup backgroundContainer.setLocalTranslation( (app.getCamera().getWidth() - repayMortageContainer.getPreferredSize().x - padding) / 2, (app.getCamera().getHeight() + repayMortageContainer.getPreferredSize().y+ padding) / 2, - 8 + 7 ); app.getGuiNode().attachChild(repayMortageContainer); diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/SellHouse.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/SellHouse.java index 49501e7..5cbbccb 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/SellHouse.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/SellHouse.java @@ -128,14 +128,14 @@ public class SellHouse extends Dialog { sellhouseContainer.setLocalTranslation( (app.getCamera().getWidth() - sellhouseContainer.getPreferredSize().x) / 2, (app.getCamera().getHeight() + sellhouseContainer.getPreferredSize().y) / 2, - 9 + 8 ); // Zentriere das Popup backgroundContainer.setLocalTranslation( (app.getCamera().getWidth() - sellhouseContainer.getPreferredSize().x - padding) / 2, (app.getCamera().getHeight() + sellhouseContainer.getPreferredSize().y+ padding) / 2, - 8 + 7 ); app.getGuiNode().attachChild(sellhouseContainer); diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/TakeMortage.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/TakeMortage.java index 06c9f33..b74a7e4 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/TakeMortage.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/popups/TakeMortage.java @@ -129,14 +129,14 @@ public class TakeMortage extends Dialog { takeMortageContainer.setLocalTranslation( (app.getCamera().getWidth() - takeMortageContainer.getPreferredSize().x) / 2, (app.getCamera().getHeight() + takeMortageContainer.getPreferredSize().y) / 2, - 9 + 8 ); // Zentriere das Popup backgroundContainer.setLocalTranslation( (app.getCamera().getWidth() - takeMortageContainer.getPreferredSize().x - padding) / 2, (app.getCamera().getHeight() + takeMortageContainer.getPreferredSize().y+ padding) / 2, - 8 + 7 ); app.getGuiNode().attachChild(takeMortageContainer); diff --git a/Projekte/monopoly/client/src/main/resources/models/Spielfiguren/Panzer/Material_1_baseColor.jpeg b/Projekte/monopoly/client/src/main/resources/models/Spielfiguren/Panzer/Material_1_baseColor.jpeg new file mode 100644 index 0000000..1335402 Binary files /dev/null and b/Projekte/monopoly/client/src/main/resources/models/Spielfiguren/Panzer/Material_1_baseColor.jpeg differ diff --git a/Projekte/monopoly/client/src/main/resources/models/Spielfiguren/Panzer/Material_2_baseColor.jpeg b/Projekte/monopoly/client/src/main/resources/models/Spielfiguren/Panzer/Material_2_baseColor.jpeg new file mode 100644 index 0000000..5d55eb3 Binary files /dev/null and b/Projekte/monopoly/client/src/main/resources/models/Spielfiguren/Panzer/Material_2_baseColor.jpeg differ diff --git a/Projekte/monopoly/client/src/main/resources/models/Spielfiguren/Panzer/Material_3_baseColor.jpeg b/Projekte/monopoly/client/src/main/resources/models/Spielfiguren/Panzer/Material_3_baseColor.jpeg new file mode 100644 index 0000000..c32588f Binary files /dev/null and b/Projekte/monopoly/client/src/main/resources/models/Spielfiguren/Panzer/Material_3_baseColor.jpeg differ diff --git a/Projekte/monopoly/client/src/main/resources/models/Spielfiguren/Panzer/Material_baseColor.jpeg b/Projekte/monopoly/client/src/main/resources/models/Spielfiguren/Panzer/Material_baseColor.jpeg new file mode 100644 index 0000000..59685b9 Binary files /dev/null and b/Projekte/monopoly/client/src/main/resources/models/Spielfiguren/Panzer/Material_baseColor.jpeg differ diff --git a/Projekte/monopoly/client/src/main/resources/models/Spielfiguren/Panzer/Panzer.j3o b/Projekte/monopoly/client/src/main/resources/models/Spielfiguren/Panzer/Panzer.j3o new file mode 100644 index 0000000..e7023a0 Binary files /dev/null and b/Projekte/monopoly/client/src/main/resources/models/Spielfiguren/Panzer/Panzer.j3o differ diff --git a/Projekte/monopoly/model/src/main/java/pp/monopoly/model/fields/BoardManager.java b/Projekte/monopoly/model/src/main/java/pp/monopoly/model/fields/BoardManager.java index 0caaa67..b50cfdd 100644 --- a/Projekte/monopoly/model/src/main/java/pp/monopoly/model/fields/BoardManager.java +++ b/Projekte/monopoly/model/src/main/java/pp/monopoly/model/fields/BoardManager.java @@ -54,7 +54,7 @@ public class BoardManager { fields.add(new EventField("Üvas", 22)); fields.add(new BuildingProperty("StudFBer B", 23, 2200, 180, 1500, FieldColor.RED)); fields.add(new BuildingProperty("StudFBer A", 24, 2400, 200, 1500, FieldColor.RED)); - fields.add(new GateField("Nordtor", 25)); + fields.add(new GateField("Spießtor", 25)); fields.add(new BuildingProperty("Cascada", 26, 2600, 220, 1500, FieldColor.YELLOW)); fields.add(new BuildingProperty("Fakultätsgebäude", 27, 2600, 220, 1500, FieldColor.YELLOW)); fields.add(new FoodField("Truppenküche", 28));