mirror of
				https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02.git
				synced 2025-10-31 02:41:51 +01:00 
			
		
		
		
	Merge remote-tracking branch 'origin/gui' into gui
# Conflicts: # Projekte/monopoly/client/src/main/java/pp/monopoly/client/StartMenu.java
This commit is contained in:
		| @@ -1,85 +1,83 @@ | |||||||
| // Styling of Lemur components | // Styling of Lemur components | ||||||
| // For documentation, see | // For documentation, see: | ||||||
| // https://github.com/jMonkeyEngine-Contributions/Lemur/wiki/Styling | // https://github.com/jMonkeyEngine-Contributions/Lemur/wiki/Styling | ||||||
|  |  | ||||||
| import com.simsilica.lemur.Button | import com.simsilica.lemur.* | ||||||
| import com.simsilica.lemur.Button.ButtonAction |  | ||||||
| import com.simsilica.lemur.Command |  | ||||||
| import com.simsilica.lemur.HAlignment |  | ||||||
| import com.simsilica.lemur.Insets3f |  | ||||||
| import com.simsilica.lemur.component.QuadBackgroundComponent |  | ||||||
| import com.simsilica.lemur.component.TbtQuadBackgroundComponent |  | ||||||
|  |  | ||||||
|  | // Farben und allgemeine Stile | ||||||
| def bgColor = color(1, 1, 1, 1) | def bgColor = color(1, 1, 1, 1) | ||||||
| def buttonEnabledColor = color(0.8, 0.9, 1, 1) | def buttonEnabledColor = color(0.8, 0.9, 1, 1) | ||||||
| def buttonDisabledColor = color(0.8, 0.9, 1, 0.2) | def buttonDisabledColor = color(0.8, 0.9, 1, 0.2) | ||||||
| //def buttonBgColor = color(0, 0.75, 0.75, 1) |  | ||||||
| def sliderColor = color(0.6, 0.8, 0.8, 1) | def sliderColor = color(0.6, 0.8, 0.8, 1) | ||||||
| def sliderBgColor = color(0.5, 0.75, 0.75, 1) | def sliderBgColor = color(0.5, 0.75, 0.75, 1) | ||||||
| def gradientColor = color(0.5, 0.75, 0.85, 0.5) | def gradientColor = color(0.5, 0.75, 0.85, 0.5) | ||||||
| def tabbuttonEnabledColor = color(0.4, 0.45, 0.5, 1) | def tabbuttonEnabledColor = color(0.4, 0.45, 0.5, 1) | ||||||
|  | def playButtonBorderColor = color(1, 0.6, 0, 1) // For "Spielen" button | ||||||
|  |  | ||||||
| def playButtonBorderColor = color(1, 0.6, 0, 1) // Orange border for "Spielen" button | // Hintergrundverläufe | ||||||
| def playButtonTextColor = color(0, 0, 0, 1) // Black text color for "Spielen" button |  | ||||||
| def buttonBgColor = color(1, 1, 1, 1) // White background for "Spiel beenden" and "Einstellungen" buttons |  | ||||||
| def buttonTextColor = color(0, 0, 0, 1) // Black text color for "Spiel beenden" and "Einstellungen" buttons |  | ||||||
| def borderColor = color(0, 0, 0, 1) // Black border for "Spiel beenden" and "Einstellungen" |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def gradient = TbtQuadBackgroundComponent.create( | def gradient = TbtQuadBackgroundComponent.create( | ||||||
|         texture(name: "/com/simsilica/lemur/icons/bordered-gradient.png", |         texture(name: "/com/simsilica/lemur/icons/bordered-gradient.png", generateMips: false), | ||||||
|                 generateMips: false), |         1, 1, 1, 126, 126, 1f, false) | ||||||
|         1, 1, 1, 126, 126, |  | ||||||
|         1f, false) |  | ||||||
|  |  | ||||||
| def doubleGradient = new QuadBackgroundComponent(gradientColor) | def doubleGradient = new QuadBackgroundComponent(gradientColor) | ||||||
| doubleGradient.texture = texture(name: "/com/simsilica/lemur/icons/double-gradient-128.png", | doubleGradient.texture = texture(name: "/com/simsilica/lemur/icons/double-gradient-128.png", generateMips: false) | ||||||
|                                  generateMips: false) |  | ||||||
|  |  | ||||||
|  | // Hauptstil für die Schriftart | ||||||
| selector("pp") { | selector("pp") { | ||||||
|     font = font("Interface/Fonts/Metropolis/Metropolis-Regular-32.fnt") |     font = font("Interface/Fonts/Metropolis/Metropolis-Regular-32.fnt") | ||||||
| } | } | ||||||
|  |  | ||||||
| selector("label", "pp") { | // Titel für "Einstellungen" | ||||||
|     insets = new Insets3f(2, 2, 2, 2) | selector("settings-title", "pp") { | ||||||
|     color = buttonEnabledColor |     color = color(1, 1, 1, 1) | ||||||
| } |     fontSize = 48 | ||||||
|  |  | ||||||
| selector("header", "pp") { |  | ||||||
|     font = font("Interface/Fonts/Metropolis/Metropolis-Bold-42.fnt") |  | ||||||
|     insets = new Insets3f(2, 2, 2, 2) |  | ||||||
|     color = color(1, 0.5, 0, 1) |  | ||||||
|     textHAlignment = HAlignment.Center |     textHAlignment = HAlignment.Center | ||||||
|  |     insets = new Insets3f(5, 5, 5, 5) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // Container Stil | ||||||
| selector("container", "pp") { | selector("container", "pp") { | ||||||
|     background = gradient.clone() |     background = gradient.clone() | ||||||
|     background.setColor(bgColor) |     background.setColor(bgColor) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // Slider Stil | ||||||
| selector("slider", "pp") { | selector("slider", "pp") { | ||||||
|     background = gradient.clone() |     insets = new Insets3f(5, 10, 5, 10) // Abstand | ||||||
|     background.setColor(bgColor) |     background = new QuadBackgroundComponent(sliderBgColor) | ||||||
| } | } | ||||||
|  |  | ||||||
| selector("play-button", "pp") { | // Slider-Thumb Stil | ||||||
|     color = playButtonTextColor // Black text color | selector("slider.thumb.button", "pp") { | ||||||
|     background = new QuadBackgroundComponent(playButtonBorderColor) // Orange border background |     text = "[]" // Symbol für den Thumb | ||||||
|     insets = new Insets3f(15, 25, 15, 25) // Padding for larger button size |     color = sliderColor | ||||||
|     background.setMargin(5, 5) // Thin border effect around the background color |     insets = new Insets3f(2, 2, 2, 2) | ||||||
|     fontSize = 36 // Larger font size for prominence |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // Slider links/rechts Buttons | ||||||
|  | selector("slider.left.button", "pp") { | ||||||
|  |     text = "-" | ||||||
|  |     color = sliderColor | ||||||
|  |     background = doubleGradient.clone() | ||||||
|  |     insets = new Insets3f(5, 5, 5, 5) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | selector("slider.right.button", "pp") { | ||||||
|  |     text = "+" | ||||||
|  |     color = sliderColor | ||||||
|  |     background = doubleGradient.clone() | ||||||
|  |     insets = new Insets3f(5, 5, 5, 5) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Style für alle Buttons im Menü | ||||||
| selector("menu-button", "pp") { | selector("menu-button", "pp") { | ||||||
|     color = buttonTextColor // Black text color |     color = color(0, 0, 0, 1) // Schwarzer Text | ||||||
|     background = new QuadBackgroundComponent(buttonBgColor) // White background |     background = new QuadBackgroundComponent(bgColor) | ||||||
|     insets = new Insets3f(10, 20, 10, 20) // Padding |     insets = new Insets3f(10, 20, 10, 20) | ||||||
|     background.setMargin(1, 1) // Thin black border |     fontSize = 24 | ||||||
|     background.setColor(borderColor) // Set black border color |  | ||||||
|  |  | ||||||
|     fontSize = 24 // Standard font size |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // Standard Button Commands (Animationseffekt) | ||||||
| def pressedCommand = new Command<Button>() { | def pressedCommand = new Command<Button>() { | ||||||
|     void execute(Button source) { |     void execute(Button source) { | ||||||
|         if (source.isPressed()) |         if (source.isPressed()) | ||||||
| @@ -98,30 +96,6 @@ def enabledCommand = new Command<Button>() { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| def repeatCommand = new Command<Button>() { |  | ||||||
|     private long startTime |  | ||||||
|     private long lastClick |  | ||||||
|  |  | ||||||
|     void execute(Button source) { |  | ||||||
|         // Only do the repeating click while the mouse is |  | ||||||
|         // over the button (and pressed of course) |  | ||||||
|         if (source.isPressed() && source.isHighlightOn()) { |  | ||||||
|             long elapsedTime = System.currentTimeMillis() - startTime |  | ||||||
|             // After half a second pause, click 8 times a second |  | ||||||
|             if (elapsedTime > 500 && elapsedTime > lastClick + 125) { |  | ||||||
|                 source.click() |  | ||||||
|  |  | ||||||
|                 // Try to quantize the last click time to prevent drift |  | ||||||
|                 lastClick = ((elapsedTime - 500) / 125) * 125 + 500 |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         else { |  | ||||||
|             startTime = System.currentTimeMillis() |  | ||||||
|             lastClick = 0 |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| def stdButtonCommands = [ | def stdButtonCommands = [ | ||||||
|         (ButtonAction.Down)    : [pressedCommand], |         (ButtonAction.Down)    : [pressedCommand], | ||||||
|         (ButtonAction.Up)      : [pressedCommand], |         (ButtonAction.Up)      : [pressedCommand], | ||||||
| @@ -129,98 +103,9 @@ def stdButtonCommands = [ | |||||||
|         (ButtonAction.Disabled): [enabledCommand] |         (ButtonAction.Disabled): [enabledCommand] | ||||||
| ] | ] | ||||||
|  |  | ||||||
| def sliderButtonCommands = [ |  | ||||||
|         (ButtonAction.Hover): [repeatCommand] |  | ||||||
| ] |  | ||||||
|  |  | ||||||
| selector("title", "pp") { |  | ||||||
|     color = color(0.8, 0.9, 1, 0.85f) |  | ||||||
|     highlightColor = color(1, 0.8, 1, 0.85f) |  | ||||||
|     shadowColor = color(0, 0, 0, 0.75f) |  | ||||||
|     shadowOffset = vec3(2, -2, -1) |  | ||||||
|     background = new QuadBackgroundComponent(color(0.5, 0.75, 0.85, 1)) |  | ||||||
|     background.texture = texture(name: "/com/simsilica/lemur/icons/double-gradient-128.png", |  | ||||||
|                                  generateMips: false) |  | ||||||
|     insets = new Insets3f(2, 2, 2, 2) |  | ||||||
|  |  | ||||||
|     buttonCommands = stdButtonCommands |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| selector("button", "pp") { | selector("button", "pp") { | ||||||
|     background = gradient.clone() |     background = gradient.clone() | ||||||
|     color = buttonEnabledColor |     color = buttonEnabledColor | ||||||
|     background.setColor(buttonBgColor) |  | ||||||
|     insets = new Insets3f(2, 2, 2, 2) |     insets = new Insets3f(2, 2, 2, 2) | ||||||
|  |  | ||||||
|     buttonCommands = stdButtonCommands |  | ||||||
| } |  | ||||||
|  |  | ||||||
| selector("slider", "pp") { |  | ||||||
|     insets = new Insets3f(1, 3, 1, 2) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| selector("slider", "button", "pp") { |  | ||||||
|     background = doubleGradient.clone() |  | ||||||
|     //background.setColor(sliderBgColor) |  | ||||||
|     insets = new Insets3f(0, 0, 0, 0) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| selector("slider.thumb.button", "pp") { |  | ||||||
|     text = "[]" |  | ||||||
|     color = sliderColor |  | ||||||
| } |  | ||||||
|  |  | ||||||
| selector("slider.left.button", "pp") { |  | ||||||
|     text = "-" |  | ||||||
|     background = doubleGradient.clone() |  | ||||||
|     //background.setColor(sliderBgColor) |  | ||||||
|     background.setMargin(5, 0) |  | ||||||
|     color = sliderColor |  | ||||||
|  |  | ||||||
|     buttonCommands = sliderButtonCommands |  | ||||||
| } |  | ||||||
|  |  | ||||||
| selector("slider.right.button", "pp") { |  | ||||||
|     text = "+" |  | ||||||
|     background = doubleGradient.clone() |  | ||||||
|     //background.setColor(sliderBgColor) |  | ||||||
|     background.setMargin(4, 0) |  | ||||||
|     color = sliderColor |  | ||||||
|  |  | ||||||
|     buttonCommands = sliderButtonCommands |  | ||||||
| } |  | ||||||
|  |  | ||||||
| selector("slider.up.button", "pp") { |  | ||||||
|     buttonCommands = sliderButtonCommands |  | ||||||
| } |  | ||||||
|  |  | ||||||
| selector("slider.down.button", "pp") { |  | ||||||
|     buttonCommands = sliderButtonCommands |  | ||||||
| } |  | ||||||
|  |  | ||||||
| selector("checkbox", "pp") { |  | ||||||
|     color = buttonEnabledColor |  | ||||||
| } |  | ||||||
|  |  | ||||||
| selector("rollup", "pp") { |  | ||||||
|     background = gradient.clone() |  | ||||||
|     background.setColor(bgColor) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| selector("tabbedPanel", "pp") { |  | ||||||
|     activationColor = buttonEnabledColor |  | ||||||
| } |  | ||||||
|  |  | ||||||
| selector("tabbedPanel.container", "pp") { |  | ||||||
|     background = null |  | ||||||
| } |  | ||||||
|  |  | ||||||
| selector("tab.button", "pp") { |  | ||||||
|     background = gradient.clone() |  | ||||||
|     background.setColor(bgColor) |  | ||||||
|     color = tabbuttonEnabledColor |  | ||||||
|     insets = new Insets3f(4, 2, 0, 2) |  | ||||||
|  |  | ||||||
|     buttonCommands = stdButtonCommands |     buttonCommands = stdButtonCommands | ||||||
| } | } | ||||||
|   | |||||||
| @@ -16,6 +16,7 @@ import com.simsilica.lemur.style.BaseStyles; | |||||||
| import pp.dialog.DialogBuilder; | import pp.dialog.DialogBuilder; | ||||||
| import pp.dialog.DialogManager; | import pp.dialog.DialogManager; | ||||||
| import pp.graphics.Draw; | import pp.graphics.Draw; | ||||||
|  | import pp.monopoly.client.gui.SettingsMenu; | ||||||
| import pp.monopoly.game.client.ClientGameLogic; | import pp.monopoly.game.client.ClientGameLogic; | ||||||
| import pp.monopoly.game.client.MonopolyClient; | import pp.monopoly.game.client.MonopolyClient; | ||||||
| import pp.monopoly.game.client.ServerConnection; | import pp.monopoly.game.client.ServerConnection; | ||||||
| @@ -27,12 +28,14 @@ public class MonopolyApp extends SimpleApplication implements MonopolyClient, Ga | |||||||
|     private final ServerConnection serverConnection; |     private final ServerConnection serverConnection; | ||||||
|     private final ClientGameLogic logic; |     private final ClientGameLogic logic; | ||||||
|     private final MonopolyAppConfig config; |     private final MonopolyAppConfig config; | ||||||
|     private final ActionListener escapeListener = (name, isPressed, tpf) -> escape(isPressed); |     private final ActionListener escapeListener = (name, isPressed, tpf) -> handleEscape(isPressed); | ||||||
|     private final DialogManager dialogManager = new DialogManager(this); |     private final DialogManager dialogManager = new DialogManager(this); | ||||||
|     private final ExecutorService executor = Executors.newCachedThreadPool(); |     private final ExecutorService executor = Executors.newCachedThreadPool(); | ||||||
|  |     private SettingsMenu settingsMenu; | ||||||
|     private final Draw draw; |     private final Draw draw; | ||||||
|  |  | ||||||
|  |     private boolean isSettingsMenuOpen = false; | ||||||
|  |  | ||||||
|     public static void main(String[] args) { |     public static void main(String[] args) { | ||||||
|         new MonopolyApp().start(); |         new MonopolyApp().start(); | ||||||
|     } |     } | ||||||
| @@ -65,15 +68,24 @@ public class MonopolyApp extends SimpleApplication implements MonopolyClient, Ga | |||||||
|         return settings; |         return settings; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public boolean isSettingsMenuOpen() { | ||||||
|  |         return isSettingsMenuOpen; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setSettingsMenuOpen(boolean isOpen) { | ||||||
|  |         this.isSettingsMenuOpen = isOpen; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void simpleInitApp() { |     public void simpleInitApp() { | ||||||
|         stateManager.detach(stateManager.getState(com.jme3.app.StatsAppState.class)); //FPS-Anzeige |         GuiGlobals.initialize(this);  | ||||||
|         GuiGlobals.initialize(this); // Lemur initialisieren |         BaseStyles.loadGlassStyle(); | ||||||
|         BaseStyles.loadGlassStyle(); // Beispielstil für Lemur |  | ||||||
|         GuiGlobals.getInstance().getStyles().setDefaultStyle("glass"); |         GuiGlobals.getInstance().getStyles().setDefaultStyle("glass"); | ||||||
|  |  | ||||||
|         setupInput(); |         setupInput(); | ||||||
|         setupGui(); |         setupGui(); | ||||||
|  |  | ||||||
|  |         // Erst jetzt StartMenu erstellen, nachdem GuiGlobals initialisiert ist | ||||||
|         StartMenu.createStartMenu(this); |         StartMenu.createStartMenu(this); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -91,9 +103,17 @@ public class MonopolyApp extends SimpleApplication implements MonopolyClient, Ga | |||||||
|         inputManager.addListener(escapeListener, "ESC"); |         inputManager.addListener(escapeListener, "ESC"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void escape(boolean isPressed) { |     private void handleEscape(boolean isPressed) { | ||||||
|         if (!isPressed) return; |         if (isPressed) { | ||||||
|         new StartMenu(this); |             if (isSettingsMenuOpen && settingsMenu != null) { | ||||||
|  |                 settingsMenu.close(); | ||||||
|  |                 setSettingsMenuOpen(false); | ||||||
|  |             } else { | ||||||
|  |                 settingsMenu = new SettingsMenu(this); | ||||||
|  |                 settingsMenu.open(); | ||||||
|  |                 setSettingsMenuOpen(true); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     void setInfoText(String text) { |     void setInfoText(String text) { | ||||||
|   | |||||||
| @@ -1,17 +1,20 @@ | |||||||
| package pp.monopoly.client; | package pp.monopoly.client; | ||||||
|  |  | ||||||
|  | import com.jme3.material.Material; | ||||||
| import com.jme3.math.Vector3f; | import com.jme3.math.Vector3f; | ||||||
|  | import com.jme3.scene.Geometry; | ||||||
|  | import com.jme3.scene.shape.Quad; | ||||||
|  | import com.jme3.texture.Texture; | ||||||
| import com.simsilica.lemur.Axis; | import com.simsilica.lemur.Axis; | ||||||
| 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.component.SpringGridLayout; | import com.simsilica.lemur.component.SpringGridLayout; | ||||||
|  |  | ||||||
| import pp.dialog.Dialog; | import pp.dialog.Dialog; | ||||||
| import pp.monopoly.client.gui.CreateGameMenu; | import pp.monopoly.client.gui.CreateGameMenu; | ||||||
| import pp.monopoly.client.gui.SettingsMenu; | import pp.monopoly.client.gui.SettingsMenu; | ||||||
|  |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Constructs the startup menu dialog for the Monopoly application. |  * Constructs the startup menu dialog for the Monopoly application. | ||||||
|  */ |  */ | ||||||
| @@ -33,73 +36,73 @@ public class StartMenu extends Dialog { | |||||||
|      * opening settings, and quitting the application. |      * opening settings, and quitting the application. | ||||||
|      */ |      */ | ||||||
|     public static void createStartMenu(MonopolyApp app) { |     public static void createStartMenu(MonopolyApp app) { | ||||||
|  |  | ||||||
|         int screenWidth = app.getContext().getSettings().getWidth(); |         int screenWidth = app.getContext().getSettings().getWidth(); | ||||||
|         int screenHeight = app.getContext().getSettings().getHeight(); |         int screenHeight = app.getContext().getSettings().getHeight(); | ||||||
|  |  | ||||||
|         // Center container for header and play button |         // Set up the background image | ||||||
|  |         Texture backgroundImage = app.getAssetManager().loadTexture("Pictures/unibw-Bib2.png"); | ||||||
|  |         Quad quad = new Quad(screenWidth, screenHeight); | ||||||
|  |         Geometry background = new Geometry("Background", quad); | ||||||
|  |         Material backgroundMaterial = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); | ||||||
|  |         backgroundMaterial.setTexture("ColorMap", backgroundImage); | ||||||
|  |         background.setMaterial(backgroundMaterial); | ||||||
|  |         background.setLocalTranslation(0, 0, -1); // Ensure it is behind other GUI elements | ||||||
|  |         app.getGuiNode().attachChild(background); | ||||||
|  |  | ||||||
|  |         // Center container for title and play button | ||||||
|         Container centerMenu = new Container(new SpringGridLayout(Axis.Y, Axis.X)); |         Container centerMenu = new Container(new SpringGridLayout(Axis.Y, Axis.X)); | ||||||
|         centerMenu.setLocalTranslation(new Vector3f(300, 300, 0)); // Position in the center of the screen |         Label titleLabel = new Label("Hauptmenü"); | ||||||
|  |         titleLabel.setFontSize(48); | ||||||
|  |         centerMenu.addChild(titleLabel); | ||||||
|  |  | ||||||
|         // Title of the main menu |         Button startButton = new Button("Spielen"); | ||||||
|         centerMenu.addChild(new Label("Hauptmenü")); |  | ||||||
|  |  | ||||||
|         // "Spielen" button - centered |  | ||||||
|         Button startButton = centerMenu.addChild(new Button("Spielen")); |  | ||||||
|         startButton.addClickCommands(source -> startGame(app)); |         startButton.addClickCommands(source -> startGame(app)); | ||||||
|  |         centerMenu.addChild(startButton); | ||||||
|  |  | ||||||
|         // Position the center container in the middle of the screen |         // Position the center container in the middle of the screen | ||||||
|         centerMenu.setLocalTranslation(new Vector3f(screenWidth / 2f - centerMenu.getPreferredSize().x / 2f, |         centerMenu.setLocalTranslation(new Vector3f( | ||||||
|  |                 screenWidth / 2f - centerMenu.getPreferredSize().x / 2f, | ||||||
|                 screenHeight / 2f + centerMenu.getPreferredSize().y / 2f, |                 screenHeight / 2f + centerMenu.getPreferredSize().y / 2f, | ||||||
|                 0)); |                 0)); | ||||||
|  |  | ||||||
|         // Attach the center container to the GUI node |  | ||||||
|         app.getGuiNode().attachChild(centerMenu); |         app.getGuiNode().attachChild(centerMenu); | ||||||
|  |  | ||||||
|         // Lower-left container for "Spiel beenden" button |         // Lower-left container for "Spiel beenden" button | ||||||
|         Container lowerLeftMenu = new Container(); |         Container lowerLeftMenu = new Container(); | ||||||
|         lowerLeftMenu.setLocalTranslation(new Vector3f(50, 50, 0)); // Position in the lower-left corner |         lowerLeftMenu.setLocalTranslation(new Vector3f(50, 50, 0)); | ||||||
|  |         Button quitButton = new Button("Spiel beenden"); | ||||||
|         // "Spiel beenden" button - lower left corner |  | ||||||
|         Button quitButton = lowerLeftMenu.addChild(new Button("Spiel beenden")); |  | ||||||
|         quitButton.addClickCommands(source -> quitGame()); |         quitButton.addClickCommands(source -> quitGame()); | ||||||
|  |         lowerLeftMenu.addChild(quitButton); | ||||||
|         // Attach the lower-left container to the GUI node |  | ||||||
|         app.getGuiNode().attachChild(lowerLeftMenu); |         app.getGuiNode().attachChild(lowerLeftMenu); | ||||||
|  |  | ||||||
|         // Lower-right container for "Einstellungen" button |         // Lower-right container for "Einstellungen" button | ||||||
|         Container lowerRightMenu = new Container(); |         Container lowerRightMenu = new Container(); | ||||||
|         lowerRightMenu.setLocalTranslation(new Vector3f(screenWidth - 150, 50, 0)); // Position in the lower-right corner |         lowerRightMenu.setLocalTranslation(new Vector3f(screenWidth - 150, 50, 0)); | ||||||
|  |         Button settingsButton = new Button("Einstellungen"); | ||||||
|         // "Einstellungen" button - lower right corner |  | ||||||
|         Button settingsButton = lowerRightMenu.addChild(new Button("Einstellungen")); |  | ||||||
|         settingsButton.addClickCommands(source -> openSettings(app)); |         settingsButton.addClickCommands(source -> openSettings(app)); | ||||||
|  |         lowerRightMenu.addChild(settingsButton); | ||||||
|         // Attach the lower-right container to the GUI node |  | ||||||
|         app.getGuiNode().attachChild(lowerRightMenu); |         app.getGuiNode().attachChild(lowerRightMenu); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Starts the game by transitioning to the CreateGameMenu. |      * Starts the game by transitioning to the CreateGameMenu. | ||||||
|      */ |      */ | ||||||
|     private static void startGame(MonopolyApp app) { |     private static void startGame(MonopolyApp app) { | ||||||
|         app.getGuiNode().detachAllChildren(); // Schließt das Startmenü |         app.getGuiNode().detachAllChildren(); | ||||||
|         CreateGameMenu createGameMenu = new CreateGameMenu(app); |         new CreateGameMenu(app); | ||||||
|         // Code zur Anzeige des CreateGameMenu, eventuell zusätzliche Initialisierung |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Opens the settings menu. |      * Opens the settings menu. | ||||||
|      */ |      */ | ||||||
|     private static void openSettings(MonopolyApp app) { |     private static void openSettings(MonopolyApp app) { | ||||||
|         app.getGuiNode().detachAllChildren(); // Schließt das Startmenü |         app.getGuiNode().detachAllChildren(); | ||||||
|         SettingsMenu settingsMenu = new SettingsMenu(app); |         new SettingsMenu(app); | ||||||
|         // Code zur Anzeige des SettingsMenu |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Quits the game application. |      * Quits the game application. | ||||||
|      */ |      */ | ||||||
|     private static void quitGame() { |     private static void quitGame() { | ||||||
|         System.exit(0);  // Beendet die Anwendung |         System.exit(0); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,77 +1,70 @@ | |||||||
| package pp.monopoly.client.gui; | package pp.monopoly.client.gui; | ||||||
|  |  | ||||||
| import com.jme3.math.Vector3f; | import com.jme3.math.Vector3f; | ||||||
|  | import com.simsilica.lemur.Axis; | ||||||
| import com.simsilica.lemur.Button; | import com.simsilica.lemur.Button; | ||||||
| import com.simsilica.lemur.Container; | import com.simsilica.lemur.Container; | ||||||
|  | import com.simsilica.lemur.Insets3f; | ||||||
| import com.simsilica.lemur.Label; | 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.MonopolyApp; | ||||||
| import pp.monopoly.client.StartMenu; |  | ||||||
|  |  | ||||||
| /** | public class CreateGameMenu { | ||||||
|  * Menu for creating a new game, where players can configure settings before starting. |  | ||||||
|  */ |  | ||||||
| public class CreateGameMenu extends Dialog { |  | ||||||
|     private final MonopolyApp app; |     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) { |     public CreateGameMenu(MonopolyApp app) { | ||||||
|         super(app.getDialogManager()); |  | ||||||
|         this.app = app; |         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() { |     public void close() { | ||||||
|         Container menuContainer = new Container(); |         app.getGuiNode().detachChild(createGameContainer); | ||||||
|         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 |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,70 +1,78 @@ | |||||||
| package pp.monopoly.client.gui; | package pp.monopoly.client.gui; | ||||||
|  |  | ||||||
| import com.jme3.math.Vector3f; | import com.jme3.math.ColorRGBA; | ||||||
| import com.simsilica.lemur.Button; | import com.simsilica.lemur.Button; | ||||||
| import com.simsilica.lemur.Checkbox; | import com.simsilica.lemur.Checkbox; | ||||||
| import com.simsilica.lemur.Container; | import com.simsilica.lemur.Container; | ||||||
| import com.simsilica.lemur.Label; | import com.simsilica.lemur.Label; | ||||||
|  | import com.simsilica.lemur.Slider; | ||||||
|  | import com.simsilica.lemur.component.QuadBackgroundComponent; | ||||||
|  | import com.simsilica.lemur.style.ElementId; | ||||||
|  |  | ||||||
| import pp.dialog.Dialog; | import pp.dialog.Dialog; | ||||||
| import pp.monopoly.client.GameSound; |  | ||||||
| import pp.monopoly.client.MonopolyApp; | import pp.monopoly.client.MonopolyApp; | ||||||
| import pp.monopoly.client.StartMenu; |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Settings menu for the Monopoly application, where users can configure preferences. |  | ||||||
|  */ |  | ||||||
| public class SettingsMenu extends Dialog { | public class SettingsMenu extends Dialog { | ||||||
|     private final MonopolyApp app; |     private final MonopolyApp app; | ||||||
|  |     private final Container settingsContainer; | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Constructs the SettingsMenu dialog for the Monopoly application. |  | ||||||
|      * |  | ||||||
|      * @param app the MonopolyApp instance |  | ||||||
|      */ |  | ||||||
|     public SettingsMenu(MonopolyApp app) { |     public SettingsMenu(MonopolyApp app) { | ||||||
|         super(app.getDialogManager()); |         super(app.getDialogManager()); | ||||||
|         this.app = app; |         this.app = app; | ||||||
|         initializeMenu(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |         settingsContainer = new Container(); | ||||||
|      * Sets up the layout and elements for the settings menu. |  | ||||||
|      */ |  | ||||||
|     private void initializeMenu() { |  | ||||||
|         Container settingsContainer = new Container(); |  | ||||||
|         settingsContainer.setLocalTranslation(new Vector3f(300, 300, 0));  // Positionierung des Menüs |  | ||||||
|          |          | ||||||
|         // Titel des Menüs |         // Hintergrundfarbe für das Container-Element setzen, um es undurchsichtig zu machen | ||||||
|         settingsContainer.addChild(new Label("Einstellungen")); |         settingsContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.1f, 0.1f, 0.1f, 1f))); // Dunkelgrauer, undurchsichtiger Hintergrund | ||||||
|  |  | ||||||
|         // Beispiel-Einstellung: Sound aktivieren/deaktivieren |         // Titel "Einstellungen" | ||||||
|         Checkbox soundCheckbox = settingsContainer.addChild(new Checkbox("Sound aktivieren")); |         Label settingsTitle = settingsContainer.addChild(new Label("Einstellungen", new ElementId("settings-title"))); | ||||||
|         soundCheckbox.setChecked(GameSound.enabledInPreferences()); |         settingsTitle.setFontSize(48); | ||||||
|         soundCheckbox.addClickCommands(source -> toggleSound(soundCheckbox.isChecked())); |         settingsTitle.setColor(ColorRGBA.White); | ||||||
|  |  | ||||||
|         // Zurück-Button zum Startmenü |         // Effekt Sound mit Slider und Checkbox | ||||||
|         Button backButton = settingsContainer.addChild(new Button("Zurück")); |         Container effectSoundContainer = settingsContainer.addChild(new Container()); | ||||||
|         backButton.addClickCommands(source -> returnToStartMenu()); |         Label effectSoundLabel = effectSoundContainer.addChild(new Label("Effekt Sound", new ElementId("label"))); | ||||||
|  |         effectSoundLabel.setFontSize(24); | ||||||
|  |         effectSoundLabel.setColor(ColorRGBA.White); | ||||||
|  |  | ||||||
|  |         Slider effectSoundSlider = effectSoundContainer.addChild(new Slider()); | ||||||
|  |         effectSoundSlider.setPreferredSize(new com.jme3.math.Vector3f(300, 30, 0)); | ||||||
|  |  | ||||||
|  |         Checkbox effectSoundCheckbox = effectSoundContainer.addChild(new Checkbox("")); | ||||||
|  |         effectSoundCheckbox.setChecked(true); | ||||||
|  |  | ||||||
|  |         // Hintergrund Musik mit Slider und Checkbox | ||||||
|  |         Container backgroundMusicContainer = settingsContainer.addChild(new Container()); | ||||||
|  |         Label backgroundMusicLabel = backgroundMusicContainer.addChild(new Label("Hintergrund Musik", new ElementId("label"))); | ||||||
|  |         backgroundMusicLabel.setFontSize(24); | ||||||
|  |         backgroundMusicLabel.setColor(ColorRGBA.White); | ||||||
|  |  | ||||||
|  |         Slider backgroundMusicSlider = backgroundMusicContainer.addChild(new Slider()); | ||||||
|  |         backgroundMusicSlider.setPreferredSize(new com.jme3.math.Vector3f(300, 30, 0)); | ||||||
|  |  | ||||||
|  |         Checkbox backgroundMusicCheckbox = backgroundMusicContainer.addChild(new Checkbox("")); | ||||||
|  |         backgroundMusicCheckbox.setChecked(true); | ||||||
|  |  | ||||||
|  |         // Beenden Button | ||||||
|  |         Button quitButton = settingsContainer.addChild(new Button("Beenden", new ElementId("menu-button"))); | ||||||
|  |         quitButton.setFontSize(32); | ||||||
|  |         quitButton.setColor(ColorRGBA.White); | ||||||
|  |         quitButton.addClickCommands(source -> app.stop()); | ||||||
|  |  | ||||||
|  |         // Zentrieren des Containers | ||||||
|  |         settingsContainer.setLocalTranslation( | ||||||
|  |             (app.getCamera().getWidth() - settingsContainer.getPreferredSize().x) / 2, | ||||||
|  |             (app.getCamera().getHeight() + settingsContainer.getPreferredSize().y) / 2, | ||||||
|  |             0 | ||||||
|  |         ); | ||||||
|  |  | ||||||
|         app.getGuiNode().attachChild(settingsContainer); |         app.getGuiNode().attachChild(settingsContainer); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     @Override | ||||||
|      * Toggles the sound setting and saves the preference. |     public void close() { | ||||||
|      * |         app.getGuiNode().detachChild(settingsContainer); | ||||||
|      * @param enabled true if sound should be enabled; false otherwise. |         app.setSettingsMenuOpen(false); | ||||||
|      */ |  | ||||||
|     private void toggleSound(boolean enabled) { |  | ||||||
|         GameSound.enabledInPreferences(); // Speichert die Einstellung in den Preferences |  | ||||||
|         System.out.println("Sound " + (enabled ? "aktiviert" : "deaktiviert")); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Returns to the StartMenu. |  | ||||||
|      */ |  | ||||||
|     private void returnToStartMenu() { |  | ||||||
|         app.getGuiNode().detachAllChildren(); // Schließt das SettingsMenu |  | ||||||
|         StartMenu.createStartMenu(app);  // Zeigt das Startmenü erneut an |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								Projekte/monopoly/client/src/main/resources/Pictures/board.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Projekte/monopoly/client/src/main/resources/Pictures/board.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 857 KiB | 
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 7.1 MiB | 
| @@ -7,18 +7,6 @@ | |||||||
|  |  | ||||||
| package pp.monopoly.game.client; | package pp.monopoly.game.client; | ||||||
|  |  | ||||||
| import pp.monopoly.message.client.ClientMessage; |  | ||||||
| import pp.monopoly.message.server.ServerInterpreter; |  | ||||||
| import pp.monopoly.model.IntPoint; |  | ||||||
| import pp.monopoly.model.Board; |  | ||||||
| import pp.monopoly.notification.ClientStateEvent; |  | ||||||
| import pp.monopoly.notification.GameEvent; |  | ||||||
| import pp.monopoly.notification.GameEventBroker; |  | ||||||
| import pp.monopoly.notification.GameEventListener; |  | ||||||
| import pp.monopoly.notification.InfoTextEvent; |  | ||||||
| import pp.monopoly.notification.Sound; |  | ||||||
| import pp.monopoly.notification.SoundEvent; |  | ||||||
|  |  | ||||||
| import java.io.File; | import java.io.File; | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.lang.System.Logger; | import java.lang.System.Logger; | ||||||
| @@ -26,7 +14,17 @@ import java.lang.System.Logger.Level; | |||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  |  | ||||||
| import static java.lang.Math.max; | import pp.monopoly.message.client.ClientMessage; | ||||||
|  | import pp.monopoly.message.server.ServerInterpreter; | ||||||
|  | import pp.monopoly.model.Board; | ||||||
|  | import pp.monopoly.model.IntPoint; | ||||||
|  | import pp.monopoly.notification.ClientStateEvent; | ||||||
|  | import pp.monopoly.notification.GameEvent; | ||||||
|  | import pp.monopoly.notification.GameEventBroker; | ||||||
|  | import pp.monopoly.notification.GameEventListener; | ||||||
|  | import pp.monopoly.notification.InfoTextEvent; | ||||||
|  | import pp.monopoly.notification.Sound; | ||||||
|  | import pp.monopoly.notification.SoundEvent; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Controls the client-side game logic for Monopoly. |  * Controls the client-side game logic for Monopoly. | ||||||
|   | |||||||
| @@ -7,13 +7,9 @@ | |||||||
|  |  | ||||||
| package pp.monopoly.game.client; | package pp.monopoly.game.client; | ||||||
|  |  | ||||||
| import pp.monopoly.MonopolyConfig; |  | ||||||
| import pp.monopoly.model.IntPoint; |  | ||||||
|  |  | ||||||
| import java.io.File; | import java.io.File; | ||||||
| import java.util.ArrayList; |  | ||||||
| import java.util.Iterator; | import pp.monopoly.MonopolyConfig; | ||||||
| import java.util.List; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Class providing access to the Monopoly client configuration. |  * Class providing access to the Monopoly client configuration. | ||||||
|   | |||||||
| @@ -7,12 +7,6 @@ | |||||||
|  |  | ||||||
| package pp.monopoly.game.server; | package pp.monopoly.game.server; | ||||||
|  |  | ||||||
| import pp.monopoly.MonopolyConfig; |  | ||||||
| import pp.monopoly.message.client.ClientInterpreter; |  | ||||||
| import pp.monopoly.message.server.ServerMessage; |  | ||||||
|  |  | ||||||
| import pp.monopoly.model.IntPoint; |  | ||||||
|  |  | ||||||
| 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.ArrayList; | import java.util.ArrayList; | ||||||
| @@ -20,6 +14,10 @@ import java.util.HashSet; | |||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
|  |  | ||||||
|  | import pp.monopoly.MonopolyConfig; | ||||||
|  | import pp.monopoly.message.client.ClientInterpreter; | ||||||
|  | import pp.monopoly.message.server.ServerMessage; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Controls the server-side game logic for Monopoly. |  * Controls the server-side game logic for Monopoly. | ||||||
|  * Manages game states, player interactions, and message handling. |  * Manages game states, player interactions, and message handling. | ||||||
|   | |||||||
| @@ -7,10 +7,10 @@ | |||||||
|  |  | ||||||
| package pp.monopoly.model; | package pp.monopoly.model; | ||||||
|  |  | ||||||
| import com.jme3.network.serializing.Serializable; |  | ||||||
|  |  | ||||||
| import java.util.Objects; | import java.util.Objects; | ||||||
|  |  | ||||||
|  | import com.jme3.network.serializing.Serializable; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Represents a point in the two-dimensional plane with integer coordinates. |  * Represents a point in the two-dimensional plane with integer coordinates. | ||||||
|  */ |  */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user