This commit is contained in:
Johannes Schmelz
2024-12-12 17:38:46 +01:00
parent 7c79bb77e7
commit e2db058fc7
78 changed files with 1087 additions and 369 deletions

View File

@@ -69,8 +69,14 @@ public class BoardAppState extends MonopolyAppState {
*/
private PopUpManager popUpManager;
/**
* The camera controller for managing the camera's position and orientation.
*/
private CameraController cameraController;
/**
* The input handler for controlling the camera's movement and rotation.
*/
private CameraInputHandler cameraInputHandler;
@@ -251,7 +257,7 @@ public class BoardAppState extends MonopolyAppState {
rotation.fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_Y);
seaGeo.setLocalRotation(rotation);
final Material seaMat = new Material(getApp().getAssetManager(), "Common/MatDefs/Light/Lighting.j3md");
Texture texture = getApp().getAssetManager().loadTexture("Pictures/board2.png");
Texture texture = getApp().getAssetManager().loadTexture(BoardTexture);
seaMat.setTexture("DiffuseMap", texture);
seaGeo.setMaterial(seaMat);
seaGeo.setShadowMode(ShadowMode.CastAndReceive);
@@ -261,9 +267,13 @@ public class BoardAppState extends MonopolyAppState {
sceneNode.attachChild(seaGeo);
// Schneefall hinzufügen
// addSnowEffect(sceneNode);
addSnowEffect(sceneNode);
}
/**
* Creates a card deck with six event and six community cards.
* @return the node containing the card deck
*/
private Node createCardDeck() {
Node cardDeck = new Node("cardDeck");
@@ -304,6 +314,10 @@ public class BoardAppState extends MonopolyAppState {
return cardDeck;
}
/**
* Adds a snow effect to the scene by creating a particle emitter with snowflakes.
* @param parentNode the parent node to attach the snow effect to
*/
private void addSnowEffect(Node parentNode) {
// ParticleEmitter für Schnee
ParticleEmitter snowEmitter = new ParticleEmitter("Snow", ParticleMesh.Type.Triangle, 5000);
@@ -332,7 +346,12 @@ public class BoardAppState extends MonopolyAppState {
// Emitter zur Szene hinzufügen
parentNode.attachChild(snowEmitter);
}
/**
* Updates the state by moving the camera and updating the visual elements.
*
* @param tpf the time per frame
*/
@Override
public void update(float tpf) {
super.update(tpf);

View File

@@ -48,16 +48,27 @@ public class GameSound extends AbstractAppState implements GameEventListener {
*/
private static final String VOLUME_PREF = "volume"; //NON-NLS
/** The sound effect for passing the start field. */
private AudioNode passStartSound;
/** The sound effect for drawing an event card. */
private AudioNode eventCardSound;
/** The sound effect for going to the gulag. */
private AudioNode gulagSound;
/** The sound effect for rolling the dice. */
private AudioNode diceRollSound;
/** The sound effect for collecting money. */
private AudioNode moneyCollectSound;
/** The sound effect for losing money. */
private AudioNode moneyLostSound;
/** The sound effect for accepting a trade. */
private AudioNode tradeAcceptedSound;
/** The sound effect for rejecting a trade. */
private AudioNode tradeRejectedSound;
/** The sound effect for winning the game. */
private AudioNode winnerSound;
/** The sound effect for loosing the game. */
private AudioNode looserSound;
/** The sound effect for pressing a button. */
private AudioNode buttonSound;
/**

View File

@@ -172,16 +172,19 @@ public class MonopolyApp extends SimpleApplication implements MonopolyClient, Ga
private AppSettings makeSettings() {
final AppSettings settings = new AppSettings(true);
settings.setTitle(lookup("monopoly.name"));
try {
// Prüfen, ob das Betriebssystem ein Mac-System ist
if (!System.getProperty("os.name").toLowerCase().contains("mac")) {
settings.setIcons(new Image[]{ImageIO.read(new File("src/main/resources/icons/Uniman.png"))});
} else {
LOGGER.log(Level.INFO, "Icon setting skipped on macOS due to system restrictions.");
}
} catch (IOException e) {
LOGGER.log(Level.ERROR, e.getMessage());
}
// Set the icon for the application window
// try {
// // Prüfen, ob das Betriebssystem ein Mac-System ist
// if (!System.getProperty("os.name").toLowerCase().contains("mac")) {
// settings.setIcons(new Image[]{ImageIO.read(new File("src/main/resources/icons/Uniman.png"))});
// } else {
// LOGGER.log(Level.INFO, "Icon setting skipped on macOS due to system restrictions.");
// }
// } catch (IOException e) {
// LOGGER.log(Level.ERROR, e.getMessage());
// }
settings.setResolution(config.getResolutionWidth(), config.getResolutionHeight());
settings.setFullscreen(config.fullScreen());
settings.setUseRetinaFrameBuffer(config.useRetinaFrameBuffer());

View File

@@ -27,15 +27,32 @@ import pp.monopoly.notification.EventCardEvent;
import pp.monopoly.notification.GameEventListener;
import pp.monopoly.notification.PopUpEvent;
/**
* This class is responsible for managing the popups that are shown to the user.
* It listens for events that require a popup to be shown and then shows the
* appropriate popup.
*/
public class PopUpManager implements GameEventListener {
/** The MonopolyApp instance */
private final MonopolyApp app;
/**
* Constructor for the PopUpManager.
*
* @param app The MonopolyApp instance
*/
public PopUpManager(MonopolyApp app) {
this.app = app;
app.getGameLogic().addListener(this);
}
/**
* This method is called when a PopUpEvent is received.
* It checks the message of the event and shows the appropriate popup.
*
* @param event The PopUpEvent
*/
@Override
public void receivedEvent(PopUpEvent event) {
if (event.msg().equals("Buy")) {
@@ -84,6 +101,12 @@ public class PopUpManager implements GameEventListener {
}
}
/**
* This method is called when an EventCardEvent is received.
* It shows the EventCardPopup.
*
* @param event The EventCardEvent
*/
@Override
public void receivedEvent(EventCardEvent event) {
Timer timer = new Timer();

View File

@@ -17,18 +17,35 @@ import pp.monopoly.model.Figure;
import pp.monopoly.model.Hotel;
import pp.monopoly.model.House;
import pp.monopoly.model.Item;
import pp.monopoly.notification.UpdatePlayerView;
/**
* The {@code BobTheBuilder} class is responsible for synchronizing the graphical
* representation of the figures and buildings on the board with the underlying data model.
* It extends the {@link GameBoardSynchronizer} to provide specific synchronization
* logic for the board.
*/
public class BobTheBuilder extends GameBoardSynchronizer {
/** The String representing the path to the unshaded material*/
private static final String UNSHADED = "Common/MatDefs/Misc/Unshaded.j3md"; //NON-NLS
/** The String representing the color parameter in the material*/
private static final String COLOR = "Color"; //NON-NLS
/** The String representing the figure node*/
private static final String FIGURE = "figure"; //NON-NLS
/** The String representing the house node*/
private static final String HOUSE = "house"; //NON-NLS
/** The String representing the hotel node*/
private static final String HOTEL = "hotel"; //NON-NLS
/** The {@link MonopolyApp} instance*/
private final MonopolyApp app;
/**
* Creates a new {@code BobTheBuilder} instance with the specified {@link MonopolyApp} and root node.
*
* @param app the {@link MonopolyApp} instance
* @param root the root node of the scene graph
*/
public BobTheBuilder(MonopolyApp app, Node root) {
super(app.getGameLogic().getBoard(), root);
this.app = app;
@@ -83,16 +100,33 @@ public class BobTheBuilder extends GameBoardSynchronizer {
return node;
}
/**
* Creates a new spatial to represent the specified figure.
*
* @param figure the figure to be represented
* @return the geometry representing the figure
*/
private Spatial createFigure(Figure figure) {
// Lade das Modell
Spatial model = app.getAssetManager().loadModel("models/" + "Spielfiguren/" + figure.getType() + "/" + figure.getType() + ".j3o");
Spatial model;
// Skaliere und positioniere das Modell
model.scale(0.5f);
try {
// Lade das Modell
model = app.getAssetManager().loadModel("models/" + "Spielfiguren/" + figure.getType() + "/" + figure.getType() + ".j3o");
// Skaliere und positioniere das Modell
model.scale(0.5f);
} catch (Exception e) {
model = createBox(figure);
}
return model;
}
/**
* Creates a new spatial to represent the specified hotel.
* @param hotel the hotel to be represented
* @return the geometry representing the hotel
*/
private Spatial createHotel(Hotel hotel) {
Spatial model = app.getAssetManager().loadModel("models/Hotel/Hotel.j3o");
model.scale(0.2f);
@@ -100,7 +134,11 @@ public class BobTheBuilder extends GameBoardSynchronizer {
return model;
}
/**
* Creates a new spatial to represent the specified house.
* @param house the house to be represented
* @return the geometry representing the house
*/
private Spatial createHouse(House house) {
Spatial model = app.getAssetManager().loadModel("models/Haus/"+house.getStage()+"Haus.j3o");
model.scale(0.5f);

View File

@@ -191,9 +191,6 @@ public class BuildingAdminMenu extends Dialog {
app.getGuiNode().attachChild(background);
}
/**
* Closes the building administration menu and detaches its elements from the GUI.
*/
@Override
public void close() {
app.getGuiNode().detachChild(mainContainer);
@@ -201,21 +198,8 @@ public class BuildingAdminMenu extends Dialog {
super.close();
}
/**
* Opens the settings menu when the escape key is pressed.
*/
@Override
public void escape() {
new SettingsMenu(app).open();
}
/**
* Periodic updates for the menu, if required.
*
* @param delta Time since the last update in seconds.
*/
@Override
public void update(float delta) {
// Periodic updates if necessary
}
}

View File

@@ -3,25 +3,39 @@ package pp.monopoly.client.gui;
import com.jme3.math.Vector3f;
import com.jme3.renderer.Camera;
import pp.monopoly.client.MonopolyApp; // Import MonopolyApp
import pp.monopoly.client.MonopolyApp;
import pp.monopoly.game.server.PlayerHandler;
import pp.monopoly.notification.GameEventListener;
import pp.monopoly.notification.UpdatePlayerView;
/**
* Represents a camera controller for the Monopoly application.
*/
public class CameraController implements GameEventListener{
/**
* Enum representing the camera mode for the CameraController.
*/
public enum CameraMode {
FOCUS_CURRENT_PLAYER,
FOCUS_SELF,
FREECAM
}
/** The camera to control */
private final Camera camera;
/** The current camera mode */
private CameraMode currentMode;
/** The player handler instance */
private PlayerHandler playerHandler;
/** The {@link MonopolyApp} instance*/
private final MonopolyApp app;
private PlayerHandler playerHandler; // Reference to PlayerHandler for player data
private final MonopolyApp app; // Reference to MonopolyApp for self ID
/**
* Constructs a new CameraController instance.
* @param camera The camera to control
* @param app The MonopolyApp instance
*/
public CameraController(Camera camera, MonopolyApp app) {
this.camera = camera;
this.playerHandler = app.getGameLogic().getPlayerHandler();
@@ -30,10 +44,28 @@ public class CameraController implements GameEventListener{
setMode(CameraMode.FOCUS_SELF); // Initialize the camera mode
}
/**
* Sets the camera mode to the specified mode.
* @param mode The camera mode to set
*/
public void setMode(CameraMode mode) {
this.currentMode = mode;
}
/**
* Updates the camera behavior based on the current mode and the time-per-frame (tpf).
* <p>
* This method checks the current mode of the camera and updates its position or behavior accordingly.
* Supported modes include:
* <ul>
* <li>FOCUS_CURRENT_PLAYER: Updates the camera position to focus on the current player.</li>
* <li>FOCUS_SELF: Updates the camera position to focus on the self (the object controlled by the player).</li>
* <li>FREECAM: Leaves the camera position unchanged, allowing free movement.</li>
* </ul>
*
* @param tpf The time-per-frame value, typically provided by the game engine,
* which represents the elapsed time since the last frame.
*/
public void update(float tpf) {
switch (currentMode) {
@@ -53,6 +85,9 @@ public class CameraController implements GameEventListener{
}
}
/**
* Updates the camera position depending on the current mode.
*/
public void updatePosition() {
Vector3f newPosition = getPos();
camera.setLocation(newPosition);
@@ -61,6 +96,10 @@ public class CameraController implements GameEventListener{
camera.update();
}
/**
* Returns the position for the camera depending on the current mode.
* @return The position for the camera
*/
private Vector3f getPos() {
Vector3f pos = new Vector3f();
switch (currentMode) {
@@ -83,6 +122,10 @@ public class CameraController implements GameEventListener{
}
/**
* Calculates the offset for the camera depending on the field the player is on.
* @return The offset for the camera
*/
private Vector3f getOffset() {
Vector3f offset = new Vector3f();

View File

@@ -5,9 +5,19 @@ import com.jme3.input.KeyInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger;
/**
* Class to handle the input for the camera.
*/
public class CameraInputHandler {
/**The camera controller */
private CameraController cameraController;
/**
* Constructor for the CameraInputHandler.
* @param cameraController The camera controller.
* @param inputManager The input manager.
*/
public CameraInputHandler(CameraController cameraController, InputManager inputManager) {
this.cameraController = cameraController;
@@ -19,6 +29,9 @@ public class CameraInputHandler {
inputManager.addListener(actionListener, "FocusCurrentPlayer", "FocusSelf", "FreeCam");
}
/**
* ActionListener for the camera.
*/
private final ActionListener actionListener = (name, isPressed, tpf) -> {
if (!isPressed) return;

View File

@@ -22,21 +22,34 @@ import pp.monopoly.message.client.ViewAssetsRequest;
import pp.monopoly.model.TradeHandler;
import pp.monopoly.notification.Sound;
/**
* Dialog for choosing a trade partner.
*/
public class ChoosePartner extends Dialog {
/** The {@link MonopolyApp} instance*/
private final MonopolyApp app;
/** Selector for selecting the player */
private Selector<String> playerSelector;
/** Button for cancel*/
private final Button cancelButton = new Button("Abbrechen");
/** Button for confirm*/
private final Button confirmButton = new Button("Bestätigen");
/** Main container for the UI components */
private final Container mainContainer;
/** Container for the lower left menu */
private Container lowerLeftMenu;
/** Container for the lower right menu */
private Container lowerRightMenu;
/** The background image */
private Geometry background;
/** The trade handler */
private TradeHandler tradeHandler;
private VersionedReference<Set<Integer>> selectionRef; // Reference to track selector changes
private String lastSelected = ""; // To keep track of the last selected value
QuadBackgroundComponent translucentWhiteBackground =
new QuadBackgroundComponent(new ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f));
/** Reference to track selector changes */
private VersionedReference<Set<Integer>> selectionRef;
/** The last selected value */
private String lastSelected = "";
/** The translucent white background */
private QuadBackgroundComponent translucentWhiteBackground = new QuadBackgroundComponent(new ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f));
/**
* Constructs the ChoosePartner dialog.
@@ -169,9 +182,6 @@ public class ChoosePartner extends Dialog {
app.getGuiNode().attachChild(background);
}
/**
* Handles the escape action for the dialog.
*/
@Override
public void escape() {
new SettingsMenu(app).open();

View File

@@ -38,18 +38,31 @@ import pp.dialog.DialogBuilder;
* Allows users to specify the host and port for connecting to a game server.
*/
public class CreateGameMenu extends Dialog {
/** The Logger for this class */
private static final Logger LOGGER = System.getLogger(CreateGameMenu.class.getName());
/** A string represing the localhost default */
private static final String LOCALHOST = "localhost"; //NON-NLS
/** A string representing the default port number */
private static final String DEFAULT_PORT = "42069"; //NON-NLS
/** The NetworkSupport instance to be used for network operations */
private final NetworkSupport network;
/** The text field for the host name */
private final TextField host = new TextField(LOCALHOST);
/** The text field for the port number */
private final TextField port = new TextField(DEFAULT_PORT);
/** The button for starting the server */
private final Button serverButton = new Button("Selber hosten");
/** The button for canceling the connection */
private final Button cancelButton = new Button("Abbrechen");
/** The button for joining a game */
private final Button joinButton = new Button("Beitreten");
/** The hostname of the server */
private String hostname;
/** The port number of the server */
private int portNumber;
/** The future representing the connection to the server */
private Future<Object> connectionFuture;
/** The dialog for indicating that the connection is in progress */
private Dialog progressDialog;
/**

View File

@@ -9,31 +9,49 @@ import com.jme3.scene.Node;
import com.jme3.scene.control.AbstractControl;
import pp.monopoly.client.MonopolyApp;
import pp.monopoly.game.client.ClientGameLogic;
import pp.monopoly.model.Figure;
import pp.monopoly.notification.GameEventListener;
import pp.monopoly.notification.UpdatePlayerView;
// import java.lang.System.Logger;
// import java.lang.System.Logger.Level;
import java.lang.System.Logger;
import java.lang.System.Logger.Level;
import java.util.LinkedList;
import java.util.Queue;
/**
* Control class for the figure objects.
*
* Handles the movement of the figure along a path.
*
*/
public class FigureControl extends AbstractControl implements GameEventListener {
// // // private static final Logger LOGGER = System.getLogger(FigureControl.class.getName());
/** The Logger for this class */
private static final Logger LOGGER = System.getLogger(FigureControl.class.getName());
/** The Figure object to control */
private final Figure figure;
/** The spatial object of the figure*/
private final Node spatial;
/** The MonopolyApp instance */
private final MonopolyApp app;
private Queue<Vector3f> path; // Path to follow
/** The path to follow */
private Queue<Vector3f> path;
/** The current target position */
private Vector3f currentTarget;
private float animationTime = 0f; // Time elapsed for the current movement
private final float durationPerField = 0.5f; // Time to move between fields
private float delayTime = 3f; // Verzögerung in Sekunden
private float delayElapsed = 0f; // Zeit, die seit dem Start der Verzögerung vergangen ist
/** The time elapsed for the current movement */
private float animationTime = 0f;
/** The duration per field */
private final float durationPerField = 0.5f;
/** The delay time */
private float delayTime = 3f;
/** The delay elapsed time */
private float delayElapsed = 0f;
/**
* Constructor for the FigureControl class
* @param spatial The spatial object of the figure
* @param figure The figure object
* @param app The MonopolyApp object
*/
public FigureControl(Node spatial, Figure figure, MonopolyApp app) {
super();
this.figure = figure;
@@ -43,6 +61,14 @@ public class FigureControl extends AbstractControl implements GameEventListener
app.getGameLogic().addListener(this);
}
/**
* Updates the figure's movement along a path.
*
* Handles movement delays, rotates at specific fields (0, 10, 20, 30),
* and moves the figure with a hop effect toward the next target.
*
* @param tpf Time-per-frame since the last update.
*/
@Override
protected void controlUpdate(float tpf) {
if (delayTime > 0) {
@@ -61,7 +87,6 @@ public class FigureControl extends AbstractControl implements GameEventListener
// Prüfe, ob eine Drehung erforderlich ist (Felder 0, 10, 20, 30)
int currentField = figure.getCurrentFieldID();
int nextField = nextField(currentField);
if ((nextField(currentField) == 10) ||
(nextField(currentField) == 20) ||
@@ -100,8 +125,11 @@ public class FigureControl extends AbstractControl implements GameEventListener
}
}
/**
* Calculate the next field on the board
* @param currentField The current field id
* @return The next field id
*/
private int nextField(int currentField) {
return (currentField + 1) % 40;
}
@@ -113,35 +141,40 @@ public class FigureControl extends AbstractControl implements GameEventListener
// No rendering logic required
}
/**
* Set the path for the figure to follow
* @param startField The field the figure is currently on
* @param endField The field the figure should move to
*/
public void setPath(int startField, int endField) {
// LOGGER.log(Level.TRACE, "setPath called with startField: {0} to endField {1}", startField, endField);
LOGGER.log(Level.TRACE, "setPath called with startField: {0} to endField {1}", startField, endField);
path.clear();
for (int fieldId = startField; fieldId != endField; fieldId = (fieldId + 1) % 40) {
Vector3f position = figure.calculateFieldPosition(fieldId);
// LOGGER.log(Level.DEBUG, "Adding postition to path: {0}", position);
LOGGER.log(Level.DEBUG, "Adding postition to path: {0}", position);
path.add(position);
}
Vector3f finalPosition = figure.calculateFieldPosition(endField);
path.add(finalPosition);
// LOGGER.log(Level.DEBUG, "Final position added to path: {0}", finalPosition);
LOGGER.log(Level.DEBUG, "Final position added to path: {0}", finalPosition);
// LOGGER.log(Level.TRACE, "Path size: {0}", path.size());
LOGGER.log(Level.TRACE, "Path size: {0}", path.size());
}
@Override
public void receivedEvent(UpdatePlayerView event) {
// LOGGER.log(Level.TRACE, "receivedEvent called with event: {0}", event);
LOGGER.log(Level.TRACE, "receivedEvent called with event: {0}", event);
int newPos = app.getGameLogic().getPlayerHandler().getPlayerById(figure.getId()).getFieldID();
int currentField = figure.getCurrentFieldID();
if (currentField == newPos) {
// LOGGER.log(Level.DEBUG, "No movement required. Current field: {0}, New field: {1}", currentField, newPos);
LOGGER.log(Level.DEBUG, "No movement required. Current field: {0}, New field: {1}", currentField, newPos);
return;
}
// LOGGER.log(Level.DEBUG, "Movement required. Current field: {0}, New field: {1}", currentField, newPos);
LOGGER.log(Level.DEBUG, "Movement required. Current field: {0}, New field: {1}", currentField, newPos);
setPath(currentField, newPos);
@@ -150,9 +183,4 @@ public class FigureControl extends AbstractControl implements GameEventListener
}
}

View File

@@ -4,26 +4,23 @@ import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import pp.monopoly.model.Item;
import pp.monopoly.model.Visitor;
import pp.monopoly.notification.DiceRollEvent;
import pp.monopoly.notification.GameEventListener;
import pp.monopoly.notification.ItemAddedEvent;
import pp.monopoly.notification.ItemRemovedEvent;
import pp.monopoly.notification.UpdatePlayerView;
import pp.monopoly.model.Board;
import pp.monopoly.model.Figure;
import pp.view.ModelViewSynchronizer;
/**
* Abstract base class for synchronizing the visual representation of a {@link Board} with its model state.
* This class handles the addition and removal of items from the board, ensuring that changes in the model
* are accurately reflected in the view.
* <p>
*
* Subclasses are responsible for providing the specific implementation of how each item in the map
* is represented visually by implementing the {@link Visitor} interface.
* </p>
*
*/
abstract class GameBoardSynchronizer extends ModelViewSynchronizer<Item> implements Visitor<Spatial>, GameEventListener {
// The board that this synchronizer is responsible for
/** The board that this synchronizer is responsible for*/
protected final Board board;
/**

View File

@@ -9,12 +9,24 @@ import pp.monopoly.game.server.Player;
import pp.monopoly.game.server.PlayerColor;
import pp.monopoly.notification.Sound;
/**
* A custom button class that uses images for its appearance. The button's appearance changes based on its state (enabled,
*/
public class ImageButton extends Button {
/** The MonopolyApp instance */
private final MonopolyApp app;
/** The button's functionality (e.g., "end_turn", "roll_dice") */
private final String functionality;
/** The player's color */
private final PlayerColor playerColor;
/**
* Creates a new ImageButton with the given functionality and MonopolyApp instance.
*
* @param functionality the button's functionality (e.g., "end_turn", "roll_dice")
* @param app the MonopolyApp instance
*/
public ImageButton(String functionality, MonopolyApp app) {
super("", "button-clear");
this.app = app;
@@ -82,10 +94,12 @@ public class ImageButton extends Button {
ENABLED, DISABLED, HOVER
}
@Override
public void addClickCommands( Command<? super Button> command ) {
super.addCommands(ButtonAction.Down, command);
}
@Override
@SuppressWarnings("unchecked") // because Java doesn't like var-arg generics
public void addClickCommands( Command<? super Button>... commands ) {
super.addCommands(ButtonAction.Down, commands);

View File

@@ -32,10 +32,10 @@ import java.util.Set;
/**
* Represents the lobby menu in the Monopoly application.
* <p>
*
* Provides functionality for player configuration, including input for starting capital,
* player name, and figure selection, as well as options to ready up or exit the game.
* </p>
*
*/
public class LobbyMenu extends Dialog {
@@ -270,9 +270,6 @@ public class LobbyMenu extends Dialog {
app.getGameLogic().send(new PlayerReady(true, playerInputField.getText(), figure, Integer.parseInt(startingCapital.getText())));
}
/**
* Opens the settings menu when the escape key is pressed.
*/
@Override
public void escape() {
new SettingsMenu(app).open();
@@ -291,11 +288,6 @@ public class LobbyMenu extends Dialog {
}
}
/**
* Closes the current menu and transitions music playback.
* Stops the secondary music (if playing) and resumes the main background music
* if music is enabled in the preferences. Ensures smooth transitions in audio.
*/
@Override
public void close() {
GameMusic music = app.getStateManager().getState(GameMusic.class);

View File

@@ -28,10 +28,15 @@ import java.util.stream.Collectors;
* PropertyOverviewMenu is a dialog for displaying the player's properties in the game.
*/
public class PropertyOverviewMenu extends Dialog {
/** The MonopolyApp instance */
private final MonopolyApp app;
/** The main container for the menu layout */
private final Container mainContainer;
/** The container for displaying the "Gebäude" cards */
private final Container displayContainer;
/** The horizontal slider for scrolling through cards */
private final Slider horizontalSlider;
/** The list of cards to display */
private final List<Container> cards;
/**
@@ -124,6 +129,9 @@ public class PropertyOverviewMenu extends Dialog {
/**
* Creates a card for BuildingProperty with detailed rent and cost information.
*
* @param field The BuildingProperty to create a card for.
* @return The created card container.
*/
private Container createBuildingCard(BuildingProperty field) {
Container card = new Container();
@@ -156,6 +164,9 @@ public class PropertyOverviewMenu extends Dialog {
/**
* Creates a card for FoodField with dynamic pricing and rent details.
*
* @param field The FoodField to create a card for.
* @return The created card container.
*/
private Container createFoodFieldCard(FoodField field) {
Container card = new Container();
@@ -188,6 +199,9 @@ public class PropertyOverviewMenu extends Dialog {
/**
* Creates a card for GateField with rent details for owning multiple gates.
*
* @param field The GateField to create a card for.
* @return The created card container.
*/
private Container createGateFieldCard(GateField field) {
Container card = new Container();
@@ -260,9 +274,6 @@ public class PropertyOverviewMenu extends Dialog {
}
/**
* Closes the dialog and detaches it from the GUI node.
*/
@Override
public void close() {
app.getGuiNode().detachChild(mainContainer);

View File

@@ -136,9 +136,6 @@ public class SettingsMenu extends Dialog {
update();
}
/**
* As an escape action, this method closes the menu if it is the top dialog.
*/
@Override
public void escape() {
close();

View File

@@ -3,12 +3,15 @@ package pp.monopoly.client.gui;
import com.simsilica.lemur.Slider;
import pp.monopoly.client.GameSound;
/**
* A slider for the sound effects volume.
*/
public class SoundSlider extends Slider {
/**
* Manages sound effects for the game.
*/
private final pp.monopoly.client.GameSound sound;
private final GameSound sound;
/**
* Volume level for the game sounds.

View File

@@ -20,6 +20,9 @@ import pp.monopoly.notification.Sound;
* Constructs the startup menu dialog for the Monopoly application.
*/
public class StartMenu extends Dialog {
/**
* The Monopoly application instance.
*/
private final MonopolyApp app;
/**
@@ -105,17 +108,11 @@ public class StartMenu extends Dialog {
app.getGuiNode().attachChild(unibwContainer);
}
/**
* Opens the settings menu when the escape key is pressed.
*/
@Override
public void escape() {
new SettingsMenu(app).open();
}
/**
* Closes the startup menu and detaches all GUI elements.
*/
@Override
public void close() {
app.getGuiNode().detachAllChildren();

View File

@@ -273,17 +273,21 @@ public class Toolbar extends Dialog implements GameEventListener {
* Handles the dice roll event.
*/
private void handleDiceRoll() {
ifTopDialog(() -> {
if (!canRollDice) return;
canRollDice = false;
if (endTurnButton != null) endTurnButton.setEnabled(true);
startDiceAnimation();
app.getGameLogic().send(new RollDice());
app.getGameLogic().playSound(Sound.BUTTON);
});
}
ifTopDialog(() -> {
if (!canRollDice) return;
canRollDice = false;
if (endTurnButton != null) endTurnButton.setEnabled(true);
startDiceAnimation();
app.getGameLogic().send(new RollDice());
app.getGameLogic().playSound(Sound.BUTTON);
});
}
/**
* Creates the trade button.
*
* @return The trade button.
*/
private Button createTradeButton() {
String iconPath = "icons/icon-handeln.png";
// createActionButton(playerColor, "icons/icon-handeln.png", 100, () -> new ChoosePartner(app).open());
@@ -304,7 +308,11 @@ public class Toolbar extends Dialog implements GameEventListener {
return tradeButton;
}
/**
* Creates the property menu button.
*
* @return The property menu button.
*/
private Button createPropertyMenuButton() {
String iconPath = "icons/icon-gebaude.png";
@@ -324,6 +332,11 @@ public class Toolbar extends Dialog implements GameEventListener {
return propertyMenuButton;
}
/**
* Creates the end turn button.
*
* @return The end turn button.
*/
private Button createEndTurnButton() {
// return createActionButton(playerColor, "icons/icon-zugbeenden.png", 75, () -> handleEndTurn());
@@ -525,18 +538,11 @@ public class Toolbar extends Dialog implements GameEventListener {
endTurnButton.setEnabled(false);
}
/**
* Closes the toolbar, detaching it from the GUI.
*/
@Override
public void close() {
app.getGuiNode().detachChild(toolbarContainer);
super.close();
}
/**
* Opens the settings menu when the escape key is pressed.
*/
@Override
public void escape() {
new SettingsMenu(app).open();

View File

@@ -30,10 +30,10 @@ import java.util.stream.Collectors;
/**
* Represents the trade menu dialog in the Monopoly application.
* <p>
*
* Facilitates trade interactions between players, including selection of properties,
* currency, and special cards for offers and requests.
* </p>
*
*/
public class TradeMenu extends Dialog {
@@ -48,17 +48,26 @@ public class TradeMenu extends Dialog {
/** Background geometry for the menu. */
private Geometry background;
/** The building and card selector for the left column. */
private Selector<String> leftBuildingSelector, leftSpecialCardSelector;
/** The building and card selector for the right column. */
private Selector<String> rightBuildingSelector, rightSpecialCardSelector;
/** The labels for displaying selected properties. */
private Label leftSelectionsLabel, rightSelectionsLabel;
/** The text fields for currency input. */
private TextField leftCurrencyInput, rightCurrencyInput;
/** References for tracking UI changes. */
private VersionedReference<Set<Integer>> leftBuildingRef, rightBuildingRef;
/** References for tracking UI changes. */
private VersionedReference<Set<Integer>> leftCardRef, rightCardRef;
/** The selected buildings for the trade. */
private Set<String> rightselBuildings = new HashSet<>();
/** The selected buildings for the trade. */
private Set<String> leftselBuildings = new HashSet<>();
/** The color for the trade menu background. */
private static final ColorRGBA TRANSLUCENT_WHITE = new ColorRGBA(1, 1, 1, 0.5f);
/**
@@ -80,7 +89,11 @@ public class TradeMenu extends Dialog {
initializeReferences();
}
/** Creates the main container for the trade menu UI. */
/**
* Creates the main container for the trade menu.
* @return the created main container
*/
private Container createMainContainer() {
Container container = new Container(new SpringGridLayout(Axis.Y, Axis.X));
container.setPreferredSize(new Vector3f(1200, 800, 0));
@@ -90,7 +103,11 @@ public class TradeMenu extends Dialog {
container.addChild(createMainContent());
return container;
}
/** Creates the header label for the trade menu. */
/**
* Creates the header label for the trade menu.
* @return the created header label
*/
private Label createHeader() {
Label header = new Label("Handelsmenü", new ElementId("label-Bold"));
header.setFontSize(50);
@@ -98,7 +115,11 @@ public class TradeMenu extends Dialog {
header.setBackground(new QuadBackgroundComponent(TRANSLUCENT_WHITE));
return header;
}
/** Creates the main content section of the trade menu. */
/**
* Creates the main content for the trade menu.
* @return the created main content container
*/
private Container createMainContent() {
Container mainContent = new Container(new SpringGridLayout(Axis.X, Axis.Y));
mainContent.setPreferredSize(new Vector3f(1200, 700, 0));
@@ -110,7 +131,9 @@ public class TradeMenu extends Dialog {
return mainContent;
}
/** Sets the trade data based on the current selections. */
/**
* Sets the trade values based on the user input.
*/
private void setTrades() {
String leftCurreny = leftCurrencyInput.getText().equals("")? "0" : leftCurrencyInput.getText();
String rightCurreny = rightCurrencyInput.getText().equals("")? "0" : rightCurrencyInput.getText();
@@ -232,13 +255,21 @@ public class TradeMenu extends Dialog {
combinedProperties = combinedProperties.stream().sorted(Comparator.comparingInt(PropertyField::getId)).collect(Collectors.toList());
return combinedProperties;
}
/** Creates a text field for currency input. */
/**
* Creates a currency input field for the trade menu.
* @return the created currency input field
*/
private TextField createCurrencyInput() {
TextField currencyInput = new TextField("0");
styleTextField(currencyInput);
return currencyInput;
}
/** Creates the middle section containing buttons and summary fields. */
/**
* Creates the middle section of the trade menu.
* @return the created middle section container
*/
private Container createMiddleSection() {
Container middleSection = new Container(new SpringGridLayout(Axis.Y, Axis.X));
middleSection.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8f, 0.8f, 0.8f, 1.0f)));
@@ -281,13 +312,19 @@ public class TradeMenu extends Dialog {
return middleSection;
}
/** Styles the given selector with insets and background color. */
/**
* Styles the given selector with insets and background color.
* @param selector the selector to style
*/
private void styleSelector(Selector<String> selector) {
selector.setInsets(new Insets3f(5, 10, 5, 10));
selector.setBackground(new QuadBackgroundComponent(ColorRGBA.Black));
}
/** Styles the given text field with insets and background color. */
/**
* Styles the given text field with insets and background color.
* @param textField the text field to style
*/
private void styleTextField(TextField textField) {
textField.setInsets(new Insets3f(5, 10, 5, 10));
textField.setBackground(new QuadBackgroundComponent(ColorRGBA.Black));
@@ -314,7 +351,10 @@ public class TradeMenu extends Dialog {
rightCurrencyInput = currencyInput;
}
}
/** Positions the main container at the center of the screen. */
/**
* Positions the main container in the center of the screen.
*/
private void positionMainContainer() {
mainContainer.setLocalTranslation(
(app.getCamera().getWidth() - mainContainer.getPreferredSize().x) / 2,
@@ -322,7 +362,10 @@ public class TradeMenu extends Dialog {
7
);
}
/** Adds a background image to the trade menu. */
/**
* Adds a background image to the trade menu.
*/
private void addBackgroundImage() {
Texture backgroundImage = app.getAssetManager().loadTexture("Pictures/unibw-Bib2.png");
Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
@@ -333,6 +376,7 @@ public class TradeMenu extends Dialog {
background.setLocalTranslation(0, 0, 6);
app.getGuiNode().attachChild(background);
}
/** Initializes references for tracking UI changes. */
private void initializeReferences() {
leftBuildingRef = leftBuildingSelector.getSelectionModel().createReference();

View File

@@ -10,7 +10,9 @@ import pp.monopoly.client.GameMusic;
*/
public class VolumeSlider extends Slider {
private final pp.monopoly.client.GameMusic music;
/** The GameMusic instance to handel */
private final GameMusic music;
/** The volume of the music */
private double vol;
/**

View File

@@ -117,9 +117,6 @@ public class Bankrupt extends Dialog implements PopupDialog {
);
}
/**
* Displays the popup by attaching it to the GUI.
*/
@Override
public void show() {
app.getGuiNode().attachChild(overlayBackground);
@@ -128,9 +125,6 @@ public class Bankrupt extends Dialog implements PopupDialog {
centerContainers();
}
/**
* Closes the popup and removes the associated GUI elements.
*/
@Override
public void close() {
app.getGuiNode().detachChild(overlayBackground);
@@ -139,9 +133,6 @@ public class Bankrupt extends Dialog implements PopupDialog {
super.close();
}
/**
* Handles the escape key action by closing the popup.
*/
@Override
public void escape() {
close();

View File

@@ -22,8 +22,11 @@ import pp.monopoly.notification.Sound;
*/
public class BuildingPropertyCard extends Dialog implements PopupDialog {
/**The Monopoly application instance*/
private final MonopolyApp app;
/**The main container for the popup*/
private final Container buildingPropertyContainer;
/**The background container for the popup*/
private final Container backgroundContainer;
/**
@@ -136,18 +139,12 @@ public class BuildingPropertyCard extends Dialog implements PopupDialog {
);
}
/**
* Attaches the popup to the GUI through the DialogManager.
*/
@Override
public void show() {
app.getGuiNode().attachChild(backgroundContainer);
app.getGuiNode().attachChild(buildingPropertyContainer);
}
/**
* Closes the popup and removes associated GUI elements.
*/
@Override
public void close() {
app.getGuiNode().detachChild(buildingPropertyContainer);
@@ -155,9 +152,6 @@ public class BuildingPropertyCard extends Dialog implements PopupDialog {
super.close();
}
/**
* Opens the settings menu when the escape key is pressed.
*/
@Override
public void escape() {
new SettingsMenu(app).open();

View File

@@ -227,9 +227,6 @@ public class BuyHouse extends Dialog {
this.cost.setText(cost+"");
}
/**
* Closes the popup and removes its GUI elements.
*/
@Override
public void close() {
app.getGuiNode().detachChild(buyHouseContainer);
@@ -237,9 +234,6 @@ public class BuyHouse extends Dialog {
super.close();
}
/**
* Opens the settings menu when the escape key is pressed.
*/
@Override
public void escape() {
new SettingsMenu(app).open();

View File

@@ -124,9 +124,6 @@ public class ConfirmTrade extends Dialog implements PopupDialog {
}));
}
/**
* Displays the popup by attaching it to the GUI.
*/
@Override
public void show() {
float padding = 10;
@@ -149,9 +146,6 @@ public class ConfirmTrade extends Dialog implements PopupDialog {
app.getGuiNode().attachChild(confirmTradeContainer);
}
/**
* Closes the popup and removes its GUI elements.
*/
@Override
public void close() {
app.getGuiNode().detachChild(confirmTradeContainer);
@@ -159,9 +153,6 @@ public class ConfirmTrade extends Dialog implements PopupDialog {
super.close();
}
/**
* Opens the settings menu when the escape key is pressed.
*/
@Override
public void escape() {
new SettingsMenu(app).open();

View File

@@ -99,9 +99,6 @@ public class EventCardPopup extends Dialog implements PopupDialog {
}));
}
/**
* Displays the popup by attaching it to the GUI.
*/
@Override
public void show() {
float padding = 10;
@@ -125,9 +122,6 @@ public class EventCardPopup extends Dialog implements PopupDialog {
app.getGuiNode().attachChild(eventCardContainer);
}
/**
* Closes the popup and removes its associated GUI elements.
*/
@Override
public void close() {
app.getGuiNode().detachChild(overlayBackground);
@@ -136,9 +130,6 @@ public class EventCardPopup extends Dialog implements PopupDialog {
super.close();
}
/**
* Handles the escape key action by closing the popup.
*/
@Override
public void escape() {
close();

View File

@@ -123,9 +123,6 @@ public class FoodFieldCard extends Dialog implements PopupDialog {
}));
}
/**
* Displays the popup by attaching its elements to the GUI.
*/
@Override
public void show() {
float padding = 10;
@@ -149,9 +146,6 @@ public class FoodFieldCard extends Dialog implements PopupDialog {
app.getGuiNode().attachChild(foodFieldContainer);
}
/**
* Closes the popup and removes its associated GUI elements.
*/
@Override
public void close() {
app.getGuiNode().detachChild(overlayBackground);
@@ -160,9 +154,6 @@ public class FoodFieldCard extends Dialog implements PopupDialog {
super.close();
}
/**
* Handles the escape key action by closing the popup.
*/
@Override
public void escape() {
close();

View File

@@ -103,10 +103,7 @@ public class GateFieldCard extends Dialog implements PopupDialog {
close();
}));
}
/**
* Displays the popup by attaching its elements to the GUI.
*/
@Override
public void show() {
float padding = 10;
@@ -129,9 +126,6 @@ public class GateFieldCard extends Dialog implements PopupDialog {
app.getGuiNode().attachChild(gateFieldContainer);
}
/**
* Closes the popup and removes its associated GUI elements.
*/
@Override
public void close() {
app.getGuiNode().detachChild(gateFieldContainer); // Remove main container
@@ -139,9 +133,6 @@ public class GateFieldCard extends Dialog implements PopupDialog {
super.close();
}
/**
* Opens the settings menu when the escape key is pressed.
*/
@Override
public void escape() {
new SettingsMenu(app).open();

View File

@@ -19,9 +19,9 @@ import pp.monopoly.notification.Sound;
/**
* Gulag is a warning popup triggered when a player lands on the "Wache" field in the Monopoly game.
* <p>
*
* This popup informs the player that they are being sent to the Gulag and includes a confirmation button.
* </p>
*
*/
public class Gulag extends Dialog implements PopupDialog {
/** Reference to the Monopoly application instance. */
@@ -94,9 +94,6 @@ public class Gulag extends Dialog implements PopupDialog {
}));
}
/**
* Displays the popup by attaching its elements to the GUI.
*/
@Override
public void show() {
float padding = 10;
@@ -120,9 +117,6 @@ public class Gulag extends Dialog implements PopupDialog {
app.getGuiNode().attachChild(gulagContainer);
}
/**
* Closes the popup and removes its associated GUI elements.
*/
@Override
public void close() {
app.getGuiNode().detachChild(overlayBackground);
@@ -131,9 +125,6 @@ public class Gulag extends Dialog implements PopupDialog {
super.close();
}
/**
* Handles the escape action by closing the popup.
*/
@Override
public void escape() {
close();

View File

@@ -115,9 +115,6 @@ public class GulagInfo extends Dialog implements PopupDialog {
}
}
/**
* Displays the popup by attaching its elements to the GUI.
*/
@Override
public void show() {
float padding = 10;
@@ -142,13 +139,15 @@ public class GulagInfo extends Dialog implements PopupDialog {
app.getGuiNode().attachChild(gulagInfoContainer);
}
/**
* Closes the GulagInfo popup and removes its GUI elements.
*/
@Override
public void close() {
app.getGuiNode().detachChild(gulagInfoContainer); // Remove dialog
app.getGuiNode().detachChild(backgroundContainer); // Remove background
super.close();
}
@Override
public void escape() {
close();
}
}

View File

@@ -18,9 +18,9 @@ import pp.monopoly.notification.Sound;
/**
* LooserPopUp is a dialog that appears when a player loses the game.
* <p>
*
* This popup provides a message of encouragement and an option to quit the game.
* </p>
*
*/
public class LooserPopUp extends Dialog {
/** Reference to the Monopoly application instance. */
@@ -123,9 +123,6 @@ public class LooserPopUp extends Dialog {
return overlay;
}
/**
* Closes the LooserPopUp dialog and removes its GUI elements.
*/
@Override
public void close() {
app.getGuiNode().detachChild(LooserContainer); // Entferne das Menü
@@ -134,9 +131,6 @@ public class LooserPopUp extends Dialog {
super.close();
}
/**
* Handles the escape action to close the dialog.
*/
@Override
public void escape() {
close();

View File

@@ -127,9 +127,6 @@ public class NoMoneyWarning extends Dialog implements PopupDialog {
);
}
/**
* Displays the dialog by attaching its components to the GUI node.
*/
@Override
public void show() {
app.getGuiNode().attachChild(overlayBackground);
@@ -137,9 +134,6 @@ public class NoMoneyWarning extends Dialog implements PopupDialog {
app.getGuiNode().attachChild(noMoneyWarningContainer);
}
/**
* Closes the dialog and removes its components from the GUI node.
*/
@Override
public void close() {
app.getGuiNode().detachChild(overlayBackground);
@@ -148,9 +142,6 @@ public class NoMoneyWarning extends Dialog implements PopupDialog {
super.close();
}
/**
* Handles the escape action to close the dialog.
*/
@Override
public void escape() {
close();

View File

@@ -125,9 +125,6 @@ public class ReceivedRent extends Dialog implements PopupDialog {
);
}
/**
* Displays the popup by attaching it to the GUI through the DialogManager.
*/
@Override
public void show() {
app.getGuiNode().attachChild(overlayBackground);
@@ -136,9 +133,6 @@ public class ReceivedRent extends Dialog implements PopupDialog {
centerContainers();
}
/**
* Closes the popup and removes GUI elements.
*/
@Override
public void close() {
app.getGuiNode().detachChild(overlayBackground);
@@ -147,9 +141,6 @@ public class ReceivedRent extends Dialog implements PopupDialog {
super.close();
}
/**
* Handles the escape action to close the dialog.
*/
@Override
public void escape() {
close();

View File

@@ -134,9 +134,6 @@ public class RejectTrade extends Dialog implements PopupDialog {
);
}
/**
* Displays the popup by attaching its elements to the GUI node.
*/
@Override
public void show() {
app.getGuiNode().attachChild(overlayBackground);
@@ -144,9 +141,6 @@ public class RejectTrade extends Dialog implements PopupDialog {
app.getGuiNode().attachChild(rejectTradeContainer);
}
/**
* Closes the menu and removes the GUI elements.
*/
@Override
public void close() {
app.getGuiNode().detachChild(overlayBackground);
@@ -155,9 +149,6 @@ public class RejectTrade extends Dialog implements PopupDialog {
super.close();
}
/**
* Handles the escape key action by closing the popup.
*/
@Override
public void escape() {
close();

View File

@@ -19,17 +19,28 @@ import pp.monopoly.notification.Sound;
/**
* Rent is a popup that is triggered when a player lands on a property owned by another player
* and needs to pay rent in the Monopoly application.
* <p>
*
* Displays the rent amount and the recipient player's name, with an option to confirm the payment.
* </p>
*
*/
public class Rent extends Dialog implements PopupDialog {
private final MonopolyApp app;
/** Reference to the Monopoly application instance. */
private final MonopolyApp app;
/** Semi-transparent overlay background for the popup. */
private final Geometry overlayBackground;
/** Main container for the rent information and action. */
private final Container rentContainer;
/** Background container providing a border for the rent popup. */
private final Container backgroundContainer;
/**
* Constructs the Rent popup displaying the rent amount and recipient player's name.
*
* @param app the Monopoly application instance
* @param playerName the name of the player to pay rent to
* @param amount the amount of rent to pay
*/
public Rent(MonopolyApp app, String playerName, int amount) {
super(app.getDialogManager());
this.app = app;
@@ -43,6 +54,11 @@ public class Rent extends Dialog implements PopupDialog {
centerContainers();
}
/**
* Creates the semi-transparent overlay background 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);
@@ -54,12 +70,24 @@ public class Rent extends Dialog implements PopupDialog {
return overlay;
}
/**
* Creates the background container for the rent popup.
*
* @return the background container
*/
private Container createBackgroundContainer() {
Container container = new Container();
container.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
return container;
}
/**
* Creates the main container for the rent popup.
*
* @param playerName the name of the player to pay rent to
* @param amount the amount of rent to pay
* @return the rent container
*/
private Container createRentContainer(String playerName, int amount) {
Container container = new Container();
container.setBackground(new QuadBackgroundComponent(ColorRGBA.Gray));
@@ -85,6 +113,9 @@ public class Rent extends Dialog implements PopupDialog {
return container;
}
/**
* Centers the rent and background containers on the screen.
*/
private void centerContainers() {
float padding = 10;

View File

@@ -29,10 +29,10 @@ import java.util.stream.Collectors;
/**
* RepayMortage is a popup that appears when a player selects the "Repay Mortgage" option
* in the Building Administration Menu.
* <p>
*
* This popup allows the player to select mortgaged properties and repay their mortgages,
* showing the total cost of the repayment. Includes options to confirm or cancel the repayment.
* </p>
*
*/
public class RepayMortage extends Dialog {
/** Reference to the Monopoly application instance. */
@@ -231,9 +231,6 @@ public class RepayMortage extends Dialog {
this.cost.setText(cost+"");
}
/**
* Closes the popup and removes its associated GUI elements.
*/
@Override
public void close() {
app.getGuiNode().detachChild(repayMortageContainer); // Entferne das Menü
@@ -241,9 +238,6 @@ public class RepayMortage extends Dialog {
super.close();
}
/**
* Opens the settings menu when the escape key is pressed.
*/
@Override
public void escape() {
new SettingsMenu(app).open();

View File

@@ -29,10 +29,10 @@ import java.util.stream.Collectors;
/**
* SellHouse is a popup that appears when a player clicks on the "Demolish" button
* in the BuildingAdminMenu.
* <p>
*
* This dialog allows players to select their properties and demolish houses or hotels
* for a partial refund of their purchase cost.
* </p>
*
*/
public class SellHouse extends Dialog {
/** Reference to the Monopoly application instance. */
@@ -230,9 +230,6 @@ public class SellHouse extends Dialog {
this.cost.setText(cost+"");
}
/**
* Closes the dialog and removes GUI elements from the screen.
*/
@Override
public void close() {
app.getGuiNode().detachChild(sellhouseContainer); // Entferne das Menü
@@ -240,9 +237,6 @@ public class SellHouse extends Dialog {
super.close();
}
/**
* Handles the escape action to close the dialog.
*/
@Override
public void escape() {
new SettingsMenu(app).open();

View File

@@ -240,9 +240,6 @@ public class TakeMortage extends Dialog {
this.cost.setText(cost+"");
}
/**
* Closes the dialog and removes GUI elements from the screen.
*/
@Override
public void close() {
app.getGuiNode().detachChild(takeMortageContainer); // Entferne das Menü
@@ -250,9 +247,6 @@ public class TakeMortage extends Dialog {
super.close();
}
/**
* Handles the escape action to close the dialog.
*/
@Override
public void escape() {
new SettingsMenu(app).open();

View File

@@ -18,9 +18,9 @@ import pp.monopoly.notification.Sound;
/**
* WinnerPopUp is a dialog displayed when a player wins the Monopoly game.
* <p>
*
* This popup congratulates the player for their victory and provides an option to quit the game.
* </p>
*
*/
public class WinnerPopUp extends Dialog {
/** Reference to the Monopoly application instance. */
@@ -121,9 +121,6 @@ public class WinnerPopUp extends Dialog {
return overlay;
}
/**
* Closes the WinnerPopUp dialog and removes its GUI elements.
*/
@Override
public void close() {
app.getGuiNode().detachChild(WinnerContainer); // Entferne das Menü
@@ -132,9 +129,6 @@ public class WinnerPopUp extends Dialog {
super.close();
}
/**
* Handles the escape action to close the dialog.
*/
@Override
public void escape() {
close();