mirror of
https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02.git
synced 2025-01-18 22:56:15 +01:00
Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui
This commit is contained in:
commit
330e788498
@ -19,6 +19,8 @@ import java.util.Deque;
|
|||||||
|
|
||||||
import static java.lang.Math.max;
|
import static java.lang.Math.max;
|
||||||
|
|
||||||
|
import java.lang.System.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Manages dialog boxes within the application, handling their display, positioning, and focus.
|
* 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 SimpleApplication app;
|
||||||
|
|
||||||
|
|
||||||
|
private final static Logger LOGGER = System.getLogger(DialogManager.class.getName());
|
||||||
/**
|
/**
|
||||||
* A stack to keep track of the dialogs.
|
* A stack to keep track of the dialogs.
|
||||||
*/
|
*/
|
||||||
private final Deque<Dialog> dialogStack = new ArrayDeque<>();
|
private final Deque<Dialog> dialogStack = new ArrayDeque<>();
|
||||||
|
|
||||||
|
private final Deque<PopupDialog> popUpStack = new ArrayDeque<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a DialogManager for the specified application.
|
* Constructs a DialogManager for the specified application.
|
||||||
*
|
*
|
||||||
@ -112,11 +118,45 @@ public class DialogManager {
|
|||||||
* @param dialog the dialog to open
|
* @param dialog the dialog to open
|
||||||
*/
|
*/
|
||||||
public void open(Dialog dialog) {
|
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);
|
dialogStack.push(dialog);
|
||||||
|
if(dialog instanceof PopupDialog) {
|
||||||
|
((PopupDialog)dialog).show();
|
||||||
|
}
|
||||||
dialog.update();
|
dialog.update();
|
||||||
app.getGuiNode().attachChild(dialog);
|
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.
|
* Checks if the specified dialog is the topmost dialog in the dialog stack.
|
||||||
*
|
*
|
||||||
@ -140,6 +180,8 @@ public class DialogManager {
|
|||||||
if (!dialogStack.isEmpty())
|
if (!dialogStack.isEmpty())
|
||||||
dialogStack.peek().update();
|
dialogStack.peek().update();
|
||||||
app.getGuiNode().detachChild(dialog);
|
app.getGuiNode().detachChild(dialog);
|
||||||
|
|
||||||
|
processPopUps();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
package pp.dialog;
|
||||||
|
|
||||||
|
public interface PopupDialog {
|
||||||
|
void show();
|
||||||
|
}
|
@ -29,6 +29,8 @@ import pp.monopoly.client.gui.BobTheBuilder;
|
|||||||
import pp.monopoly.client.gui.Toolbar;
|
import pp.monopoly.client.gui.Toolbar;
|
||||||
import pp.monopoly.model.Board;
|
import pp.monopoly.model.Board;
|
||||||
import pp.monopoly.client.gui.FigureControl;
|
import pp.monopoly.client.gui.FigureControl;
|
||||||
|
|
||||||
|
import static java.lang.Math.divideExact;
|
||||||
import static pp.util.FloatMath.TWO_PI;
|
import static pp.util.FloatMath.TWO_PI;
|
||||||
import static pp.util.FloatMath.cos;
|
import static pp.util.FloatMath.cos;
|
||||||
import static pp.util.FloatMath.sin;
|
import static pp.util.FloatMath.sin;
|
||||||
@ -97,6 +99,8 @@ public class BoardAppState extends MonopolyAppState {
|
|||||||
getApp().getRootNode().detachAllChildren();
|
getApp().getRootNode().detachAllChildren();
|
||||||
getApp().getGuiNode().detachAllChildren();
|
getApp().getGuiNode().detachAllChildren();
|
||||||
|
|
||||||
|
getApp().getDialogManager().close(getApp().getDialogManager().getDialogStack().peek());
|
||||||
|
|
||||||
new Toolbar(getApp()).open();
|
new Toolbar(getApp()).open();
|
||||||
sceneNode.detachAllChildren();
|
sceneNode.detachAllChildren();
|
||||||
setupScene();
|
setupScene();
|
||||||
|
@ -56,7 +56,7 @@ public class PopUpManager implements GameEventListener {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, 2500);
|
}, 6000);
|
||||||
} else if (event.msg().equals("Winner")) {
|
} else if (event.msg().equals("Winner")) {
|
||||||
new WinnerPopUp(app).open();
|
new WinnerPopUp(app).open();
|
||||||
} else if (event.msg().equals("Looser")) {
|
} else if (event.msg().equals("Looser")) {
|
||||||
|
@ -14,15 +14,15 @@ import pp.monopoly.model.Figure;
|
|||||||
import pp.monopoly.notification.GameEventListener;
|
import pp.monopoly.notification.GameEventListener;
|
||||||
import pp.monopoly.notification.UpdatePlayerView;
|
import pp.monopoly.notification.UpdatePlayerView;
|
||||||
|
|
||||||
import java.lang.System.Logger;
|
// import java.lang.System.Logger;
|
||||||
import java.lang.System.Logger.Level;
|
// import java.lang.System.Logger.Level;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
|
|
||||||
|
|
||||||
public class FigureControl extends AbstractControl implements GameEventListener {
|
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 Figure figure;
|
||||||
private final Node spatial;
|
private final Node spatial;
|
||||||
private final MonopolyApp app;
|
private final MonopolyApp app;
|
||||||
@ -51,7 +51,7 @@ public class FigureControl extends AbstractControl implements GameEventListener
|
|||||||
return; // Warte, bis die Verzögerung abgeschlossen ist
|
return; // Warte, bis die Verzögerung abgeschlossen ist
|
||||||
}
|
}
|
||||||
delayTime = 0; // Verzögerung abgeschlossen
|
delayTime = 0; // Verzögerung abgeschlossen
|
||||||
System.out.println("Delay completed. Starting animation...");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentTarget == null && !path.isEmpty()) {
|
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) {
|
if (currentTarget != null) {
|
||||||
@ -96,8 +96,6 @@ public class FigureControl extends AbstractControl implements GameEventListener
|
|||||||
spatial.setLocalTranslation(currentTarget);
|
spatial.setLocalTranslation(currentTarget);
|
||||||
figure.moveTo(currentTarget); // Synchronisiere die interne Position
|
figure.moveTo(currentTarget); // Synchronisiere die interne Position
|
||||||
currentTarget = null; // Setze Ziel zurück
|
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) {
|
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();
|
path.clear();
|
||||||
for (int fieldId = startField; fieldId != endField; fieldId = (fieldId + 1) % 40) {
|
for (int fieldId = startField; fieldId != endField; fieldId = (fieldId + 1) % 40) {
|
||||||
Vector3f position = figure.calculateFieldPosition(fieldId);
|
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);
|
path.add(position);
|
||||||
}
|
}
|
||||||
Vector3f finalPosition = figure.calculateFieldPosition(endField);
|
Vector3f finalPosition = figure.calculateFieldPosition(endField);
|
||||||
path.add(finalPosition);
|
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
|
@Override
|
||||||
public void receivedEvent(UpdatePlayerView event) {
|
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 newPos = app.getGameLogic().getPlayerHandler().getPlayerById(figure.getId()).getFieldID();
|
||||||
int currentField = figure.getCurrentFieldID();
|
int currentField = figure.getCurrentFieldID();
|
||||||
|
|
||||||
if (currentField == newPos) {
|
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;
|
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);
|
setPath(currentField, newPos);
|
||||||
|
@ -154,6 +154,7 @@ public class LobbyMenu extends Dialog {
|
|||||||
figures.add("Katze");
|
figures.add("Katze");
|
||||||
figures.add("OOP");
|
figures.add("OOP");
|
||||||
figures.add("Handyholster");
|
figures.add("Handyholster");
|
||||||
|
figures.add("Panzer");
|
||||||
|
|
||||||
|
|
||||||
figureDropdown = new Selector<>(figures, "glass");
|
figureDropdown = new Selector<>(figures, "glass");
|
||||||
|
@ -99,6 +99,7 @@ public class Toolbar extends Dialog implements GameEventListener {
|
|||||||
container.setBackground(background);
|
container.setBackground(background);
|
||||||
|
|
||||||
setupBorders(container);
|
setupBorders(container);
|
||||||
|
setupSpacer(container);
|
||||||
setupPlayerInfoSection(container);
|
setupPlayerInfoSection(container);
|
||||||
setupDiceSection(container);
|
setupDiceSection(container);
|
||||||
setupActionMenu(container);
|
setupActionMenu(container);
|
||||||
@ -135,6 +136,17 @@ public class Toolbar extends Dialog implements GameEventListener {
|
|||||||
app.getGuiNode().attachChild(border);
|
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.
|
* 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.setIcon(icon);
|
||||||
|
|
||||||
endTurnButton.addClickCommands(s -> ifTopDialog(() -> {
|
endTurnButton.addClickCommands(s -> ifTopDialog(() -> {
|
||||||
app.getGameLogic().send(new EndTurn());
|
handleEndTurn();
|
||||||
receivedEvent(new ButtonStatusEvent(false));
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
return endTurnButton;
|
return endTurnButton;
|
||||||
|
@ -12,33 +12,31 @@ import com.simsilica.lemur.Label;
|
|||||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
||||||
import com.simsilica.lemur.style.ElementId;
|
import com.simsilica.lemur.style.ElementId;
|
||||||
import pp.dialog.Dialog;
|
import pp.dialog.Dialog;
|
||||||
|
import pp.dialog.PopupDialog;
|
||||||
import pp.monopoly.client.MonopolyApp;
|
import pp.monopoly.client.MonopolyApp;
|
||||||
|
import pp.monopoly.client.gui.SettingsMenu;
|
||||||
import pp.monopoly.message.server.TradeReply;
|
import pp.monopoly.message.server.TradeReply;
|
||||||
import pp.monopoly.notification.Sound;
|
import pp.monopoly.notification.Sound;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a confirmation dialog that appears when a trade is accepted .
|
* Represents a confirmation dialog that appears when a trade is accepted.
|
||||||
* <p>
|
* Displays a message to the user informing them that the trade was 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.
|
|
||||||
* </p>
|
|
||||||
*/
|
*/
|
||||||
public class AcceptTrade extends Dialog {
|
public class AcceptTrade extends Dialog implements PopupDialog {
|
||||||
/** Reference to the Monopoly application instance. */
|
/** Reference to the Monopoly application instance. */
|
||||||
private final MonopolyApp app;
|
private final MonopolyApp app;
|
||||||
|
|
||||||
/** Semi-transparent overlay background for the dialog. */
|
/** Semi-transparent overlay background for the dialog. */
|
||||||
private final Geometry overlayBackground;
|
private Geometry overlayBackground;
|
||||||
|
|
||||||
/** Container for the warning message content. */
|
/** Container for the warning message content. */
|
||||||
private final Container noMoneyWarningContainer;
|
private Container noMoneyWarningContainer;
|
||||||
|
|
||||||
/** Background container providing a border for the dialog. */
|
/** 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 app the Monopoly application instance
|
||||||
* @param msg the trade reply message containing details about the trade
|
* @param msg the trade reply message containing details about the trade
|
||||||
@ -47,80 +45,99 @@ public class AcceptTrade extends Dialog {
|
|||||||
super(app.getDialogManager());
|
super(app.getDialogManager());
|
||||||
this.app = app;
|
this.app = app;
|
||||||
|
|
||||||
|
// Initialize GUI elements
|
||||||
|
createOverlayBackground();
|
||||||
|
createBackgroundContainer();
|
||||||
|
createWarningContainer(msg);
|
||||||
|
}
|
||||||
|
|
||||||
// Halbtransparentes Overlay hinzufügen
|
/**
|
||||||
overlayBackground = createOverlayBackground();
|
* Creates a semi-transparent background overlay for the dialog.
|
||||||
app.getGuiNode().attachChild(overlayBackground);
|
*/
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
// Create the background container
|
/**
|
||||||
|
* Creates the background container for the dialog.
|
||||||
|
*/
|
||||||
|
private void createBackgroundContainer() {
|
||||||
backgroundContainer = new Container();
|
backgroundContainer = new Container();
|
||||||
backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background
|
backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background
|
||||||
app.getGuiNode().attachChild(backgroundContainer);
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
// Hauptcontainer für die Warnung
|
* Creates the main warning container for the dialog.
|
||||||
|
*
|
||||||
|
* @param msg the trade reply message
|
||||||
|
*/
|
||||||
|
private void createWarningContainer(TradeReply msg) {
|
||||||
noMoneyWarningContainer = new Container();
|
noMoneyWarningContainer = new Container();
|
||||||
noMoneyWarningContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
|
noMoneyWarningContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
|
||||||
noMoneyWarningContainer.setPreferredSize(new Vector3f(550,250,10));
|
noMoneyWarningContainer.setPreferredSize(new Vector3f(550, 250, 10));
|
||||||
|
|
||||||
float padding = 10; // Passt den backgroundContainer an die Größe des bankruptContainers an
|
float padding = 10;
|
||||||
backgroundContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(padding, padding, 0));
|
backgroundContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(padding, padding, 0));
|
||||||
|
|
||||||
// Titel
|
// Title
|
||||||
Label gateFieldTitle = noMoneyWarningContainer.addChild(new Label("Handel angenommen!", new ElementId("warning-title")));
|
Label title = noMoneyWarningContainer.addChild(new Label("Handel angenommen!", new ElementId("warning-title")));
|
||||||
gateFieldTitle.setFontSize(48);
|
title.setFontSize(48);
|
||||||
gateFieldTitle.setColor(ColorRGBA.Black);
|
title.setColor(ColorRGBA.Black);
|
||||||
|
|
||||||
// Text, der im Popup steht
|
// Message
|
||||||
Container textContainer = noMoneyWarningContainer.addChild(new Container());
|
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("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("", new ElementId("label-Text")));
|
||||||
textContainer.addChild(new Label("Der Handel wurde angenommen", 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.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
|
||||||
|
textContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(-250, -200, 0));
|
||||||
|
|
||||||
// Passt den textContainer an die Größe des bankruptContainers an
|
// Confirmation button
|
||||||
textContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(-250,-200,0));
|
Button confirmButton = noMoneyWarningContainer.addChild(new Button("Bestätigen", new ElementId("button")));
|
||||||
|
confirmButton.setFontSize(32);
|
||||||
// Beenden-Button
|
confirmButton.addClickCommands(source -> ifTopDialog(() -> {
|
||||||
Button quitButton = noMoneyWarningContainer.addChild(new Button("Bestätigen", new ElementId("button")));
|
|
||||||
quitButton.setFontSize(32);
|
|
||||||
quitButton.addClickCommands(source -> ifTopDialog(() -> {
|
|
||||||
app.getGameLogic().playSound(Sound.BUTTON);
|
app.getGameLogic().playSound(Sound.BUTTON);
|
||||||
close();
|
close();
|
||||||
}));
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Centers the warning and background containers on the screen.
|
||||||
|
*/
|
||||||
|
private void centerContainers() {
|
||||||
|
float padding = 10;
|
||||||
|
|
||||||
// Zentriere das Popup
|
// Center main container
|
||||||
noMoneyWarningContainer.setLocalTranslation(
|
noMoneyWarningContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - noMoneyWarningContainer.getPreferredSize().x) / 2,
|
(app.getCamera().getWidth() - noMoneyWarningContainer.getPreferredSize().x) / 2,
|
||||||
(app.getCamera().getHeight() + noMoneyWarningContainer.getPreferredSize().y) / 2,
|
(app.getCamera().getHeight() + noMoneyWarningContainer.getPreferredSize().y) / 2,
|
||||||
8
|
8
|
||||||
);
|
);
|
||||||
|
|
||||||
// Zentriere das Popup
|
// Center background container with padding
|
||||||
|
backgroundContainer.setPreferredSize(noMoneyWarningContainer.getPreferredSize().addLocal(padding, padding, 0));
|
||||||
backgroundContainer.setLocalTranslation(
|
backgroundContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - noMoneyWarningContainer.getPreferredSize().x - padding) / 2,
|
(app.getCamera().getWidth() - backgroundContainer.getPreferredSize().x) / 2,
|
||||||
(app.getCamera().getHeight() + noMoneyWarningContainer.getPreferredSize().y+ padding) / 2,
|
(app.getCamera().getHeight() + backgroundContainer.getPreferredSize().y) / 2,
|
||||||
7
|
7
|
||||||
);
|
);
|
||||||
|
|
||||||
app.getGuiNode().attachChild(noMoneyWarningContainer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a semi-transparent background overlay for the dialog.
|
* Displays the dialog by attaching it to the GUI through the DialogManager.
|
||||||
*
|
|
||||||
* @return the geometry of the overlay
|
|
||||||
*/
|
*/
|
||||||
private Geometry createOverlayBackground() {
|
@Override
|
||||||
Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
|
public void show() {
|
||||||
Geometry overlay = new Geometry("Overlay", quad);
|
app.getGuiNode().attachChild(overlayBackground);
|
||||||
Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
|
app.getGuiNode().attachChild(backgroundContainer);
|
||||||
material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Halbtransparent
|
app.getGuiNode().attachChild(noMoneyWarningContainer);
|
||||||
material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
|
centerContainers();
|
||||||
overlay.setMaterial(material);
|
|
||||||
overlay.setLocalTranslation(0, 0, 0);
|
|
||||||
return overlay;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -128,9 +145,9 @@ public class AcceptTrade extends Dialog {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
app.getGuiNode().detachChild(noMoneyWarningContainer); // Entferne das Menü
|
app.getGuiNode().detachChild(overlayBackground);
|
||||||
app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
|
app.getGuiNode().detachChild(backgroundContainer);
|
||||||
app.getGuiNode().detachChild(overlayBackground); // Entferne das Overlay
|
app.getGuiNode().detachChild(noMoneyWarningContainer);
|
||||||
super.close();
|
super.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,6 +156,6 @@ public class AcceptTrade extends Dialog {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void escape() {
|
public void escape() {
|
||||||
close();
|
new SettingsMenu(app).open();
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -12,24 +12,24 @@ import com.simsilica.lemur.Label;
|
|||||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
||||||
import com.simsilica.lemur.style.ElementId;
|
import com.simsilica.lemur.style.ElementId;
|
||||||
import pp.dialog.Dialog;
|
import pp.dialog.Dialog;
|
||||||
|
import pp.dialog.PopupDialog;
|
||||||
import pp.monopoly.client.MonopolyApp;
|
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. */
|
/** Reference to the Monopoly application instance. */
|
||||||
private final MonopolyApp app;
|
private final MonopolyApp app;
|
||||||
|
|
||||||
/** Semi-transparent overlay background for the popup. */
|
/** Semi-transparent overlay background for the popup. */
|
||||||
private final Geometry overlayBackground;
|
private Geometry overlayBackground;
|
||||||
|
|
||||||
/** Main container for the bankruptcy warning content. */
|
/** Main container for the bankruptcy warning content. */
|
||||||
private final Container bankruptContainer;
|
private Container bankruptContainer;
|
||||||
|
|
||||||
/** Background container providing a border for the popup. */
|
/** Background container providing a border for the popup. */
|
||||||
private final Container backgroundContainer;
|
private Container backgroundContainer;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs the bankruptcy warning popup.
|
* Constructs the bankruptcy warning popup.
|
||||||
@ -40,86 +40,102 @@ public class Bankrupt extends Dialog {
|
|||||||
super(app.getDialogManager());
|
super(app.getDialogManager());
|
||||||
this.app = app;
|
this.app = app;
|
||||||
|
|
||||||
|
// Initialize the components
|
||||||
|
createOverlayBackground();
|
||||||
|
createBackgroundContainer();
|
||||||
|
createBankruptContainer();
|
||||||
|
}
|
||||||
|
|
||||||
// Halbtransparentes Overlay hinzufügen
|
/**
|
||||||
overlayBackground = createOverlayBackground();
|
* Creates a semi-transparent background overlay for the popup.
|
||||||
app.getGuiNode().attachChild(overlayBackground);
|
*/
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
// Create the background container
|
/**
|
||||||
|
* Creates the background container for the popup.
|
||||||
|
*/
|
||||||
|
private void createBackgroundContainer() {
|
||||||
backgroundContainer = new Container();
|
backgroundContainer = new Container();
|
||||||
backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background
|
backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background
|
||||||
app.getGuiNode().attachChild(backgroundContainer);
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
// Hauptcontainer für die Warnung
|
* Creates the main container for the bankruptcy warning content.
|
||||||
|
*/
|
||||||
|
private void createBankruptContainer() {
|
||||||
bankruptContainer = new Container();
|
bankruptContainer = new Container();
|
||||||
bankruptContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
|
bankruptContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
|
||||||
bankruptContainer.setPreferredSize(new Vector3f(550,250,10));
|
bankruptContainer.setPreferredSize(new Vector3f(550, 250, 10));
|
||||||
|
|
||||||
float padding = 10; // Passt den backgroundContainer an die Größe des bankruptContainers an
|
// Title
|
||||||
backgroundContainer.setPreferredSize(bankruptContainer.getPreferredSize().addLocal(padding, padding, 0));
|
Label title = bankruptContainer.addChild(new Label("Vorsicht!", new ElementId("warning-title")));
|
||||||
|
title.setFontSize(48);
|
||||||
|
title.setColor(ColorRGBA.Black);
|
||||||
|
|
||||||
// Titel
|
// Text content
|
||||||
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());
|
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"+
|
textContainer.addChild(new Label(
|
||||||
"Dieses PopUp wird nicht erneut angezeigt!", new ElementId("label-Text")));
|
"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.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
|
||||||
|
textContainer.setPreferredSize(bankruptContainer.getPreferredSize().addLocal(-250, -200, 0));
|
||||||
|
|
||||||
// Passt den textContainer an die Größe des bankruptContainers an
|
// Confirmation button
|
||||||
textContainer.setPreferredSize(bankruptContainer.getPreferredSize().addLocal(-250,-200,0));
|
Button confirmButton = bankruptContainer.addChild(new Button("Bestätigen", new ElementId("button")));
|
||||||
|
confirmButton.setFontSize(32);
|
||||||
|
confirmButton.addClickCommands(source -> ifTopDialog(this::close));
|
||||||
|
}
|
||||||
|
|
||||||
// Beenden-Button
|
/**
|
||||||
Button quitButton = bankruptContainer.addChild(new Button("Bestätigen", new ElementId("button")));
|
* Centers the popup containers on the screen.
|
||||||
quitButton.setFontSize(32);
|
*/
|
||||||
quitButton.addClickCommands(source -> ifTopDialog(this::close));
|
private void centerContainers() {
|
||||||
|
float padding = 10;
|
||||||
|
|
||||||
|
// Center bankrupt container
|
||||||
// Zentriere das Popup
|
|
||||||
bankruptContainer.setLocalTranslation(
|
bankruptContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - bankruptContainer.getPreferredSize().x) / 2,
|
(app.getCamera().getWidth() - bankruptContainer.getPreferredSize().x) / 2,
|
||||||
(app.getCamera().getHeight() + bankruptContainer.getPreferredSize().y) / 2,
|
(app.getCamera().getHeight() + bankruptContainer.getPreferredSize().y) / 2,
|
||||||
8
|
8
|
||||||
);
|
);
|
||||||
|
|
||||||
// Zentriere das Popup
|
// Center background container with padding
|
||||||
|
backgroundContainer.setPreferredSize(bankruptContainer.getPreferredSize().addLocal(padding, padding, 0));
|
||||||
backgroundContainer.setLocalTranslation(
|
backgroundContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - bankruptContainer.getPreferredSize().x - padding) / 2,
|
(app.getCamera().getWidth() - backgroundContainer.getPreferredSize().x) / 2,
|
||||||
(app.getCamera().getHeight() + bankruptContainer.getPreferredSize().y+ padding) / 2,
|
(app.getCamera().getHeight() + backgroundContainer.getPreferredSize().y) / 2,
|
||||||
7
|
7
|
||||||
);
|
);
|
||||||
|
|
||||||
app.getGuiNode().attachChild(bankruptContainer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a semi-transparent background overlay for the popup.
|
* Displays the popup by attaching it to the GUI.
|
||||||
*
|
|
||||||
* @return the geometry of the overlay
|
|
||||||
*/
|
*/
|
||||||
private Geometry createOverlayBackground() {
|
@Override
|
||||||
Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
|
public void show() {
|
||||||
Geometry overlay = new Geometry("Overlay", quad);
|
app.getGuiNode().attachChild(overlayBackground);
|
||||||
Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
|
app.getGuiNode().attachChild(backgroundContainer);
|
||||||
material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Halbtransparent
|
app.getGuiNode().attachChild(bankruptContainer);
|
||||||
material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
|
centerContainers();
|
||||||
overlay.setMaterial(material);
|
|
||||||
overlay.setLocalTranslation(0, 0, 0);
|
|
||||||
return overlay;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Closes the menu and removes the GUI elements.
|
* Closes the popup and removes the associated GUI elements.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
app.getGuiNode().detachChild(bankruptContainer); // Entferne das Menü
|
app.getGuiNode().detachChild(overlayBackground);
|
||||||
app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
|
app.getGuiNode().detachChild(backgroundContainer);
|
||||||
app.getGuiNode().detachChild(overlayBackground); // Entferne das Overlay
|
app.getGuiNode().detachChild(bankruptContainer);
|
||||||
super.close();
|
super.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ import com.simsilica.lemur.component.QuadBackgroundComponent;
|
|||||||
import com.simsilica.lemur.style.ElementId;
|
import com.simsilica.lemur.style.ElementId;
|
||||||
|
|
||||||
import pp.dialog.Dialog;
|
import pp.dialog.Dialog;
|
||||||
|
import pp.dialog.PopupDialog;
|
||||||
import pp.monopoly.client.MonopolyApp;
|
import pp.monopoly.client.MonopolyApp;
|
||||||
import pp.monopoly.client.gui.SettingsMenu;
|
import pp.monopoly.client.gui.SettingsMenu;
|
||||||
import pp.monopoly.message.client.BuyPropertyResponse;
|
import pp.monopoly.message.client.BuyPropertyResponse;
|
||||||
@ -16,16 +17,12 @@ import pp.monopoly.model.fields.BuildingProperty;
|
|||||||
import pp.monopoly.notification.Sound;
|
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 {
|
public class BuildingPropertyCard extends Dialog implements PopupDialog {
|
||||||
/** Reference to the Monopoly application instance. */
|
|
||||||
private final MonopolyApp app;
|
private final MonopolyApp app;
|
||||||
|
|
||||||
/** Main container for the building property information. */
|
|
||||||
private final Container buildingPropertyContainer;
|
private final Container buildingPropertyContainer;
|
||||||
|
|
||||||
/** Background container providing a border for the property card. */
|
|
||||||
private final Container backgroundContainer;
|
private final Container backgroundContainer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -37,83 +34,116 @@ public class BuildingPropertyCard extends Dialog {
|
|||||||
super(app.getDialogManager());
|
super(app.getDialogManager());
|
||||||
this.app = app;
|
this.app = app;
|
||||||
|
|
||||||
//Generate the corresponding field
|
|
||||||
int index = app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()).getFieldID();
|
int index = app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()).getFieldID();
|
||||||
BuildingProperty field = (BuildingProperty) new BoardManager().getFieldAtIndex(index);
|
BuildingProperty field = (BuildingProperty) new BoardManager().getFieldAtIndex(index);
|
||||||
|
|
||||||
// Create the background container
|
// Create the main container for the popup
|
||||||
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
|
|
||||||
buildingPropertyContainer = new Container();
|
buildingPropertyContainer = new Container();
|
||||||
buildingPropertyContainer.setBackground(new QuadBackgroundComponent(field.getColor().getColor()));
|
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));
|
backgroundContainer.setPreferredSize(buildingPropertyContainer.getPreferredSize().addLocal(padding, padding, 0));
|
||||||
|
|
||||||
//Titel
|
// Position the containers
|
||||||
Label settingsTitle = buildingPropertyContainer.addChild(new Label( field.getName(), new ElementId("label-Bold")));
|
centerContainers(padding);
|
||||||
settingsTitle.setBackground(new QuadBackgroundComponent(field.getColor().getColor()));
|
}
|
||||||
settingsTitle.setFontSize(48);
|
|
||||||
|
|
||||||
// Text, der auf der Karte steht
|
/**
|
||||||
// Die Preise werden dynamisch dem BoardManager entnommen
|
* Adds the property details and buttons to the container.
|
||||||
Container propertyValuesContainer = buildingPropertyContainer.addChild(new Container());
|
*
|
||||||
propertyValuesContainer.addChild(new Label("„Grundstückswert: " + field.getPrice() + " EUR", new ElementId("label-Text")));
|
* @param container the main container for the property card
|
||||||
propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile
|
* @param field the building property to display
|
||||||
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")));
|
private void addContentToContainer(Container container, BuildingProperty field) {
|
||||||
propertyValuesContainer.addChild(new Label("„-mit 2 Häuser: " + field.getAllRent().get(2) + " EUR", new ElementId("label-Text")));
|
// Title
|
||||||
propertyValuesContainer.addChild(new Label("„-mit 3 Häuser: " + field.getAllRent().get(3) + " EUR", new ElementId("label-Text")));
|
Label title = container.addChild(new Label(field.getName(), new ElementId("label-Bold")));
|
||||||
propertyValuesContainer.addChild(new Label("„-mit 4 Häuser: " + field.getAllRent().get(4) + " EUR", new ElementId("label-Text")));
|
title.setBackground(new QuadBackgroundComponent(field.getColor().getColor()));
|
||||||
propertyValuesContainer.addChild(new Label("„-mit 1 Hotel: " + field.getAllRent().get(5) + " EUR", new ElementId("label-Text")));
|
title.setFontSize(48);
|
||||||
propertyValuesContainer.addChild(new Label("„-1 Haus kostet: " + field.getHousePrice()+ " EUR", new ElementId("label-Text")));
|
|
||||||
propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));// Leerzeile
|
// Property details
|
||||||
propertyValuesContainer.addChild(new Label("„Hypothek: " + field.getHypo() + " EUR", new ElementId("label-Text")));
|
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)));
|
propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
|
||||||
|
|
||||||
// Beenden-Button
|
// Add buttons
|
||||||
Button quitButton = buildingPropertyContainer.addChild(new Button("Beenden", new ElementId("button")));
|
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.setFontSize(32);
|
||||||
quitButton.addClickCommands(s -> ifTopDialog( () -> {
|
quitButton.addClickCommands(s -> ifTopDialog(() -> {
|
||||||
app.getGameLogic().playSound(Sound.BUTTON);
|
app.getGameLogic().playSound(Sound.BUTTON);
|
||||||
close();
|
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.setFontSize(32);
|
||||||
buyButton.addClickCommands(s -> ifTopDialog( () -> {
|
buyButton.addClickCommands(s -> ifTopDialog(() -> {
|
||||||
app.getGameLogic().playSound(Sound.BUTTON);
|
app.getGameLogic().playSound(Sound.BUTTON);
|
||||||
close();
|
close();
|
||||||
app.getGameLogic().send(new BuyPropertyResponse());
|
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(
|
buildingPropertyContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - buildingPropertyContainer.getPreferredSize().x) / 2,
|
(app.getCamera().getWidth() - buildingPropertyContainer.getPreferredSize().x) / 2,
|
||||||
(app.getCamera().getHeight() + buildingPropertyContainer.getPreferredSize().y) / 2,
|
(app.getCamera().getHeight() + buildingPropertyContainer.getPreferredSize().y) / 2,
|
||||||
16
|
8
|
||||||
);
|
);
|
||||||
|
|
||||||
// Zentriere das Popup
|
// Center background container with padding
|
||||||
backgroundContainer.setLocalTranslation(
|
backgroundContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - buildingPropertyContainer.getPreferredSize().x - padding) / 2,
|
(app.getCamera().getWidth() - buildingPropertyContainer.getPreferredSize().x - padding) / 2,
|
||||||
(app.getCamera().getHeight() + buildingPropertyContainer.getPreferredSize().y+ padding) / 2,
|
(app.getCamera().getHeight() + buildingPropertyContainer.getPreferredSize().y + padding) / 2,
|
||||||
15
|
7
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attaches the popup to the GUI through the DialogManager.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void show() {
|
||||||
|
app.getGuiNode().attachChild(backgroundContainer);
|
||||||
app.getGuiNode().attachChild(buildingPropertyContainer);
|
app.getGuiNode().attachChild(buildingPropertyContainer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Closes the popup and removes the associated GUI elements.
|
* Closes the popup and removes associated GUI elements.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
app.getGuiNode().detachChild(buildingPropertyContainer); // Entferne das Menü
|
app.getGuiNode().detachChild(buildingPropertyContainer);
|
||||||
app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
|
app.getGuiNode().detachChild(backgroundContainer);
|
||||||
super.close();
|
super.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,13 +125,13 @@ public class BuyHouse extends Dialog {
|
|||||||
buyHouseContainer.setLocalTranslation(
|
buyHouseContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - buyHouseContainer.getPreferredSize().x) / 2,
|
(app.getCamera().getWidth() - buyHouseContainer.getPreferredSize().x) / 2,
|
||||||
(app.getCamera().getHeight() + buyHouseContainer.getPreferredSize().y) / 2,
|
(app.getCamera().getHeight() + buyHouseContainer.getPreferredSize().y) / 2,
|
||||||
9
|
8
|
||||||
);
|
);
|
||||||
|
|
||||||
backgroundContainer.setLocalTranslation(
|
backgroundContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - buyHouseContainer.getPreferredSize().x - padding) / 2,
|
(app.getCamera().getWidth() - buyHouseContainer.getPreferredSize().x - padding) / 2,
|
||||||
(app.getCamera().getHeight() + buyHouseContainer.getPreferredSize().y + padding) / 2,
|
(app.getCamera().getHeight() + buyHouseContainer.getPreferredSize().y + padding) / 2,
|
||||||
8
|
7
|
||||||
);
|
);
|
||||||
|
|
||||||
app.getGuiNode().attachChild(buyHouseContainer);
|
app.getGuiNode().attachChild(buyHouseContainer);
|
||||||
|
@ -7,6 +7,7 @@ import com.simsilica.lemur.Label;
|
|||||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
||||||
import com.simsilica.lemur.style.ElementId;
|
import com.simsilica.lemur.style.ElementId;
|
||||||
import pp.dialog.Dialog;
|
import pp.dialog.Dialog;
|
||||||
|
import pp.dialog.PopupDialog;
|
||||||
import pp.monopoly.client.MonopolyApp;
|
import pp.monopoly.client.MonopolyApp;
|
||||||
import pp.monopoly.client.gui.SettingsMenu;
|
import pp.monopoly.client.gui.SettingsMenu;
|
||||||
import pp.monopoly.client.gui.TradeMenu;
|
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.
|
* 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. */
|
/** Reference to the Monopoly application instance. */
|
||||||
private final MonopolyApp app;
|
private final MonopolyApp app;
|
||||||
|
|
||||||
/** Main container for the "Confirm Trade" popup UI. */
|
/** Main container for the "Confirm Trade" popup UI. */
|
||||||
private final Container confirmTradeContainer;
|
private Container confirmTradeContainer;
|
||||||
|
|
||||||
/** Background container providing a border for the popup. */
|
/** 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. */
|
/** The trade handler managing the details of the trade proposal. */
|
||||||
private TradeHandler tradeHandler;
|
private final TradeHandler tradeHandler;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs the "Confirm Trade" popup.
|
* Constructs the "Confirm Trade" popup.
|
||||||
@ -39,53 +40,61 @@ public class ConfirmTrade extends Dialog {
|
|||||||
public ConfirmTrade(MonopolyApp app) {
|
public ConfirmTrade(MonopolyApp app) {
|
||||||
super(app.getDialogManager());
|
super(app.getDialogManager());
|
||||||
this.app = app;
|
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 = new Container();
|
||||||
backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
|
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();
|
confirmTradeContainer = new Container();
|
||||||
|
|
||||||
float padding = 10;
|
// Title
|
||||||
backgroundContainer.setPreferredSize(confirmTradeContainer.getPreferredSize().addLocal(padding, padding, 0));
|
Label title = confirmTradeContainer.addChild(new Label("Handel", new ElementId("warning-title")));
|
||||||
|
|
||||||
// Titel
|
|
||||||
Label title = confirmTradeContainer.addChild(new Label( "Handel", new ElementId("warning-title")));
|
|
||||||
title.setFontSize(48);
|
title.setFontSize(48);
|
||||||
title.setColor(ColorRGBA.Black);
|
title.setColor(ColorRGBA.Black);
|
||||||
|
|
||||||
|
// Build trade information strings
|
||||||
StringBuilder offeredProperties = new StringBuilder();
|
StringBuilder offeredProperties = new StringBuilder();
|
||||||
for (PropertyField field : tradeHandler.getOfferedProperties()) {
|
for (PropertyField field : tradeHandler.getOfferedProperties()) {
|
||||||
offeredProperties.append(field.getName());
|
offeredProperties.append(field.getName()).append(", ");
|
||||||
offeredProperties.append(", ");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
StringBuilder requestedProperties = new StringBuilder();
|
StringBuilder requestedProperties = new StringBuilder();
|
||||||
for (PropertyField field : tradeHandler.getRequestedProperties()) {
|
for (PropertyField field : tradeHandler.getRequestedProperties()) {
|
||||||
requestedProperties.append(field.getName());
|
requestedProperties.append(field.getName()).append(", ");
|
||||||
requestedProperties.append(", ");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Text, der auf der Karte steht
|
// Trade details
|
||||||
Container propertyValuesContainer = confirmTradeContainer.addChild(new Container());
|
Container propertyValuesContainer = confirmTradeContainer.addChild(new Container());
|
||||||
propertyValuesContainer.addChild(new Label("„Spieler " + " " + tradeHandler.getSender().getName() + " " +" möchte:", new ElementId("label-Text")));
|
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("", new ElementId("label-Text")));
|
||||||
propertyValuesContainer.addChild(new Label("- " + offeredProperties, 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.getOfferedAmount() + " EUR", new ElementId("label-Text")));
|
||||||
propertyValuesContainer.addChild(new Label("- " + tradeHandler.getOfferedJailCards() +" Sonderkarten", 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("", new ElementId("label-Text")));
|
||||||
propertyValuesContainer.addChild(new Label("gegen:", 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("", new ElementId("label-Text")));
|
||||||
propertyValuesContainer.addChild(new Label("- "+ requestedProperties, 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.getRequestedAmount() + " EUR", new ElementId("label-Text")));
|
||||||
propertyValuesContainer.addChild(new Label("- "+ tradeHandler.getRequestedJailCards() +" Sonderkarten", 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("tauschen, willst du das Angebot annehmen?", 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)));
|
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")));
|
Button declineButton = confirmTradeContainer.addChild(new Button("Ablehnen", new ElementId("button")));
|
||||||
declineButton.setFontSize(32);
|
declineButton.setFontSize(32);
|
||||||
declineButton.addClickCommands(s -> ifTopDialog(() -> {
|
declineButton.addClickCommands(s -> ifTopDialog(() -> {
|
||||||
@ -93,39 +102,50 @@ public class ConfirmTrade extends Dialog {
|
|||||||
app.getGameLogic().send(new TradeResponse(false, tradeHandler));
|
app.getGameLogic().send(new TradeResponse(false, tradeHandler));
|
||||||
close();
|
close();
|
||||||
}));
|
}));
|
||||||
// Verhandeln-Button
|
|
||||||
|
// Negotiate button
|
||||||
Button negotiateButton = confirmTradeContainer.addChild(new Button("Verhandeln", new ElementId("button")));
|
Button negotiateButton = confirmTradeContainer.addChild(new Button("Verhandeln", new ElementId("button")));
|
||||||
negotiateButton.setFontSize(32);
|
negotiateButton.setFontSize(32);
|
||||||
negotiateButton.addClickCommands(s -> ifTopDialog( () -> {
|
negotiateButton.addClickCommands(s -> ifTopDialog(() -> {
|
||||||
app.getGameLogic().playSound(Sound.BUTTON);
|
app.getGameLogic().playSound(Sound.BUTTON);
|
||||||
close();
|
close();
|
||||||
TradeHandler t = new TradeHandler(app.getGameLogic().getPlayerHandler().getPlayerById(tradeHandler.getSender().getId()));
|
TradeHandler t = new TradeHandler(app.getGameLogic().getPlayerHandler().getPlayerById(tradeHandler.getSender().getId()));
|
||||||
t.setReceiver(app.getGameLogic().getPlayerHandler().getPlayerById(tradeHandler.getReceiver().getId()));
|
t.setReceiver(app.getGameLogic().getPlayerHandler().getPlayerById(tradeHandler.getReceiver().getId()));
|
||||||
new TradeMenu(app, t).open();
|
new TradeMenu(app, t).open();
|
||||||
}));
|
}));
|
||||||
// Confirm-Button
|
|
||||||
|
// Confirm button
|
||||||
Button confirmButton = confirmTradeContainer.addChild(new Button("Bestätigen", new ElementId("button")));
|
Button confirmButton = confirmTradeContainer.addChild(new Button("Bestätigen", new ElementId("button")));
|
||||||
confirmButton.setFontSize(32);
|
confirmButton.setFontSize(32);
|
||||||
confirmButton.addClickCommands(s -> ifTopDialog( () -> {
|
confirmButton.addClickCommands(s -> ifTopDialog(() -> {
|
||||||
app.getGameLogic().playSound(Sound.BUTTON);
|
app.getGameLogic().playSound(Sound.BUTTON);
|
||||||
app.getGameLogic().send(new TradeResponse(true, tradeHandler));
|
app.getGameLogic().send(new TradeResponse(true, tradeHandler));
|
||||||
close();
|
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(
|
confirmTradeContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - confirmTradeContainer.getPreferredSize().x) / 2,
|
(app.getCamera().getWidth() - confirmTradeContainer.getPreferredSize().x) / 2,
|
||||||
(app.getCamera().getHeight() + confirmTradeContainer.getPreferredSize().y) / 2,
|
(app.getCamera().getHeight() + confirmTradeContainer.getPreferredSize().y) / 2,
|
||||||
8
|
8
|
||||||
);
|
);
|
||||||
|
|
||||||
// Zentriere das Menü
|
|
||||||
backgroundContainer.setLocalTranslation(
|
backgroundContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - confirmTradeContainer.getPreferredSize().x - padding) / 2,
|
(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
|
7
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Attach to GUI node
|
||||||
|
app.getGuiNode().attachChild(backgroundContainer);
|
||||||
app.getGuiNode().attachChild(confirmTradeContainer);
|
app.getGuiNode().attachChild(confirmTradeContainer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,25 +12,25 @@ import com.simsilica.lemur.Label;
|
|||||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
||||||
import com.simsilica.lemur.style.ElementId;
|
import com.simsilica.lemur.style.ElementId;
|
||||||
import pp.dialog.Dialog;
|
import pp.dialog.Dialog;
|
||||||
|
import pp.dialog.PopupDialog;
|
||||||
import pp.monopoly.client.MonopolyApp;
|
import pp.monopoly.client.MonopolyApp;
|
||||||
import pp.monopoly.notification.Sound;
|
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. */
|
/** Reference to the Monopoly application instance. */
|
||||||
private final MonopolyApp app;
|
private final MonopolyApp app;
|
||||||
|
|
||||||
/** Semi-transparent overlay background for the popup. */
|
/** Semi-transparent overlay background for the popup. */
|
||||||
private final Geometry overlayBackground;
|
private Geometry overlayBackground;
|
||||||
|
|
||||||
/** Main container for the event card information. */
|
/** Main container for the event card information. */
|
||||||
private final Container eventCardContainer;
|
private Container eventCardContainer;
|
||||||
|
|
||||||
/** Background container providing a border for the popup. */
|
/** 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.
|
* Constructs the EventCardPopup to display the details of a triggered event card.
|
||||||
@ -42,74 +42,87 @@ public class EventCardPopup extends Dialog {
|
|||||||
super(app.getDialogManager());
|
super(app.getDialogManager());
|
||||||
this.app = app;
|
this.app = app;
|
||||||
|
|
||||||
// Halbtransparentes Overlay hinzufügen
|
// Initialize the UI components
|
||||||
overlayBackground = createOverlayBackground();
|
createOverlayBackground();
|
||||||
app.getGuiNode().attachChild(overlayBackground);
|
createBackgroundContainer();
|
||||||
|
createEventCardContainer(description);
|
||||||
// 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a semi-transparent background overlay for the popup.
|
* Initializes the semi-transparent background overlay.
|
||||||
*
|
|
||||||
* @return the geometry of the overlay
|
|
||||||
*/
|
*/
|
||||||
private Geometry createOverlayBackground() {
|
private void createOverlayBackground() {
|
||||||
Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
|
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 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);
|
material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
|
||||||
overlay.setMaterial(material);
|
overlayBackground.setMaterial(material);
|
||||||
overlay.setLocalTranslation(0, 0, 0);
|
overlayBackground.setLocalTranslation(0, 0, 0);
|
||||||
return overlay;
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
|
app.getGuiNode().detachChild(overlayBackground);
|
||||||
app.getGuiNode().detachChild(eventCardContainer);
|
app.getGuiNode().detachChild(eventCardContainer);
|
||||||
app.getGuiNode().detachChild(backgroundContainer);
|
app.getGuiNode().detachChild(backgroundContainer);
|
||||||
app.getGuiNode().detachChild(overlayBackground);
|
|
||||||
super.close();
|
super.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,27 +12,27 @@ import com.simsilica.lemur.component.QuadBackgroundComponent;
|
|||||||
import com.simsilica.lemur.style.ElementId;
|
import com.simsilica.lemur.style.ElementId;
|
||||||
|
|
||||||
import pp.dialog.Dialog;
|
import pp.dialog.Dialog;
|
||||||
|
import pp.dialog.PopupDialog;
|
||||||
import pp.monopoly.client.MonopolyApp;
|
import pp.monopoly.client.MonopolyApp;
|
||||||
import pp.monopoly.client.gui.SettingsMenu;
|
|
||||||
import pp.monopoly.message.client.BuyPropertyResponse;
|
import pp.monopoly.message.client.BuyPropertyResponse;
|
||||||
import pp.monopoly.model.fields.FoodField;
|
import pp.monopoly.model.fields.FoodField;
|
||||||
import pp.monopoly.notification.Sound;
|
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. */
|
/** Reference to the Monopoly application instance. */
|
||||||
private final MonopolyApp app;
|
private final MonopolyApp app;
|
||||||
|
|
||||||
/** Semi-transparent overlay background for the popup. */
|
/** Semi-transparent overlay background for the popup. */
|
||||||
private final Geometry overlayBackground;
|
private Geometry overlayBackground;
|
||||||
|
|
||||||
/** Main container for the food field information. */
|
/** Main container for the food field information. */
|
||||||
private final Container foodFieldContainer;
|
private Container foodFieldContainer;
|
||||||
|
|
||||||
/** Background container providing a border for the popup. */
|
/** 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.
|
* Constructs a FoodFieldCard popup displaying details about a food field.
|
||||||
@ -43,108 +43,121 @@ public class FoodFieldCard extends Dialog {
|
|||||||
super(app.getDialogManager());
|
super(app.getDialogManager());
|
||||||
this.app = app;
|
this.app = app;
|
||||||
|
|
||||||
|
// Retrieve field information
|
||||||
int index = app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()).getFieldID();
|
int index = app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()).getFieldID();
|
||||||
FoodField field = (FoodField) app.getGameLogic().getBoardManager().getFieldAtIndex(index);
|
FoodField field = (FoodField) app.getGameLogic().getBoardManager().getFieldAtIndex(index);
|
||||||
|
|
||||||
overlayBackground = createOverlayBackground();
|
// Create UI elements
|
||||||
app.getGuiNode().attachChild(overlayBackground);
|
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 = new Container();
|
||||||
backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background
|
backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background
|
||||||
attachChild(backgroundContainer);
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 = new Container();
|
||||||
foodFieldContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.1f, 0.1f, 0.1f, 0.9f)));
|
foodFieldContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.1f, 0.1f, 0.1f, 0.9f)));
|
||||||
|
|
||||||
float padding = 10;
|
// Title
|
||||||
backgroundContainer.setPreferredSize(foodFieldContainer.getPreferredSize().addLocal(padding, padding, 0));
|
Label title = foodFieldContainer.addChild(new Label(field.getName(), new ElementId("label-Bold")));
|
||||||
|
title.setFontSize(48);
|
||||||
Label settingsTitle = foodFieldContainer.addChild(new Label(field.getName(), new ElementId("label-Bold")));
|
title.setColor(ColorRGBA.White);
|
||||||
settingsTitle.setFontSize(48);
|
|
||||||
settingsTitle.setColor(ColorRGBA.White);
|
|
||||||
|
|
||||||
|
// Field details
|
||||||
Container propertyValuesContainer = foodFieldContainer.addChild(new Container());
|
Container propertyValuesContainer = foodFieldContainer.addChild(new Container());
|
||||||
propertyValuesContainer.addChild(new Label("„Preis: " + field.getPrice() + " EUR", new ElementId("label-Text")));
|
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("", new ElementId("label-Text"))); // Empty line
|
||||||
propertyValuesContainer.addChild(new Label("„Wenn man Besitzer des", new ElementId("label-Text")));
|
propertyValuesContainer.addChild(new Label("„Miete: 40x Würfel-Augen, wenn Besitzer eines Restaurants.", new ElementId("label-Text")));
|
||||||
propertyValuesContainer.addChild(new Label(field.getName()+" ist, so ist die", 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("Miete 40-mal so hoch, wie", new ElementId("label-Text")));
|
propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Empty line
|
||||||
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("„Hypothek: " + field.getHypo() + " 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)));
|
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")));
|
Button quitButton = foodFieldContainer.addChild(new Button("Beenden", new ElementId("button")));
|
||||||
quitButton.setFontSize(32);
|
quitButton.setFontSize(32);
|
||||||
quitButton.addClickCommands(s -> ifTopDialog( () -> {
|
quitButton.addClickCommands(s -> ifTopDialog(() -> {
|
||||||
app.getGameLogic().playSound(Sound.BUTTON);
|
app.getGameLogic().playSound(Sound.BUTTON);
|
||||||
close();
|
close();
|
||||||
}));
|
}));
|
||||||
// Kaufen-Button
|
|
||||||
|
// Buy button
|
||||||
Button buyButton = foodFieldContainer.addChild(new Button("Kaufen", new ElementId("button")));
|
Button buyButton = foodFieldContainer.addChild(new Button("Kaufen", new ElementId("button")));
|
||||||
buyButton.setFontSize(32);
|
buyButton.setFontSize(32);
|
||||||
buyButton.addClickCommands(s -> ifTopDialog( () -> {
|
buyButton.addClickCommands(s -> ifTopDialog(() -> {
|
||||||
app.getGameLogic().playSound(Sound.BUTTON);
|
app.getGameLogic().playSound(Sound.BUTTON);
|
||||||
app.getGameLogic().send(new BuyPropertyResponse());
|
app.getGameLogic().send(new BuyPropertyResponse());
|
||||||
close();
|
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(foodFieldContainer.getPreferredSize().addLocal(padding, padding, 0));
|
||||||
foodFieldContainer.setLocalTranslation(
|
foodFieldContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - foodFieldContainer.getPreferredSize().x) / 2,
|
(app.getCamera().getWidth() - foodFieldContainer.getPreferredSize().x) / 2,
|
||||||
(app.getCamera().getHeight() + foodFieldContainer.getPreferredSize().y) / 2,
|
(app.getCamera().getHeight() + foodFieldContainer.getPreferredSize().y) / 2,
|
||||||
8
|
8
|
||||||
);
|
);
|
||||||
|
|
||||||
// Zentriere das Popup
|
|
||||||
backgroundContainer.setLocalTranslation(
|
backgroundContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - foodFieldContainer.getPreferredSize().x - padding) / 2,
|
(app.getCamera().getWidth() - foodFieldContainer.getPreferredSize().x - padding) / 2,
|
||||||
(app.getCamera().getHeight() + foodFieldContainer.getPreferredSize().y+ padding) / 2,
|
(app.getCamera().getHeight() + foodFieldContainer.getPreferredSize().y + padding) / 2,
|
||||||
7
|
7
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Attach components to the GUI
|
||||||
|
app.getGuiNode().attachChild(overlayBackground);
|
||||||
|
app.getGuiNode().attachChild(backgroundContainer);
|
||||||
app.getGuiNode().attachChild(foodFieldContainer);
|
app.getGuiNode().attachChild(foodFieldContainer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a semi-transparent background overlay for the popup.
|
|
||||||
*
|
|
||||||
* @return the geometry of the overlay
|
|
||||||
*/
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Closes the popup and removes its associated GUI elements.
|
* Closes the popup and removes its associated GUI elements.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
app.getGuiNode().detachChild(foodFieldContainer); // Entferne das Menü
|
app.getGuiNode().detachChild(overlayBackground);
|
||||||
app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
|
app.getGuiNode().detachChild(foodFieldContainer);
|
||||||
app.getGuiNode().detachChild(overlayBackground); // Entferne das Overlay
|
app.getGuiNode().detachChild(backgroundContainer);
|
||||||
super.close();
|
super.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Opens the settings menu when the escape key is pressed.
|
* Handles the escape key action by closing the popup.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void escape() {
|
public void escape() {
|
||||||
new SettingsMenu(app).open();
|
close();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,9 @@ import com.simsilica.lemur.Container;
|
|||||||
import com.simsilica.lemur.Label;
|
import com.simsilica.lemur.Label;
|
||||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
||||||
import com.simsilica.lemur.style.ElementId;
|
import com.simsilica.lemur.style.ElementId;
|
||||||
|
|
||||||
import pp.dialog.Dialog;
|
import pp.dialog.Dialog;
|
||||||
|
import pp.dialog.PopupDialog;
|
||||||
import pp.monopoly.client.MonopolyApp;
|
import pp.monopoly.client.MonopolyApp;
|
||||||
import pp.monopoly.client.gui.SettingsMenu;
|
import pp.monopoly.client.gui.SettingsMenu;
|
||||||
import pp.monopoly.message.client.BuyPropertyResponse;
|
import pp.monopoly.message.client.BuyPropertyResponse;
|
||||||
@ -14,17 +16,17 @@ import pp.monopoly.model.fields.GateField;
|
|||||||
import pp.monopoly.notification.Sound;
|
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. */
|
/** Reference to the Monopoly application instance. */
|
||||||
private final MonopolyApp app;
|
private final MonopolyApp app;
|
||||||
|
|
||||||
/** Main container for the gate field information. */
|
/** Main container for the gate field information. */
|
||||||
private final Container gateFieldContainer;
|
private Container gateFieldContainer;
|
||||||
|
|
||||||
/** Background container providing a border for the popup. */
|
/** 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.
|
* Constructs a GateFieldCard popup displaying details about a gate field.
|
||||||
@ -35,73 +37,89 @@ public class GateFieldCard extends Dialog {
|
|||||||
super(app.getDialogManager());
|
super(app.getDialogManager());
|
||||||
this.app = app;
|
this.app = app;
|
||||||
|
|
||||||
//Generate the corresponfing field
|
// Generate the corresponding field
|
||||||
int index = app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()).getFieldID();
|
int index = app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()).getFieldID();
|
||||||
GateField field = (GateField) app.getGameLogic().getBoardManager().getFieldAtIndex(index);
|
GateField field = (GateField) app.getGameLogic().getBoardManager().getFieldAtIndex(index);
|
||||||
|
|
||||||
// Create the background container
|
// Initialize UI elements
|
||||||
backgroundContainer = new Container();
|
createBackgroundContainer();
|
||||||
backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background
|
createGateFieldContainer(field);
|
||||||
attachChild(backgroundContainer);
|
}
|
||||||
|
|
||||||
// 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 = new Container();
|
||||||
gateFieldContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
|
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
|
// Title
|
||||||
backgroundContainer.setPreferredSize(gateFieldContainer.getPreferredSize().addLocal(padding, padding, 0));
|
|
||||||
|
|
||||||
// Titel, bestehend aus dynamischen Namen anhand der ID und der Schriftfarbe/größe
|
|
||||||
Label gateFieldTitle = gateFieldContainer.addChild(new Label(field.getName(), new ElementId("label-Bold")));
|
Label gateFieldTitle = gateFieldContainer.addChild(new Label(field.getName(), new ElementId("label-Bold")));
|
||||||
gateFieldTitle.setFontSize(48);
|
gateFieldTitle.setFontSize(48);
|
||||||
gateFieldTitle.setColor(ColorRGBA.Black);
|
gateFieldTitle.setColor(ColorRGBA.Black);
|
||||||
|
|
||||||
// Text, der auf der Karte steht
|
// Field details
|
||||||
// Die Preise werden dynamisch dem BoardManager entnommen
|
|
||||||
Container propertyValuesContainer = gateFieldContainer.addChild(new Container());
|
Container propertyValuesContainer = gateFieldContainer.addChild(new Container());
|
||||||
propertyValuesContainer.addChild(new Label("„Preis: " + field.getPrice() + " EUR", new ElementId("label-Text")));
|
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("Miete: 250 EUR", new ElementId("label-Text")));
|
||||||
propertyValuesContainer.addChild(new Label("Wenn man", new ElementId("label-Text")));
|
propertyValuesContainer.addChild(new Label("Wenn man 2 Bahnhöfe besitzt: 500 EUR", new ElementId("label-Text")));
|
||||||
propertyValuesContainer.addChild(new Label("2 Bahnhof 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", new ElementId("label-Text")));
|
propertyValuesContainer.addChild(new Label("Wenn man 4 Bahnhöfe besitzt: 2000 EUR", new ElementId("label-Text")));
|
||||||
propertyValuesContainer.addChild(new Label("3 Bahnhof besitzt: 1000 EUR", new ElementId("label-Text")));
|
propertyValuesContainer.addChild(new Label("", new ElementId("label-Text"))); // Empty line
|
||||||
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("„Hypothek: " + field.getHypo() + " 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)));
|
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")));
|
Button quitButton = gateFieldContainer.addChild(new Button("Beenden", new ElementId("button")));
|
||||||
quitButton.setFontSize(32);
|
quitButton.setFontSize(32);
|
||||||
quitButton.addClickCommands(s -> ifTopDialog( () -> {
|
quitButton.addClickCommands(s -> ifTopDialog(() -> {
|
||||||
app.getGameLogic().playSound(Sound.BUTTON);
|
app.getGameLogic().playSound(Sound.BUTTON);
|
||||||
close();
|
close();
|
||||||
}));
|
}));
|
||||||
// Kaufen-Button
|
|
||||||
|
// Buy button
|
||||||
Button buyButton = gateFieldContainer.addChild(new Button("Kaufen", new ElementId("button")));
|
Button buyButton = gateFieldContainer.addChild(new Button("Kaufen", new ElementId("button")));
|
||||||
buyButton.setFontSize(32);
|
buyButton.setFontSize(32);
|
||||||
buyButton.addClickCommands(s -> ifTopDialog( () -> {
|
buyButton.addClickCommands(s -> ifTopDialog(() -> {
|
||||||
app.getGameLogic().playSound(Sound.BUTTON);
|
app.getGameLogic().playSound(Sound.BUTTON);
|
||||||
app.getGameLogic().send(new BuyPropertyResponse());
|
app.getGameLogic().send(new BuyPropertyResponse());
|
||||||
close();
|
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(
|
gateFieldContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - gateFieldContainer.getPreferredSize().x) / 2,
|
(app.getCamera().getWidth() - gateFieldContainer.getPreferredSize().x) / 2,
|
||||||
(app.getCamera().getHeight() + gateFieldContainer.getPreferredSize().y) / 2,
|
(app.getCamera().getHeight() + gateFieldContainer.getPreferredSize().y) / 2,
|
||||||
8
|
8
|
||||||
);
|
);
|
||||||
|
|
||||||
// Zentriere das Popup
|
|
||||||
backgroundContainer.setLocalTranslation(
|
backgroundContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - gateFieldContainer.getPreferredSize().x - padding) / 2,
|
(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
|
7
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Attach components to the GUI
|
||||||
|
app.getGuiNode().attachChild(backgroundContainer);
|
||||||
app.getGuiNode().attachChild(gateFieldContainer);
|
app.getGuiNode().attachChild(gateFieldContainer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,8 +128,8 @@ public class GateFieldCard extends Dialog {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
app.getGuiNode().detachChild(gateFieldContainer); // Entferne das Menü
|
app.getGuiNode().detachChild(gateFieldContainer); // Remove main container
|
||||||
app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
|
app.getGuiNode().detachChild(backgroundContainer); // Remove background container
|
||||||
super.close();
|
super.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,7 +11,9 @@ import com.simsilica.lemur.Container;
|
|||||||
import com.simsilica.lemur.Label;
|
import com.simsilica.lemur.Label;
|
||||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
||||||
import com.simsilica.lemur.style.ElementId;
|
import com.simsilica.lemur.style.ElementId;
|
||||||
|
|
||||||
import pp.dialog.Dialog;
|
import pp.dialog.Dialog;
|
||||||
|
import pp.dialog.PopupDialog;
|
||||||
import pp.monopoly.client.MonopolyApp;
|
import pp.monopoly.client.MonopolyApp;
|
||||||
import pp.monopoly.notification.Sound;
|
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.
|
* This popup informs the player that they are being sent to the Gulag and includes a confirmation button.
|
||||||
* </p>
|
* </p>
|
||||||
*/
|
*/
|
||||||
public class Gulag extends Dialog {
|
public class Gulag extends Dialog implements PopupDialog {
|
||||||
/** Reference to the Monopoly application instance. */
|
/** Reference to the Monopoly application instance. */
|
||||||
private final MonopolyApp app;
|
private final MonopolyApp app;
|
||||||
|
|
||||||
/** Semi-transparent overlay background for the popup. */
|
/** Semi-transparent overlay background for the popup. */
|
||||||
private final Geometry overlayBackground;
|
private Geometry overlayBackground;
|
||||||
|
|
||||||
/** Main container for the Gulag warning message. */
|
/** Main container for the Gulag warning message. */
|
||||||
private final Container gulagContainer;
|
private Container gulagContainer;
|
||||||
|
|
||||||
/** Background container providing a border for the popup. */
|
/** 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
|
* @param app the Monopoly application instance
|
||||||
*/
|
*/
|
||||||
@ -43,71 +45,79 @@ public class Gulag extends Dialog {
|
|||||||
super(app.getDialogManager());
|
super(app.getDialogManager());
|
||||||
this.app = app;
|
this.app = app;
|
||||||
|
|
||||||
|
// Initialize UI elements
|
||||||
// Halbtransparentes Overlay hinzufügen
|
createOverlayBackground();
|
||||||
overlayBackground = createOverlayBackground();
|
createBackgroundContainer();
|
||||||
app.getGuiNode().attachChild(overlayBackground);
|
createGulagContainer();
|
||||||
|
|
||||||
// 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a semi-transparent overlay background for the popup.
|
* Creates the semi-transparent overlay background 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());
|
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 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);
|
material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
|
||||||
overlay.setMaterial(material);
|
overlayBackground.setMaterial(material);
|
||||||
overlay.setLocalTranslation(0, 0, 0);
|
overlayBackground.setLocalTranslation(0, 0, 0);
|
||||||
return overlay;
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
app.getGuiNode().detachChild(gulagContainer); // Entferne das Menü
|
app.getGuiNode().detachChild(overlayBackground);
|
||||||
app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
|
app.getGuiNode().detachChild(gulagContainer);
|
||||||
app.getGuiNode().detachChild(overlayBackground); // Entferne das Overlay
|
app.getGuiNode().detachChild(backgroundContainer);
|
||||||
super.close();
|
super.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles the escape action to close the popup.
|
* Handles the escape action by closing the popup.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void escape() {
|
public void escape() {
|
||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -7,26 +7,24 @@ import com.simsilica.lemur.Label;
|
|||||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
||||||
import com.simsilica.lemur.style.ElementId;
|
import com.simsilica.lemur.style.ElementId;
|
||||||
import pp.dialog.Dialog;
|
import pp.dialog.Dialog;
|
||||||
|
import pp.dialog.PopupDialog;
|
||||||
import pp.monopoly.client.MonopolyApp;
|
import pp.monopoly.client.MonopolyApp;
|
||||||
import pp.monopoly.client.gui.SettingsMenu;
|
|
||||||
import pp.monopoly.message.client.NotificationAnswer;
|
import pp.monopoly.message.client.NotificationAnswer;
|
||||||
import pp.monopoly.notification.Sound;
|
import pp.monopoly.notification.Sound;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GulagInfo is a popup that provides options for a player who is stuck in the "Gulag" (jail) field.
|
* GulagInfo is a popup that provides options for a player who is stuck in the "Gulag" (jail) field.
|
||||||
* <p>
|
|
||||||
* This dialog offers multiple actions, including paying a bribe, using a "Get Out of Jail" card, or waiting.
|
* This dialog offers multiple actions, including paying a bribe, using a "Get Out of Jail" card, or waiting.
|
||||||
* </p>
|
|
||||||
*/
|
*/
|
||||||
public class GulagInfo extends Dialog {
|
public class GulagInfo extends Dialog implements PopupDialog {
|
||||||
/** Reference to the Monopoly application instance. */
|
/** Reference to the Monopoly application instance. */
|
||||||
private final MonopolyApp app;
|
private final MonopolyApp app;
|
||||||
|
|
||||||
/** Main container for the Gulag information dialog. */
|
/** Main container for the Gulag information dialog. */
|
||||||
private final Container gulagInfoContainer;
|
private Container gulagInfoContainer;
|
||||||
|
|
||||||
/** Background container providing a styled border around the dialog. */
|
/** 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.
|
* Constructs a GulagInfo popup that provides the player with options for getting out of the "Gulag" field.
|
||||||
@ -38,81 +36,109 @@ public class GulagInfo extends Dialog {
|
|||||||
super(app.getDialogManager());
|
super(app.getDialogManager());
|
||||||
this.app = app;
|
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 = new Container();
|
||||||
backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background
|
backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background
|
||||||
attachChild(backgroundContainer);
|
}
|
||||||
|
|
||||||
// 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 = 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
|
// Title
|
||||||
backgroundContainer.setPreferredSize(gulagInfoContainer.getPreferredSize().addLocal(padding, padding, 0));
|
Label title = gulagInfoContainer.addChild(new Label("Gulag", new ElementId("warning-title")));
|
||||||
|
|
||||||
// Titel
|
|
||||||
Label title = gulagInfoContainer.addChild(new Label( "Gulag", new ElementId("warning-title")));
|
|
||||||
title.setFontSize(48);
|
title.setFontSize(48);
|
||||||
title.setColor(ColorRGBA.Black);
|
title.setColor(ColorRGBA.Black);
|
||||||
|
|
||||||
// Text, der auf der Karte steht
|
// Text Description
|
||||||
// Die Werte werden dem Handel entnommen (Iwas auch immer da dann ist)
|
Container textContainer = gulagInfoContainer.addChild(new Container());
|
||||||
Container propertyValuesContainer = gulagInfoContainer.addChild(new Container());
|
textContainer.addChild(new Label("„Du sitzt im Gefängnis und kommst nicht raus ...", new ElementId("label-Text")));
|
||||||
propertyValuesContainer.addChild(new Label("„Du sitzt im Gefänginis und kommst nicht raus ...", new ElementId("label-Text")));
|
textContainer.addChild(new Label("Es sei denn, du ...", new ElementId("label-Text")));
|
||||||
propertyValuesContainer.addChild(new Label("Es sei denn, du ...", new ElementId("label-Text")));// Leerzeile
|
textContainer.addChild(new Label("- bestichst die Wache mit 500 EUR", new ElementId("label-Text")));
|
||||||
propertyValuesContainer.addChild(new Label("", new ElementId("label-Text")));
|
textContainer.addChild(new Label("- löst eine Gulag-Frei-Karte ein", new ElementId("label-Text")));
|
||||||
propertyValuesContainer.addChild(new Label("- bestichst die Wache mit 500 EUR", new ElementId("label-Text")));
|
textContainer.addChild(new Label("- wartest 3 Runden und bezahlst dann", new ElementId("label-Text")));
|
||||||
propertyValuesContainer.addChild(new Label("- löst eine Gulag-Frei-Karte ein", new ElementId("label-Text")));
|
textContainer.addChild(new Label("- oder du würfelst einen Pasch", new ElementId("label-Text")));
|
||||||
propertyValuesContainer.addChild(new Label("- wartest 3 Runden und bezahlst dann", new ElementId("label-Text")));// Leerzeile
|
textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
|
||||||
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)));
|
|
||||||
|
|
||||||
|
// 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")));
|
Button payButton = gulagInfoContainer.addChild(new Button("Bestechungsgeld bezahlen", new ElementId("button")));
|
||||||
payButton.setFontSize(32);
|
payButton.setFontSize(32);
|
||||||
payButton.addClickCommands(s -> ifTopDialog( () -> {
|
payButton.addClickCommands(s -> ifTopDialog(() -> {
|
||||||
app.getGameLogic().playSound(Sound.BUTTON);
|
app.getGameLogic().playSound(Sound.BUTTON);
|
||||||
app.getGameLogic().send(new NotificationAnswer("PayJail"));
|
app.getGameLogic().send(new NotificationAnswer("PayJail"));
|
||||||
close();
|
close();
|
||||||
}));
|
}));
|
||||||
// Ereigniskarte-Button
|
|
||||||
|
// Use Jail-Free Card Button
|
||||||
Button eventCardButton = gulagInfoContainer.addChild(new Button("Ereigniskarte nutzen", new ElementId("button")));
|
Button eventCardButton = gulagInfoContainer.addChild(new Button("Ereigniskarte nutzen", new ElementId("button")));
|
||||||
eventCardButton.setFontSize(32);
|
eventCardButton.setFontSize(32);
|
||||||
eventCardButton.addClickCommands(s -> ifTopDialog( () -> {
|
eventCardButton.addClickCommands(s -> ifTopDialog(() -> {
|
||||||
app.getGameLogic().playSound(Sound.BUTTON);
|
app.getGameLogic().playSound(Sound.BUTTON);
|
||||||
app.getGameLogic().send(new NotificationAnswer("UseJailCard"));
|
app.getGameLogic().send(new NotificationAnswer("UseJailCard"));
|
||||||
close();
|
close();
|
||||||
}));
|
}));
|
||||||
// Schließen-Button
|
|
||||||
|
// Close Button
|
||||||
Button closeButton = gulagInfoContainer.addChild(new Button("Schließen", new ElementId("button")));
|
Button closeButton = gulagInfoContainer.addChild(new Button("Schließen", new ElementId("button")));
|
||||||
closeButton.setFontSize(32);
|
closeButton.setFontSize(32);
|
||||||
closeButton.addClickCommands(s -> ifTopDialog(() -> {
|
closeButton.addClickCommands(s -> ifTopDialog(this::close));
|
||||||
app.getGameLogic().playSound(Sound.BUTTON);
|
|
||||||
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(
|
gulagInfoContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - gulagInfoContainer.getPreferredSize().x) / 2,
|
(app.getCamera().getWidth() - gulagInfoContainer.getPreferredSize().x) / 2,
|
||||||
(app.getCamera().getHeight() + gulagInfoContainer.getPreferredSize().y) / 2,
|
(app.getCamera().getHeight() + gulagInfoContainer.getPreferredSize().y) / 2,
|
||||||
14
|
8
|
||||||
);
|
);
|
||||||
|
|
||||||
// Zentriere das Menü
|
|
||||||
backgroundContainer.setLocalTranslation(
|
backgroundContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - gulagInfoContainer.getPreferredSize().x - padding) / 2,
|
(app.getCamera().getWidth() - gulagInfoContainer.getPreferredSize().x - padding) / 2,
|
||||||
(app.getCamera().getHeight() + gulagInfoContainer.getPreferredSize().y+ padding) / 2,
|
(app.getCamera().getHeight() + gulagInfoContainer.getPreferredSize().y + padding) / 2,
|
||||||
13
|
7
|
||||||
);
|
);
|
||||||
|
|
||||||
if(app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()).getNumJailCard() == 0) {
|
// Attach containers to the GUI
|
||||||
eventCardButton.setEnabled(false);
|
app.getGuiNode().attachChild(backgroundContainer);
|
||||||
}
|
|
||||||
|
|
||||||
if(trys == 3) {
|
|
||||||
closeButton.setEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
app.getGuiNode().attachChild(gulagInfoContainer);
|
app.getGuiNode().attachChild(gulagInfoContainer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,16 +147,8 @@ public class GulagInfo extends Dialog {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
app.getGuiNode().detachChild(gulagInfoContainer); // Entferne das Menü
|
app.getGuiNode().detachChild(gulagInfoContainer); // Remove dialog
|
||||||
app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
|
app.getGuiNode().detachChild(backgroundContainer); // Remove background
|
||||||
super.close();
|
super.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles the escape action to close the GulagInfo dialog.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void escape() {
|
|
||||||
new SettingsMenu(app).open();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -12,19 +12,14 @@ import com.simsilica.lemur.Label;
|
|||||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
||||||
import com.simsilica.lemur.style.ElementId;
|
import com.simsilica.lemur.style.ElementId;
|
||||||
import pp.dialog.Dialog;
|
import pp.dialog.Dialog;
|
||||||
|
import pp.dialog.PopupDialog;
|
||||||
import pp.monopoly.client.MonopolyApp;
|
import pp.monopoly.client.MonopolyApp;
|
||||||
import pp.monopoly.notification.Sound;
|
import pp.monopoly.notification.Sound;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NoMoneyWarning is a warning popup that appears when a player tries to perform
|
* NoMoneyWarning is a warning popup that informs the player they lack sufficient funds to proceed with an action.
|
||||||
* an action they cannot afford due to insufficient funds, such as attempting
|
|
||||||
* to purchase a property or building.
|
|
||||||
* <p>
|
|
||||||
* This dialog notifies the player of their lack of funds and provides a single
|
|
||||||
* confirmation button to close the dialog.
|
|
||||||
* </p>
|
|
||||||
*/
|
*/
|
||||||
public class NoMoneyWarning extends Dialog {
|
public class NoMoneyWarning extends Dialog implements PopupDialog {
|
||||||
/** Reference to the Monopoly application instance. */
|
/** Reference to the Monopoly application instance. */
|
||||||
private final MonopolyApp app;
|
private final MonopolyApp app;
|
||||||
|
|
||||||
@ -46,66 +41,15 @@ public class NoMoneyWarning extends Dialog {
|
|||||||
super(app.getDialogManager());
|
super(app.getDialogManager());
|
||||||
this.app = app;
|
this.app = app;
|
||||||
|
|
||||||
|
|
||||||
// Halbtransparentes Overlay hinzufügen
|
|
||||||
overlayBackground = createOverlayBackground();
|
overlayBackground = createOverlayBackground();
|
||||||
app.getGuiNode().attachChild(overlayBackground);
|
backgroundContainer = createBackgroundContainer();
|
||||||
|
noMoneyWarningContainer = createNoMoneyWarningContainer();
|
||||||
|
|
||||||
// Create the background container
|
adjustPaddingAndCenter();
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a semi-transparent overlay background for the dialog.
|
* Creates the semi-transparent overlay background.
|
||||||
*
|
*
|
||||||
* @return The geometry representing the 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());
|
Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
|
||||||
Geometry overlay = new Geometry("Overlay", quad);
|
Geometry overlay = new Geometry("Overlay", quad);
|
||||||
Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
|
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);
|
material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
|
||||||
overlay.setMaterial(material);
|
overlay.setMaterial(material);
|
||||||
overlay.setLocalTranslation(0, 0, 0);
|
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
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
app.getGuiNode().detachChild(noMoneyWarningContainer); // Entferne das Menü
|
app.getGuiNode().detachChild(overlayBackground);
|
||||||
app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
|
app.getGuiNode().detachChild(backgroundContainer);
|
||||||
app.getGuiNode().detachChild(overlayBackground); // Entferne das Overlay
|
app.getGuiNode().detachChild(noMoneyWarningContainer);
|
||||||
super.close();
|
super.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,115 +12,95 @@ import com.simsilica.lemur.Label;
|
|||||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
||||||
import com.simsilica.lemur.style.ElementId;
|
import com.simsilica.lemur.style.ElementId;
|
||||||
import pp.dialog.Dialog;
|
import pp.dialog.Dialog;
|
||||||
|
import pp.dialog.PopupDialog;
|
||||||
import pp.monopoly.client.MonopolyApp;
|
import pp.monopoly.client.MonopolyApp;
|
||||||
import pp.monopoly.notification.Sound;
|
import pp.monopoly.notification.Sound;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rent is a popup that is triggered when a player lands on a property owned by another player
|
* ReceivedRent is a popup that informs a player about rent they have received.
|
||||||
* and needs to pay rent in the Monopoly application.
|
|
||||||
* <p>
|
|
||||||
* Displays the rent amount and the recipient player's name, with an option to confirm the payment.
|
|
||||||
* </p>
|
|
||||||
*/
|
*/
|
||||||
public class ReceivedRent extends Dialog {
|
public class ReceivedRent extends Dialog implements PopupDialog {
|
||||||
|
|
||||||
/** Reference to the Monopoly application instance. */
|
/** Reference to the Monopoly application instance. */
|
||||||
private final MonopolyApp app;
|
private final MonopolyApp app;
|
||||||
|
|
||||||
/** Semi-transparent overlay background for the popup. */
|
/** Semi-transparent overlay background for the popup. */
|
||||||
private final Geometry overlayBackground;
|
private Geometry overlayBackground;
|
||||||
|
|
||||||
/** Main container for the rent information and action. */
|
/** Main container for the rent information and action. */
|
||||||
private final Container rentContainer;
|
private Container rentContainer;
|
||||||
|
|
||||||
/** Background container providing a border for the rent popup. */
|
/** 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 app the Monopoly application instance
|
||||||
* @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 amount of rent to be paid
|
* @param amount the amount of rent received
|
||||||
*/
|
*/
|
||||||
public ReceivedRent(MonopolyApp app, String playerName, int amount) {
|
public ReceivedRent(MonopolyApp app, String playerName, int amount) {
|
||||||
super(app.getDialogManager());
|
super(app.getDialogManager());
|
||||||
this.app = app;
|
this.app = app;
|
||||||
|
|
||||||
// Create the overlay
|
// Initialize GUI elements
|
||||||
overlayBackground = createOverlayBackground();
|
createOverlayBackground();
|
||||||
app.getGuiNode().attachChild(overlayBackground);
|
createBackgroundContainer();
|
||||||
|
createRentContainer(playerName, amount);
|
||||||
// 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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a semi-transparent overlay background.
|
* 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());
|
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 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)); // Semi-transparent black
|
||||||
material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
|
material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
|
||||||
overlay.setMaterial(material);
|
overlayBackground.setMaterial(material);
|
||||||
overlay.setLocalTranslation(0, 0, 0);
|
overlayBackground.setLocalTranslation(0, 0, 0);
|
||||||
return overlay;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates the background container with styling.
|
* Creates the background container with styling.
|
||||||
*
|
|
||||||
* @return the styled background container
|
|
||||||
*/
|
*/
|
||||||
private Container createBackgroundContainer() {
|
private void createBackgroundContainer() {
|
||||||
Container container = new Container();
|
backgroundContainer = new Container();
|
||||||
container.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background
|
backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Light gray background
|
||||||
return container;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates the main rent container with title, text, and button.
|
* 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
|
* @param amount the rent amount
|
||||||
* @return the rent container
|
|
||||||
*/
|
*/
|
||||||
private Container createRentContainer(String playerName, int amount) {
|
private void createRentContainer(String playerName, int amount) {
|
||||||
Container container = new Container();
|
rentContainer = new Container();
|
||||||
container.setBackground(new QuadBackgroundComponent(ColorRGBA.Gray));
|
rentContainer.setBackground(new QuadBackgroundComponent(ColorRGBA.Gray));
|
||||||
container.setPreferredSize(new Vector3f(550, 250, 10));
|
rentContainer.setPreferredSize(new Vector3f(550, 250, 10));
|
||||||
|
|
||||||
// Title
|
// 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.setFontSize(48);
|
||||||
title.setColor(ColorRGBA.Black);
|
title.setColor(ColorRGBA.Black);
|
||||||
|
|
||||||
// Rent message
|
// Rent message
|
||||||
Container textContainer = container.addChild(new Container());
|
Container textContainer = rentContainer.addChild(new Container());
|
||||||
textContainer.addChild(new Label(playerName+ " zahlt dir " + amount + " EUR Miete",
|
textContainer.addChild(new Label(playerName + " zahlt dir " + amount + " EUR Miete",
|
||||||
new ElementId("label-Text")));
|
new ElementId("label-Text")));
|
||||||
textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
|
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
|
// Confirmation button
|
||||||
Button payButton = container.addChild(new Button("Bestätigen", new ElementId("button")));
|
Button confirmButton = rentContainer.addChild(new Button("Bestätigen", new ElementId("button")));
|
||||||
payButton.setFontSize(32);
|
confirmButton.setFontSize(32);
|
||||||
payButton.addClickCommands(s -> ifTopDialog( () -> {
|
confirmButton.addClickCommands(s -> ifTopDialog(() -> {
|
||||||
app.getGameLogic().playSound(Sound.BUTTON);
|
app.getGameLogic().playSound(Sound.BUTTON);
|
||||||
close();
|
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.
|
* Closes the popup and removes GUI elements.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
app.getGuiNode().detachChild(rentContainer);
|
|
||||||
app.getGuiNode().detachChild(backgroundContainer);
|
|
||||||
app.getGuiNode().detachChild(overlayBackground);
|
app.getGuiNode().detachChild(overlayBackground);
|
||||||
|
app.getGuiNode().detachChild(backgroundContainer);
|
||||||
|
app.getGuiNode().detachChild(rentContainer);
|
||||||
super.close();
|
super.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,19 +12,16 @@ import com.simsilica.lemur.Label;
|
|||||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
||||||
import com.simsilica.lemur.style.ElementId;
|
import com.simsilica.lemur.style.ElementId;
|
||||||
import pp.dialog.Dialog;
|
import pp.dialog.Dialog;
|
||||||
|
import pp.dialog.PopupDialog;
|
||||||
import pp.monopoly.client.MonopolyApp;
|
import pp.monopoly.client.MonopolyApp;
|
||||||
import pp.monopoly.message.server.TradeReply;
|
import pp.monopoly.message.server.TradeReply;
|
||||||
import pp.monopoly.notification.Sound;
|
import pp.monopoly.notification.Sound;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RejectTrade is a popup that appears when a trade proposal is rejected by another player
|
* RejectTrade is a popup that appears when a trade proposal is rejected by another player.
|
||||||
* in the Monopoly application.
|
* Displays a message indicating the rejection and provides an option to close the popup.
|
||||||
* <p>
|
|
||||||
* 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.
|
|
||||||
* </p>
|
|
||||||
*/
|
*/
|
||||||
public class RejectTrade extends Dialog {
|
public class RejectTrade extends Dialog implements PopupDialog {
|
||||||
/** Reference to the Monopoly application instance. */
|
/** Reference to the Monopoly application instance. */
|
||||||
private final MonopolyApp app;
|
private final MonopolyApp app;
|
||||||
|
|
||||||
@ -32,12 +29,11 @@ public class RejectTrade extends Dialog {
|
|||||||
private final Geometry overlayBackground;
|
private final Geometry overlayBackground;
|
||||||
|
|
||||||
/** Main container for the rejection message content. */
|
/** Main container for the rejection message content. */
|
||||||
private final Container noMoneyWarningContainer;
|
private final Container rejectTradeContainer;
|
||||||
|
|
||||||
/** Background container providing a border for the popup. */
|
/** Background container providing a border for the popup. */
|
||||||
private final Container backgroundContainer;
|
private final Container backgroundContainer;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs the RejectTrade popup displaying the rejection of a trade proposal.
|
* Constructs the RejectTrade popup displaying the rejection of a trade proposal.
|
||||||
*
|
*
|
||||||
@ -48,68 +44,15 @@ public class RejectTrade extends Dialog {
|
|||||||
super(app.getDialogManager());
|
super(app.getDialogManager());
|
||||||
this.app = app;
|
this.app = app;
|
||||||
|
|
||||||
|
|
||||||
// Halbtransparentes Overlay hinzufügen
|
|
||||||
overlayBackground = createOverlayBackground();
|
overlayBackground = createOverlayBackground();
|
||||||
app.getGuiNode().attachChild(overlayBackground);
|
backgroundContainer = createBackgroundContainer();
|
||||||
|
rejectTradeContainer = createRejectTradeContainer(msg);
|
||||||
|
|
||||||
// Create the background container
|
adjustPaddingAndCenter();
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a semi-transparent background overlay for the popup.
|
* Creates the semi-transparent background overlay for the popup.
|
||||||
*
|
*
|
||||||
* @return the geometry of the overlay
|
* @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());
|
Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
|
||||||
Geometry overlay = new Geometry("Overlay", quad);
|
Geometry overlay = new Geometry("Overlay", quad);
|
||||||
Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
|
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);
|
material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
|
||||||
overlay.setMaterial(material);
|
overlay.setMaterial(material);
|
||||||
overlay.setLocalTranslation(0, 0, 0);
|
overlay.setLocalTranslation(0, 0, 0);
|
||||||
return overlay;
|
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.
|
* Closes the menu and removes the GUI elements.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
app.getGuiNode().detachChild(noMoneyWarningContainer); // Entferne das Menü
|
app.getGuiNode().detachChild(overlayBackground);
|
||||||
app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
|
app.getGuiNode().detachChild(backgroundContainer);
|
||||||
app.getGuiNode().detachChild(overlayBackground); // Entferne das Overlay
|
app.getGuiNode().detachChild(rejectTradeContainer);
|
||||||
super.close();
|
super.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@ import com.simsilica.lemur.Label;
|
|||||||
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
import com.simsilica.lemur.component.QuadBackgroundComponent;
|
||||||
import com.simsilica.lemur.style.ElementId;
|
import com.simsilica.lemur.style.ElementId;
|
||||||
import pp.dialog.Dialog;
|
import pp.dialog.Dialog;
|
||||||
|
import pp.dialog.PopupDialog;
|
||||||
import pp.monopoly.client.MonopolyApp;
|
import pp.monopoly.client.MonopolyApp;
|
||||||
import pp.monopoly.notification.Sound;
|
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.
|
* Displays the rent amount and the recipient player's name, with an option to confirm the payment.
|
||||||
* </p>
|
* </p>
|
||||||
*/
|
*/
|
||||||
public class Rent extends Dialog {
|
public class Rent extends Dialog implements PopupDialog {
|
||||||
/** Reference to the Monopoly application instance. */
|
|
||||||
private final MonopolyApp app;
|
private final MonopolyApp app;
|
||||||
|
|
||||||
/** Semi-transparent overlay background for the popup. */
|
|
||||||
private final Geometry overlayBackground;
|
private final Geometry overlayBackground;
|
||||||
|
|
||||||
/** Main container for the rent information and action. */
|
|
||||||
private final Container rentContainer;
|
private final Container rentContainer;
|
||||||
|
|
||||||
/** Background container providing a border for the rent popup. */
|
|
||||||
private final Container backgroundContainer;
|
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) {
|
public Rent(MonopolyApp app, String playerName, int amount) {
|
||||||
super(app.getDialogManager());
|
super(app.getDialogManager());
|
||||||
this.app = app;
|
this.app = app;
|
||||||
|
|
||||||
// Create the overlay
|
// Create the overlay and containers
|
||||||
overlayBackground = createOverlayBackground();
|
overlayBackground = createOverlayBackground();
|
||||||
app.getGuiNode().attachChild(overlayBackground);
|
|
||||||
|
|
||||||
// Create and position the background container
|
|
||||||
backgroundContainer = createBackgroundContainer();
|
backgroundContainer = createBackgroundContainer();
|
||||||
app.getGuiNode().attachChild(backgroundContainer);
|
|
||||||
|
|
||||||
// Create and position the rent container
|
|
||||||
rentContainer = createRentContainer(playerName, amount);
|
rentContainer = createRentContainer(playerName, amount);
|
||||||
app.getGuiNode().attachChild(rentContainer);
|
|
||||||
|
|
||||||
|
// Center containers (positioning logic only, no GUI attachment)
|
||||||
centerContainers();
|
centerContainers();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a semi-transparent overlay background.
|
|
||||||
*
|
|
||||||
* @return the overlay geometry
|
|
||||||
*/
|
|
||||||
private Geometry createOverlayBackground() {
|
private Geometry createOverlayBackground() {
|
||||||
Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
|
Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
|
||||||
Geometry overlay = new Geometry("Overlay", quad);
|
Geometry overlay = new Geometry("Overlay", quad);
|
||||||
Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
|
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);
|
material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
|
||||||
overlay.setMaterial(material);
|
overlay.setMaterial(material);
|
||||||
overlay.setLocalTranslation(0, 0, 0);
|
overlay.setLocalTranslation(0, 0, 0);
|
||||||
return overlay;
|
return overlay;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates the background container with styling.
|
|
||||||
*
|
|
||||||
* @return the styled background container
|
|
||||||
*/
|
|
||||||
private Container createBackgroundContainer() {
|
private Container createBackgroundContainer() {
|
||||||
Container container = new Container();
|
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;
|
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) {
|
private Container createRentContainer(String playerName, int amount) {
|
||||||
Container container = new Container();
|
Container container = new Container();
|
||||||
container.setBackground(new QuadBackgroundComponent(ColorRGBA.Gray));
|
container.setBackground(new QuadBackgroundComponent(ColorRGBA.Gray));
|
||||||
container.setPreferredSize(new Vector3f(550, 250, 10));
|
container.setPreferredSize(new Vector3f(550, 250, 10));
|
||||||
|
|
||||||
// Title
|
|
||||||
Label title = container.addChild(new Label("Miete!", new ElementId("warning-title")));
|
Label title = container.addChild(new Label("Miete!", new ElementId("warning-title")));
|
||||||
title.setFontSize(48);
|
title.setFontSize(48);
|
||||||
title.setColor(ColorRGBA.Black);
|
title.setColor(ColorRGBA.Black);
|
||||||
|
|
||||||
// Rent message
|
|
||||||
Container textContainer = container.addChild(new Container());
|
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")));
|
new ElementId("label-Text")));
|
||||||
textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
|
textContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
|
||||||
textContainer.setPreferredSize(container.getPreferredSize().addLocal(-250, -200, 0));
|
textContainer.setPreferredSize(container.getPreferredSize().addLocal(-250, -200, 0));
|
||||||
|
|
||||||
// Payment button
|
|
||||||
Button payButton = container.addChild(new Button("Überweisen", new ElementId("button")));
|
Button payButton = container.addChild(new Button("Überweisen", new ElementId("button")));
|
||||||
payButton.setFontSize(32);
|
payButton.setFontSize(32);
|
||||||
payButton.addClickCommands(s -> ifTopDialog( () -> {
|
payButton.addClickCommands(s -> ifTopDialog(() -> {
|
||||||
app.getGameLogic().playSound(Sound.BUTTON);
|
app.getGameLogic().playSound(Sound.BUTTON);
|
||||||
close();
|
close();
|
||||||
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
return container;
|
return container;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Centers the rent and background containers on the screen.
|
|
||||||
*/
|
|
||||||
private void centerContainers() {
|
private void centerContainers() {
|
||||||
float padding = 10;
|
float padding = 10;
|
||||||
|
|
||||||
// Center rent container
|
|
||||||
rentContainer.setLocalTranslation(
|
rentContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - rentContainer.getPreferredSize().x) / 2,
|
(app.getCamera().getWidth() - rentContainer.getPreferredSize().x) / 2,
|
||||||
(app.getCamera().getHeight() + rentContainer.getPreferredSize().y) / 2,
|
(app.getCamera().getHeight() + rentContainer.getPreferredSize().y) / 2,
|
||||||
8
|
8
|
||||||
);
|
);
|
||||||
|
|
||||||
// Center background container with padding
|
|
||||||
backgroundContainer.setPreferredSize(rentContainer.getPreferredSize().addLocal(padding, padding, 0));
|
backgroundContainer.setPreferredSize(rentContainer.getPreferredSize().addLocal(padding, padding, 0));
|
||||||
backgroundContainer.setLocalTranslation(
|
backgroundContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - backgroundContainer.getPreferredSize().x) / 2,
|
(app.getCamera().getWidth() - backgroundContainer.getPreferredSize().x) / 2,
|
||||||
@ -146,22 +102,25 @@ public class Rent extends Dialog {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Closes the popup and removes GUI elements.
|
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
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
app.getGuiNode().detachChild(rentContainer);
|
|
||||||
app.getGuiNode().detachChild(backgroundContainer);
|
|
||||||
app.getGuiNode().detachChild(overlayBackground);
|
app.getGuiNode().detachChild(overlayBackground);
|
||||||
|
app.getGuiNode().detachChild(backgroundContainer);
|
||||||
|
app.getGuiNode().detachChild(rentContainer);
|
||||||
super.close();
|
super.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles the escape action to close the dialog.
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public void escape() {
|
public void escape() {
|
||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,14 +128,14 @@ public class RepayMortage extends Dialog {
|
|||||||
repayMortageContainer.setLocalTranslation(
|
repayMortageContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - repayMortageContainer.getPreferredSize().x) / 2,
|
(app.getCamera().getWidth() - repayMortageContainer.getPreferredSize().x) / 2,
|
||||||
(app.getCamera().getHeight() + repayMortageContainer.getPreferredSize().y) / 2,
|
(app.getCamera().getHeight() + repayMortageContainer.getPreferredSize().y) / 2,
|
||||||
9
|
8
|
||||||
);
|
);
|
||||||
|
|
||||||
// Zentriere das Popup
|
// Zentriere das Popup
|
||||||
backgroundContainer.setLocalTranslation(
|
backgroundContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - repayMortageContainer.getPreferredSize().x - padding) / 2,
|
(app.getCamera().getWidth() - repayMortageContainer.getPreferredSize().x - padding) / 2,
|
||||||
(app.getCamera().getHeight() + repayMortageContainer.getPreferredSize().y+ padding) / 2,
|
(app.getCamera().getHeight() + repayMortageContainer.getPreferredSize().y+ padding) / 2,
|
||||||
8
|
7
|
||||||
);
|
);
|
||||||
|
|
||||||
app.getGuiNode().attachChild(repayMortageContainer);
|
app.getGuiNode().attachChild(repayMortageContainer);
|
||||||
|
@ -128,14 +128,14 @@ public class SellHouse extends Dialog {
|
|||||||
sellhouseContainer.setLocalTranslation(
|
sellhouseContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - sellhouseContainer.getPreferredSize().x) / 2,
|
(app.getCamera().getWidth() - sellhouseContainer.getPreferredSize().x) / 2,
|
||||||
(app.getCamera().getHeight() + sellhouseContainer.getPreferredSize().y) / 2,
|
(app.getCamera().getHeight() + sellhouseContainer.getPreferredSize().y) / 2,
|
||||||
9
|
8
|
||||||
);
|
);
|
||||||
|
|
||||||
// Zentriere das Popup
|
// Zentriere das Popup
|
||||||
backgroundContainer.setLocalTranslation(
|
backgroundContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - sellhouseContainer.getPreferredSize().x - padding) / 2,
|
(app.getCamera().getWidth() - sellhouseContainer.getPreferredSize().x - padding) / 2,
|
||||||
(app.getCamera().getHeight() + sellhouseContainer.getPreferredSize().y+ padding) / 2,
|
(app.getCamera().getHeight() + sellhouseContainer.getPreferredSize().y+ padding) / 2,
|
||||||
8
|
7
|
||||||
);
|
);
|
||||||
|
|
||||||
app.getGuiNode().attachChild(sellhouseContainer);
|
app.getGuiNode().attachChild(sellhouseContainer);
|
||||||
|
@ -129,14 +129,14 @@ public class TakeMortage extends Dialog {
|
|||||||
takeMortageContainer.setLocalTranslation(
|
takeMortageContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - takeMortageContainer.getPreferredSize().x) / 2,
|
(app.getCamera().getWidth() - takeMortageContainer.getPreferredSize().x) / 2,
|
||||||
(app.getCamera().getHeight() + takeMortageContainer.getPreferredSize().y) / 2,
|
(app.getCamera().getHeight() + takeMortageContainer.getPreferredSize().y) / 2,
|
||||||
9
|
8
|
||||||
);
|
);
|
||||||
|
|
||||||
// Zentriere das Popup
|
// Zentriere das Popup
|
||||||
backgroundContainer.setLocalTranslation(
|
backgroundContainer.setLocalTranslation(
|
||||||
(app.getCamera().getWidth() - takeMortageContainer.getPreferredSize().x - padding) / 2,
|
(app.getCamera().getWidth() - takeMortageContainer.getPreferredSize().x - padding) / 2,
|
||||||
(app.getCamera().getHeight() + takeMortageContainer.getPreferredSize().y+ padding) / 2,
|
(app.getCamera().getHeight() + takeMortageContainer.getPreferredSize().y+ padding) / 2,
|
||||||
8
|
7
|
||||||
);
|
);
|
||||||
|
|
||||||
app.getGuiNode().attachChild(takeMortageContainer);
|
app.getGuiNode().attachChild(takeMortageContainer);
|
||||||
|
Binary file not shown.
After Width: | Height: | Size: 1.8 MiB |
Binary file not shown.
After Width: | Height: | Size: 1.6 MiB |
Binary file not shown.
After Width: | Height: | Size: 1.6 MiB |
Binary file not shown.
After Width: | Height: | Size: 1.7 MiB |
Binary file not shown.
@ -54,7 +54,7 @@ public class BoardManager {
|
|||||||
fields.add(new EventField("Üvas", 22));
|
fields.add(new EventField("Üvas", 22));
|
||||||
fields.add(new BuildingProperty("StudFBer B", 23, 2200, 180, 1500, FieldColor.RED));
|
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 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("Cascada", 26, 2600, 220, 1500, FieldColor.YELLOW));
|
||||||
fields.add(new BuildingProperty("Fakultätsgebäude", 27, 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));
|
fields.add(new FoodField("Truppenküche", 28));
|
||||||
|
Loading…
Reference in New Issue
Block a user