From 85756713df71888149f5c7d0e7700341010d28c4 Mon Sep 17 00:00:00 2001 From: Luca Puderbach Date: Fri, 15 Nov 2024 03:23:27 +0100 Subject: [PATCH] =?UTF-8?q?Erweitern=20des=20Setting=20und=20CreateGameMen?= =?UTF-8?q?=C3=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/pp/monopoly/client/MonopolyApp.java | 16 ++- .../java/pp/monopoly/client/StartMenu.java | 24 ++-- .../monopoly/client/gui/CreateGameMenu.java | 109 ++++++++---------- .../pp/monopoly/client/gui/SettingsMenu.java | 32 ++++- 4 files changed, 110 insertions(+), 71 deletions(-) diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/MonopolyApp.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/MonopolyApp.java index 23cd942..ac40396 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/MonopolyApp.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/MonopolyApp.java @@ -34,6 +34,8 @@ public class MonopolyApp extends SimpleApplication implements MonopolyClient, Ga private SettingsMenu settingsMenu; private final Draw draw; + private boolean isSettingsMenuOpen = false; + public static void main(String[] args) { new MonopolyApp().start(); } @@ -66,6 +68,14 @@ public class MonopolyApp extends SimpleApplication implements MonopolyClient, Ga return settings; } + public boolean isSettingsMenuOpen() { + return isSettingsMenuOpen; + } + + public void setSettingsMenuOpen(boolean isOpen) { + this.isSettingsMenuOpen = isOpen; + } + @Override public void simpleInitApp() { GuiGlobals.initialize(this); @@ -74,6 +84,8 @@ public class MonopolyApp extends SimpleApplication implements MonopolyClient, Ga setupInput(); setupGui(); + + // Erst jetzt StartMenu erstellen, nachdem GuiGlobals initialisiert ist StartMenu.createStartMenu(this); } @@ -93,11 +105,13 @@ public class MonopolyApp extends SimpleApplication implements MonopolyClient, Ga private void handleEscape(boolean isPressed) { if (isPressed) { - if (settingsMenu != null && guiNode.hasChild(settingsMenu.getContainer())) { + if (isSettingsMenuOpen && settingsMenu != null) { settingsMenu.close(); + setSettingsMenuOpen(false); } else { settingsMenu = new SettingsMenu(this); settingsMenu.open(); + setSettingsMenuOpen(true); } } } diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/StartMenu.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/StartMenu.java index 6d81abd..e944953 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/StartMenu.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/StartMenu.java @@ -35,6 +35,8 @@ public class StartMenu extends Dialog { */ public static void createStartMenu(MonopolyApp app) { Container mainMenu = new Container(); + + // Hintergrundbild für das Startmenü Texture backgroundImage = app.getAssetManager().loadTexture("Pictures/unibw-Bib2.png"); Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight()); // Vollbildgröße Geometry background = new Geometry("Background", quad); @@ -42,17 +44,21 @@ public class StartMenu extends Dialog { backgroundMaterial.setTexture("ColorMap", backgroundImage); background.setMaterial(backgroundMaterial); background.setLocalTranslation(0, 0, -1); // Hintergrundebene - - // Bild zum guiNode hinzufügen, damit es im Hintergrund bleibt app.getGuiNode().attachChild(background); - mainMenu.setLocalTranslation(new Vector3f(300, 300, 0)); // Positionierung des Menüs + + // Positionierung des Hauptmenüs + mainMenu.setLocalTranslation(new Vector3f(300, 300, 0)); // Titel des Hauptmenüs mainMenu.addChild(new Label("Hauptmenü")); // Schaltfläche "Spielen" - Wechselt zum CreateGameMenu Button startButton = mainMenu.addChild(new Button("Spielen")); - startButton.addClickCommands(source -> startGame(app)); + startButton.addClickCommands(source -> { + if (!app.isSettingsMenuOpen()) { // Nur ausführen, wenn SettingsMenu geschlossen ist + startGame(app); + } + }); // Schaltfläche "Einstellungen" - Öffnet das Einstellungsmenü Button settingsButton = mainMenu.addChild(new Button("Einstellungen")); @@ -60,7 +66,11 @@ public class StartMenu extends Dialog { // Schaltfläche "Spiel beenden" - Beendet das Spiel Button quitButton = mainMenu.addChild(new Button("Spiel beenden")); - quitButton.addClickCommands(source -> quitGame()); + quitButton.addClickCommands(source -> { + if (!app.isSettingsMenuOpen()) { // Nur ausführen, wenn SettingsMenu geschlossen ist + quitGame(); + } + }); // Hauptmenü dem Bildschirm hinzufügen app.getGuiNode().attachChild(mainMenu); @@ -73,9 +83,9 @@ public class StartMenu extends Dialog { } private static void openSettings(MonopolyApp app) { - app.getGuiNode().detachAllChildren(); SettingsMenu settingsMenu = new SettingsMenu(app); - // Weitere Initialisierung des SettingsMenu + app.setSettingsMenuOpen(true); // Markiert das SettingsMenu als geöffnet + settingsMenu.open(() -> app.setSettingsMenuOpen(false)); // Callback, das den Status zurücksetzt } private static void quitGame() { diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/CreateGameMenu.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/CreateGameMenu.java index 94e942c..8e13fb5 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/CreateGameMenu.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/CreateGameMenu.java @@ -1,77 +1,70 @@ package pp.monopoly.client.gui; import com.jme3.math.Vector3f; +import com.simsilica.lemur.Axis; import com.simsilica.lemur.Button; import com.simsilica.lemur.Container; +import com.simsilica.lemur.Insets3f; import com.simsilica.lemur.Label; +import com.simsilica.lemur.TextField; +import com.simsilica.lemur.component.SpringGridLayout; +import com.simsilica.lemur.style.ElementId; -import pp.dialog.Dialog; import pp.monopoly.client.MonopolyApp; -import pp.monopoly.client.StartMenu; -/** - * Menu for creating a new game, where players can configure settings before starting. - */ -public class CreateGameMenu extends Dialog { +public class CreateGameMenu { private final MonopolyApp app; + private final Container createGameContainer; - /** - * Constructs the CreateGameMenu dialog for the Monopoly application. - * - * @param app the MonopolyApp instance - */ public CreateGameMenu(MonopolyApp app) { - super(app.getDialogManager()); this.app = app; - initializeMenu(); + + // Hauptcontainer für das Menü mit Innenabstand + createGameContainer = new Container(); + createGameContainer.setInsets(new Insets3f(10, 10, 10, 10)); + + // Setzt den Titel des Menüs + Label title = createGameContainer.addChild(new Label("Neues Spiel", new ElementId("title"))); + + // Fügt zwei Eingabefelder unter dem Titel hinzu + TextField inputField1 = createGameContainer.addChild(new TextField("Eingabefeld 1")); + TextField inputField2 = createGameContainer.addChild(new TextField("Eingabefeld 2")); + + // Erstellt einen Container mit einem Rasterlayout, um die Buttons nebeneinander anzuordnen + Container buttonContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y)); + buttonContainer.setInsets(new Insets3f(5, 5, 5, 5)); // Abstand zwischen den Buttons und dem Rand + + // Buttons hinzufügen und jeweils einen Innenabstand hinzufügen + Button button1 = buttonContainer.addChild(new Button("1")); + button1.setInsets(new Insets3f(5, 5, 5, 5)); + + Button button2 = buttonContainer.addChild(new Button("2")); + button2.setInsets(new Insets3f(5, 5, 5, 5)); + + Button button3 = buttonContainer.addChild(new Button("3")); + button3.setInsets(new Insets3f(5, 5, 5, 5)); + + // Fügt den Button-Container zum Hauptcontainer hinzu + createGameContainer.addChild(buttonContainer); + + // Setzt die Breite des Hauptcontainers + createGameContainer.setPreferredSize(new Vector3f(600, 400, 0)); + + // Zentriert den Container auf dem Bildschirm + createGameContainer.setLocalTranslation( + (app.getCamera().getWidth() - createGameContainer.getPreferredSize().x) / 2, + (app.getCamera().getHeight() + createGameContainer.getPreferredSize().y) / 2, + 0 + ); + + // Fügt das Menü zum GUI-Knoten der App hinzu + app.getGuiNode().attachChild(createGameContainer); } /** - * Sets up the Create Game Menu layout and buttons. + * Schließt das CreateGameMenu. */ - private void initializeMenu() { - Container menuContainer = new Container(); - menuContainer.setLocalTranslation(new Vector3f(300, 300, 0)); // Positionierung des Menüs - - // Titel des Menüs - menuContainer.addChild(new Label("Neues Spiel erstellen")); - - // Beispiel-Button für die Spieleranzahl-Einstellung - Button playerCountButton = menuContainer.addChild(new Button("Spieleranzahl einstellen")); - playerCountButton.addClickCommands(source -> setPlayerCount()); - - // Start-Button zum Spielbeginn - Button startGameButton = menuContainer.addChild(new Button("Spiel starten")); - startGameButton.addClickCommands(source -> startGame()); - - // Zurück-Button zum Startmenü - Button backButton = menuContainer.addChild(new Button("Zurück")); - backButton.addClickCommands(source -> returnToStartMenu()); - - app.getGuiNode().attachChild(menuContainer); - } - - /** - * Placeholder for setting the player count. - */ - private void setPlayerCount() { - // Logik zum Festlegen der Spieleranzahl - System.out.println("Spieleranzahl einstellen wurde ausgewählt"); - } - - /** - * Placeholder for starting the game. - */ - private void startGame() { - // Logik für den Start des Spiels - System.out.println("Spiel starten wurde ausgewählt"); - } - - /** - * Returns to the StartMenu. - */ - private void returnToStartMenu() { - app.getGuiNode().detachAllChildren(); // Schließt das CreateGameMenu - StartMenu.createStartMenu(app); // Zeigt das Startmenü erneut an + public void close() { + app.getGuiNode().detachChild(createGameContainer); } } diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/SettingsMenu.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/SettingsMenu.java index a583641..d487498 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/SettingsMenu.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/SettingsMenu.java @@ -1,9 +1,11 @@ package pp.monopoly.client.gui; +import com.jme3.math.ColorRGBA; import com.jme3.math.Vector3f; import com.simsilica.lemur.Button; import com.simsilica.lemur.Container; import com.simsilica.lemur.Label; +import com.simsilica.lemur.style.ElementId; import pp.dialog.Dialog; import pp.monopoly.client.MonopolyApp; @@ -17,9 +19,27 @@ public class SettingsMenu extends Dialog { this.app = app; settingsContainer = new Container(); } + + /** + * Öffnet das SettingsMenu und führt das onCloseCallback aus, wenn das Menü geschlossen wird. + * + * @param onCloseCallback Callback, das beim Schließen des Menüs ausgeführt wird + */ + public void open(Runnable onCloseCallback) { + settingsContainer.addChild(new Label("Einstellungen")); + + // Zurück-Button, der das Menü schließt und das Callback ausführt + Button backButton = settingsContainer.addChild(new Button("Zurück")); + backButton.addClickCommands(source -> { + close(); // Menü schließen + onCloseCallback.run(); // Callback ausführen, um den Status in MonopolyApp zurückzusetzen + }); + + app.getGuiNode().attachChild(settingsContainer); + } public void open() { - settingsContainer.setLocalTranslation(new Vector3f(300, 300, 0)); + settingsContainer.setLocalTranslation(new Vector3f(500, 300, 0)); // Titel des Einstellungsmenüs settingsContainer.addChild(new Label("Einstellungen")); @@ -29,14 +49,16 @@ public class SettingsMenu extends Dialog { Button toggleSoundButton = settingsContainer.addChild(new Button("An/Aus")); toggleSoundButton.addClickCommands(source -> toggleSound()); - // Zurück-Button, um das Menü zu schließen - Button backButton = settingsContainer.addChild(new Button("Zurück")); - backButton.addClickCommands(source -> close()); + // Button "Beenden" hinzufügen, um das Spiel zu schließen + Button quitButton = settingsContainer.addChild(new Button("Beenden", new ElementId("menu-button"))); + quitButton.setFontSize(24); + quitButton.setColor(ColorRGBA.White); + quitButton.addClickCommands(source -> app.stop()); // Beendet das Spiel // Container dem GUI-Knoten hinzufügen app.getGuiNode().attachChild(settingsContainer); } - + @Override public void close() { app.getGuiNode().detachChild(settingsContainer); }