Compare commits

..

5 Commits

Author SHA1 Message Date
Luca Puderbach
e12f00aad6 Merge branch 'gui' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into gui 2024-11-20 03:36:59 +01:00
Luca Puderbach
47bac0185f Port fix 2024-11-20 03:36:54 +01:00
Yvonne Schmidt
dafe1dab2a Merge remote-tracking branch 'origin/gui' into gui 2024-11-20 03:24:46 +01:00
Yvonne Schmidt
8ba4ea2819 menues angepasst und vorlage für dropdown implementiert 2024-11-20 03:24:27 +01:00
Simon Wilkening
f6f708fd5b Angepasste Toolbar 2024-11-20 03:17:10 +01:00
12 changed files with 125 additions and 32 deletions

View File

@ -7,24 +7,23 @@
package pp.battleship.client; package pp.battleship.client;
import java.lang.System.Logger;
import java.lang.System.Logger.Level;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import com.simsilica.lemur.Button; import com.simsilica.lemur.Button;
import com.simsilica.lemur.Container; import com.simsilica.lemur.Container;
import com.simsilica.lemur.Label; import com.simsilica.lemur.Label;
import com.simsilica.lemur.TextField; import com.simsilica.lemur.TextField;
import com.simsilica.lemur.component.SpringGridLayout; import com.simsilica.lemur.component.SpringGridLayout;
import static pp.battleship.Resources.lookup;
import pp.battleship.server.BattleshipServer; import pp.battleship.server.BattleshipServer;
import pp.dialog.Dialog; import pp.dialog.Dialog;
import pp.dialog.DialogBuilder; import pp.dialog.DialogBuilder;
import pp.dialog.SimpleDialog; import pp.dialog.SimpleDialog;
import java.lang.System.Logger;
import java.lang.System.Logger.Level;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import static pp.battleship.Resources.lookup;
/** /**
* Represents a dialog for setting up a network connection in the Battleship game. * Represents a dialog for setting up a network connection in the Battleship game.
* Allows users to specify the host and port for connecting to a game server. * Allows users to specify the host and port for connecting to a game server.
@ -32,7 +31,7 @@ import static pp.battleship.Resources.lookup;
class NetworkDialog extends SimpleDialog { class NetworkDialog extends SimpleDialog {
private static final Logger LOGGER = System.getLogger(NetworkDialog.class.getName()); private static final Logger LOGGER = System.getLogger(NetworkDialog.class.getName());
private static final String LOCALHOST = "localhost"; //NON-NLS private static final String LOCALHOST = "localhost"; //NON-NLS
private static final String DEFAULT_PORT = "1234"; //NON-NLS private static final String DEFAULT_PORT = "42069"; //NON-NLS
private final NetworkSupport network; private final NetworkSupport network;
private final TextField host = new TextField(LOCALHOST); private final TextField host = new TextField(LOCALHOST);
private final TextField port = new TextField(DEFAULT_PORT); private final TextField port = new TextField(DEFAULT_PORT);

View File

@ -7,12 +7,11 @@
package pp.battleship; package pp.battleship;
import pp.util.config.Config; import static java.lang.Math.max;
import java.util.Map; import java.util.Map;
import java.util.TreeMap; import java.util.TreeMap;
import static java.lang.Math.max; import pp.util.config.Config;
/** /**
* Provides access to the configuration settings for the Battleship game. * Provides access to the configuration settings for the Battleship game.
@ -31,7 +30,7 @@ public class BattleshipConfig extends Config {
* The default port number for the Battleship server. * The default port number for the Battleship server.
*/ */
@Property("port") @Property("port")
private int port = 1234; private int port = 12234;
/** /**
* The width of the game map in terms of grid units. * The width of the game map in terms of grid units.

View File

@ -10,7 +10,7 @@
# This file defines the configuration settings for the Battleship server. # This file defines the configuration settings for the Battleship server.
# #
# The port number on which the server will listen for incoming connections. # The port number on which the server will listen for incoming connections.
port=1234 port=42069
# #
# The dimensions of the game map. # The dimensions of the game map.
# 'map.width' defines the number of columns, and 'map.height' defines the number of rows. # 'map.width' defines the number of columns, and 'map.height' defines the number of rows.

View File

@ -36,7 +36,7 @@ doubleGradient.texture = texture(name: "/com/simsilica/lemur/icons/double-gradie
generateMips: false) generateMips: false)
def orangeBorder = TbtQuadBackgroundComponent.create( def orangeBorder = TbtQuadBackgroundComponent.create(
texture(name: "/com/simsilica/lemur/icons/bordered-gradient.png", // Replace with an appropriate texture if needed texture(name: "/com/simsilica/lemur/icons/border.png", // Replace with an appropriate texture if needed
generateMips: false), generateMips: false),
1, 1, 1, 126, 126, 1, 1, 1, 126, 126,
1f, false) 1f, false)
@ -56,6 +56,7 @@ selector("header", "pp") {
insets = new Insets3f(2, 2, 2, 2) insets = new Insets3f(2, 2, 2, 2)
color = color(1, 0.5, 0, 1) color = color(1, 0.5, 0, 1)
textHAlignment = HAlignment.Center textHAlignment = HAlignment.Center
textVAlignment = VAlignment.Center
} }
selector("container", "pp") { selector("container", "pp") {
@ -146,6 +147,8 @@ selector("title", "pp") {
background.texture = texture(name: "/com/simsilica/lemur/icons/double-gradient-128.png", background.texture = texture(name: "/com/simsilica/lemur/icons/double-gradient-128.png",
generateMips: false) generateMips: false)
insets = new Insets3f(2, 2, 2, 2) insets = new Insets3f(2, 2, 2, 2)
textHAlignment = HAlignment.Center
textVAlignment = VAlignment.Center
buttonCommands = stdButtonCommands buttonCommands = stdButtonCommands
} }
@ -160,6 +163,8 @@ selector("button", "pp") {
// Use insets to create a margin/padding effect for the inner background // Use insets to create a margin/padding effect for the inner background
insets = new Insets3f(3, 3, 3, 3) // Adjust the border thickness insets = new Insets3f(3, 3, 3, 3) // Adjust the border thickness
textHAlignment = HAlignment.Center
textVAlignment = VAlignment.Center
buttonCommands = stdButtonCommands buttonCommands = stdButtonCommands
} }
@ -235,10 +240,14 @@ selector("tab.button", "pp") {
selector("settings-title", "pp") { selector("settings-title", "pp") {
fontSize = 48 // Set font size fontSize = 48 // Set font size
background = new QuadBackgroundComponent(color(0.4157f, 0.4235f, 0.4392f, 1.0f)) // Grey background background = new QuadBackgroundComponent(color(0.4157f, 0.4235f, 0.4392f, 1.0f)) // Grey background
textHAlignment = HAlignment.Center
textVAlignment = VAlignment.Center
} }
selector("menu-button", "pp") { selector("menu-button", "pp") {
fontSize = 40 // Set font size fontSize = 40 // Set font size
background = new QuadBackgroundComponent(color(0.4157f, 0.4235f, 0.4392f, 1.0f)) // Grey background background = new QuadBackgroundComponent(color(0.4157f, 0.4235f, 0.4392f, 1.0f)) // Grey background
textHAlignment = HAlignment.Center
textVAlignment = VAlignment.Center
} }

View File

@ -9,6 +9,7 @@ dependencies {
implementation project(":monopoly:model") implementation project(":monopoly:model")
implementation project(":monopoly:server") implementation project(":monopoly:server")
implementation 'com.simsilica:lemur-proto:1.13.0'
implementation libs.jme3.desktop implementation libs.jme3.desktop
implementation libs.lemur implementation libs.lemur
implementation libs.lemurproto implementation libs.lemurproto

View File

@ -21,7 +21,7 @@ import pp.dialog.SimpleDialog;
class NetworkDialog extends SimpleDialog { class NetworkDialog extends SimpleDialog {
private static final Logger LOGGER = System.getLogger(NetworkDialog.class.getName()); private static final Logger LOGGER = System.getLogger(NetworkDialog.class.getName());
private static final String LOCALHOST = "localhost"; private static final String LOCALHOST = "localhost";
private static final String DEFAULT_PORT = "1234"; private static final String DEFAULT_PORT = "42069";
private final NetworkSupport network; private final NetworkSupport network;
private final TextField host = new TextField(LOCALHOST); private final TextField host = new TextField(LOCALHOST);
private final TextField port = new TextField(DEFAULT_PORT); private final TextField port = new TextField(DEFAULT_PORT);

View File

@ -12,6 +12,7 @@ import com.simsilica.lemur.Label;
import com.simsilica.lemur.TextField; import com.simsilica.lemur.TextField;
import com.simsilica.lemur.component.SpringGridLayout; import com.simsilica.lemur.component.SpringGridLayout;
import com.simsilica.lemur.style.ElementId;
import pp.monopoly.client.MonopolyApp; import pp.monopoly.client.MonopolyApp;
import pp.monopoly.client.StartMenu; import pp.monopoly.client.StartMenu;
@ -37,8 +38,10 @@ public class CreateGameMenu {
menuContainer.setPreferredSize(new Vector3f(600, 400, 0)); // Feste Größe des Containers menuContainer.setPreferredSize(new Vector3f(600, 400, 0)); // Feste Größe des Containers
// Titel // Titel
Label title = menuContainer.addChild(new Label("Neues Spiel")); Label title = menuContainer.addChild(new Label("Neues Spiel", new ElementId("header")));
title.setFontSize(48); title.setFont(app.getAssetManager().loadFont("Interface/Fonts/Metropolis/Metropolis-Bold-42.fnt"));
title.setFontSize(50);
// Eingabefelder-Container // Eingabefelder-Container
Container inputContainer = menuContainer.addChild(new Container(new SpringGridLayout(Axis.Y, Axis.X))); Container inputContainer = menuContainer.addChild(new Container(new SpringGridLayout(Axis.Y, Axis.X)));

View File

@ -3,6 +3,7 @@ package pp.monopoly.client.gui;
import com.jme3.material.Material; import com.jme3.material.Material;
import com.jme3.material.RenderState.BlendMode; import com.jme3.material.RenderState.BlendMode;
import com.jme3.math.ColorRGBA; import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry; import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Quad; import com.jme3.scene.shape.Quad;
import com.simsilica.lemur.Button; import com.simsilica.lemur.Button;
@ -12,7 +13,9 @@ import com.simsilica.lemur.Label;
import com.simsilica.lemur.Slider; import com.simsilica.lemur.Slider;
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 com.simsilica.lemur.ValueRenderer;
import com.simsilica.lemur.Selector;
import pp.dialog.Dialog; import pp.dialog.Dialog;
import pp.monopoly.client.MonopolyApp; import pp.monopoly.client.MonopolyApp;
@ -61,6 +64,30 @@ public class SettingsMenu extends Dialog {
backgroundMusicContainer.addChild(new Checkbox("Musik an")).setChecked(true); backgroundMusicContainer.addChild(new Checkbox("Musik an")).setChecked(true);
backgroundMusicContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); backgroundMusicContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
/*Selector<String> dropdown = new Selector<>();
backgroundMusicContainer.addChild(dropdown);
Vector3f dimens = settingsContainer.getPreferredSize();
Vector3f dimens2 = dropdown.getPopupContainer().getPreferredSize();
dimens2.setX(dimens.getX());
dropdown.getPopupContainer().setPreferredSize(dimens2);*/
// Create the dropdown menu
Selector<String> dropdown = new Selector<>();
// Generate and add numbered examples to the dropdown
for (int i = 1; i <= 10; i++) { // Generate 10 examples
dropdown.getModel().add("Example " + i);
}
// Add the dropdown to the container
backgroundMusicContainer.addChild(dropdown);
// Adjust the dropdown's popup container size if necessary
Vector3f dimens = settingsContainer.getPreferredSize();
Vector3f dimens2 = dropdown.getPopupContainer().getPreferredSize();
dimens2.setX(dimens.getX());
dropdown.getPopupContainer().setPreferredSize(dimens2);
// Beenden-Button // Beenden-Button
Button quitButton = settingsContainer.addChild(new Button("Beenden", new ElementId("menu-button"))); Button quitButton = settingsContainer.addChild(new Button("Beenden", new ElementId("menu-button")));
quitButton.setFontSize(32); quitButton.setFontSize(32);

View File

@ -3,20 +3,22 @@ package pp.monopoly.client.gui;
import java.util.Random; import java.util.Random;
import com.jme3.font.BitmapText; import com.jme3.font.BitmapText;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f; import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry; import com.jme3.scene.Geometry;
import com.simsilica.lemur.Axis; import com.simsilica.lemur.*;
import com.simsilica.lemur.Button; import com.simsilica.lemur.component.QuadBackgroundComponent;
import com.simsilica.lemur.Container;
import com.simsilica.lemur.component.SpringGridLayout; 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.MonopolyApp;
/** /**
* Toolbar Klasse, die am unteren Rand der Szene angezeigt wird. * Toolbar Klasse, die am unteren Rand der Szene angezeigt wird.
* Die Buttons bewegen den Würfel auf dem Spielfeld. * Die Buttons bewegen den Würfel auf dem Spielfeld.
*/ */
public class Toolbar { public class Toolbar extends Dialog {
private final MonopolyApp app; private final MonopolyApp app;
private final Container toolbarContainer; private final Container toolbarContainer;
@ -35,6 +37,7 @@ public class Toolbar {
* @param cube Der Würfel, der bewegt werden soll * @param cube Der Würfel, der bewegt werden soll
*/ */
public Toolbar(MonopolyApp app, Geometry cube) { public Toolbar(MonopolyApp app, Geometry cube) {
super(app.getDialogManager());
this.app = app; this.app = app;
this.cube = cube; this.cube = cube;
@ -44,13 +47,41 @@ public class Toolbar {
// Setze die Position am unteren Rand und die Breite // Setze die Position am unteren Rand und die Breite
toolbarContainer.setLocalTranslation( toolbarContainer.setLocalTranslation(
0, // Links bündig 0, // Links bündig
100, // Höhe über dem unteren Rand 200, // Höhe über dem unteren Rand
0 // Z-Ebene 0 // Z-Ebene
); );
toolbarContainer.setPreferredSize(new Vector3f(app.getCamera().getWidth(), 100, 0)); // Volle Breite toolbarContainer.setPreferredSize(new Vector3f(app.getCamera().getWidth(), 200, 0)); // Volle Breite
// Hintergrund Grau
toolbarContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f)));
// Füge Buttons zur Toolbar hinzu // Füge Buttons zur Toolbar hinzu
initializeButtons(); //initializeButtons();
// Menü-Container: Ein Nested-Container für Kontostand und "Meine Gulag Frei Karten"
Container accountContainer = toolbarContainer.addChild(new Container());
accountContainer.addChild(new Label("Kontostand", new ElementId("label")));
accountContainer.addChild(new Label("Gulag Frei Karten", new ElementId("label")));
accountContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
// Menü-Container: Ein Container für Übersicht
Container overviewContainer = toolbarContainer.addChild(new Container());
overviewContainer.addChild(new Label("Übersicht", new ElementId("label")));
overviewContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
// Menü-Container: Ein Container für Würfel
Container diceContainer = toolbarContainer.addChild(new Container());
diceContainer.addChild(new Label("Wo Würfel?", new ElementId("label")));
diceContainer.addChild(new Button("Würfeln"));
diceContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
// Menü-Container: Ein Nested-Container für Handeln, Grundstücke und Zug beenden
Container menuContainer = toolbarContainer.addChild(new Container());
menuContainer.addChild(new Button("Handeln"));
menuContainer.addChild(new Button("Grundstücke"));
menuContainer.addChild(new Button("Zug beenden"));
menuContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
// Füge die Toolbar zur GUI hinzu // Füge die Toolbar zur GUI hinzu
app.getGuiNode().attachChild(toolbarContainer); app.getGuiNode().attachChild(toolbarContainer);
@ -64,9 +95,10 @@ public class Toolbar {
* Initialisiert die Buttons in der Toolbar. * Initialisiert die Buttons in der Toolbar.
*/ */
private void initializeButtons() { private void initializeButtons() {
addButton("Vorwärts", 1); // Bewegung nach vorne addTradeMenuButton(); // Bewegung nach vorne
addButton("Rückwärts", -1); // Bewegung nach hinten addEndTurnButton(); // Bewegung nach hinten
addDiceRollButton(); // Würfel-Button addDiceRollButton(); // Würfel-Button
} }
/** /**
@ -75,12 +107,13 @@ public class Toolbar {
* @param label Der Text des Buttons * @param label Der Text des Buttons
* @param step Schrittweite (+1 für vorwärts, -1 für rückwärts) * @param step Schrittweite (+1 für vorwärts, -1 für rückwärts)
*/ */
private void addButton(String label, int step) {
/*private void addButton(String label, int step) {
Button button = new Button(label); Button button = new Button(label);
button.setPreferredSize(new Vector3f(150, 50, 0)); // Größe der Buttons button.setPreferredSize(new Vector3f(150, 50, 0)); // Größe der Buttons
button.addClickCommands(source -> moveCube(step)); button.addClickCommands(source -> moveCube(step));
toolbarContainer.addChild(button); toolbarContainer.addChild(button);
} }*/
/** /**
* Fügt den Würfel-Button hinzu, der die Figur entsprechend der gewürfelten Zahl bewegt. * Fügt den Würfel-Button hinzu, der die Figur entsprechend der gewürfelten Zahl bewegt.
@ -92,6 +125,27 @@ public class Toolbar {
toolbarContainer.addChild(diceButton); toolbarContainer.addChild(diceButton);
} }
private void addTradeMenuButton() {
Button diceButton = new Button("Handeln");
diceButton.setPreferredSize(new Vector3f(150, 50, 0)); // Größe des Buttons
diceButton.addClickCommands(source -> rollDice());
toolbarContainer.addChild(diceButton);
}
private void addEndTurnButton() {
Button diceButton = new Button("Grundstücke");
diceButton.setPreferredSize(new Vector3f(150, 50, 0)); // Größe des Buttons
diceButton.addClickCommands(source -> rollDice());
toolbarContainer.addChild(diceButton);
}
private void addPropertyMenuButton() {
Button diceButton = new Button("Zug beenden");
diceButton.setPreferredSize(new Vector3f(150, 50, 0)); // Größe des Buttons
diceButton.addClickCommands(source -> rollDice());
toolbarContainer.addChild(diceButton);
}
/** /**
* Simuliert einen Würfelwurf und bewegt die Figur entsprechend. * Simuliert einen Würfelwurf und bewegt die Figur entsprechend.
*/ */

View File

@ -28,19 +28,19 @@ public class MonopolyConfig extends Config {
* The default port number for the Monopoly server. * The default port number for the Monopoly server.
*/ */
@Property("port") @Property("port")
private int port = 42069; private int port = 4321;
/** /**
* The width of the game map in terms of grid units. * The width of the game map in terms of grid units.
*/ */
@Property("map.width") @Property("map.width")
private int mapWidth = 11; private int mapWidth = 12;
/** /**
* The height of the game map in terms of grid units. * The height of the game map in terms of grid units.
*/ */
@Property("map.height") @Property("map.height")
private int mapHeight = 11; private int mapHeight = 12;
/** /**
* Creates an instance of {@code MonopolyConfig} with default settings. * Creates an instance of {@code MonopolyConfig} with default settings.

View File

@ -124,6 +124,7 @@ public class ServerGameLogic implements ClientInterpreter {
playerHandler.addPlayer(player); playerHandler.addPlayer(player);
LOGGER.log(Level.DEBUG, "Player added: {0}", player.getId()); LOGGER.log(Level.DEBUG, "Player added: {0}", player.getId());
System.out.println("Anzahl Spieler verbunden:"+ playerHandler.getPlayerCount());
return player; return player;
} }

View File

@ -10,5 +10,5 @@
# This file defines the configuration settings for the Battleship server. # This file defines the configuration settings for the Battleship server.
# #
# The port number on which the server will listen for incoming connections. # The port number on which the server will listen for incoming connections.
port=1234 port=42069