mirror of
				https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02.git
				synced 2025-10-31 12:21:52 +01:00 
			
		
		
		
	Compare commits
	
		
			4 Commits
		
	
	
		
			c346058631
			...
			26d8283930
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 26d8283930 | ||
|  | 4079c0a32c | ||
|  | 6d72a94fe4 | ||
|  | 9e595b92ba | 
| @@ -10,12 +10,16 @@ import com.jme3.scene.shape.Box; | |||||||
| import com.jme3.texture.Texture; | import com.jme3.texture.Texture; | ||||||
|  |  | ||||||
| import pp.monopoly.client.MonopolyApp; | import pp.monopoly.client.MonopolyApp; | ||||||
|  | import pp.monopoly.client.gui.popups.EventCard; | ||||||
|  | import pp.monopoly.notification.DiceRollEvent; | ||||||
|  | import pp.monopoly.notification.EventCardEvent; | ||||||
|  | import pp.monopoly.notification.GameEventListener; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * TestWorld zeigt eine einfache Szene mit einem texturierten Quadrat. |  * TestWorld zeigt eine einfache Szene mit einem texturierten Quadrat. | ||||||
|  * Die Kamera wird durch den CameraController gesteuert. |  * Die Kamera wird durch den CameraController gesteuert. | ||||||
|  */ |  */ | ||||||
| public class TestWorld { | public class TestWorld implements GameEventListener{ | ||||||
|  |  | ||||||
|     private final MonopolyApp app; |     private final MonopolyApp app; | ||||||
|     private CameraController cameraController; // Steuert die Kamera |     private CameraController cameraController; // Steuert die Kamera | ||||||
| @@ -28,6 +32,7 @@ public class TestWorld { | |||||||
|      */ |      */ | ||||||
|     public TestWorld(MonopolyApp app) { |     public TestWorld(MonopolyApp app) { | ||||||
|         this.app = app; |         this.app = app; | ||||||
|  |         app.getGameLogic().addListener(this); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @@ -91,4 +96,9 @@ public class TestWorld { | |||||||
|  |  | ||||||
|         app.getRootNode().attachChild(geom); |         app.getRootNode().attachChild(geom); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void receivedEvent(EventCardEvent event) { | ||||||
|  |         new EventCard(app, event.description()).open(); | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,19 +1,12 @@ | |||||||
|  |  | ||||||
| package pp.monopoly.client.gui; | package pp.monopoly.client.gui; | ||||||
|  |  | ||||||
| import com.jme3.math.ColorRGBA; | import com.jme3.math.ColorRGBA; | ||||||
| import com.jme3.math.Vector2f; | import com.jme3.math.Vector2f; | ||||||
| import com.jme3.math.Vector3f; | import com.jme3.math.Vector3f; | ||||||
| import com.simsilica.lemur.Axis; | import com.simsilica.lemur.*; | ||||||
| import com.simsilica.lemur.Button; |  | ||||||
| import com.simsilica.lemur.Container; |  | ||||||
| import com.simsilica.lemur.HAlignment; |  | ||||||
| import com.simsilica.lemur.Label; |  | ||||||
| import com.simsilica.lemur.VAlignment; |  | ||||||
| import com.simsilica.lemur.component.IconComponent; | import com.simsilica.lemur.component.IconComponent; | ||||||
| import com.simsilica.lemur.component.QuadBackgroundComponent; | import com.simsilica.lemur.component.QuadBackgroundComponent; | ||||||
| import com.simsilica.lemur.component.SpringGridLayout; | import com.simsilica.lemur.component.SpringGridLayout; | ||||||
|  |  | ||||||
| import com.simsilica.lemur.style.ElementId; | import com.simsilica.lemur.style.ElementId; | ||||||
|  |  | ||||||
| import pp.dialog.Dialog; | import pp.dialog.Dialog; | ||||||
| @@ -27,11 +20,7 @@ import pp.monopoly.notification.GameEventListener; | |||||||
| import pp.monopoly.notification.Sound; | import pp.monopoly.notification.Sound; | ||||||
| import pp.monopoly.notification.UpdatePlayerView; | import pp.monopoly.notification.UpdatePlayerView; | ||||||
|  |  | ||||||
| /** | public class Toolbar extends Dialog implements GameEventListener { | ||||||
|  * Toolbar Klasse, die am unteren Rand der Szene angezeigt wird. |  | ||||||
|  * Die Buttons bewegen den Würfel auf dem Spielfeld. |  | ||||||
|  */ |  | ||||||
| public class Toolbar extends Dialog implements GameEventListener{ |  | ||||||
|  |  | ||||||
|     private final MonopolyApp app; |     private final MonopolyApp app; | ||||||
|     private final Container toolbarContainer; |     private final Container toolbarContainer; | ||||||
| @@ -40,13 +29,9 @@ public class Toolbar extends Dialog implements GameEventListener{ | |||||||
|     private Container overviewContainer; |     private Container overviewContainer; | ||||||
|     private Container accountContainer; |     private Container accountContainer; | ||||||
|     private PlayerHandler playerHandler; |     private PlayerHandler playerHandler; | ||||||
|  |     private volatile boolean animatingDice = false; | ||||||
|  |     private volatile DiceRollEvent latestDiceRollEvent = null; | ||||||
|  |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Konstruktor für die Toolbar. |  | ||||||
|      * |  | ||||||
|      * @param app  Die Hauptanwendung (MonopolyApp) |  | ||||||
|      */ |  | ||||||
|     public Toolbar(MonopolyApp app) { |     public Toolbar(MonopolyApp app) { | ||||||
|         super(app.getDialogManager()); |         super(app.getDialogManager()); | ||||||
|         this.app = app; |         this.app = app; | ||||||
| @@ -56,110 +41,80 @@ public class Toolbar extends Dialog implements GameEventListener{ | |||||||
|  |  | ||||||
|         // Erstelle die Toolbar |         // Erstelle die Toolbar | ||||||
|         toolbarContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y), "toolbar"); |         toolbarContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y), "toolbar"); | ||||||
|  |         toolbarContainer.setLocalTranslation(0, 200, 0); | ||||||
|  |         toolbarContainer.setPreferredSize(new Vector3f(app.getCamera().getWidth(), 200, 0)); | ||||||
|  |  | ||||||
|         // Setze die Position am unteren Rand und die Breite |         // Account- und Übersichtskontainer | ||||||
|         toolbarContainer.setLocalTranslation( |  | ||||||
|                 0,                                 // Links bündig |  | ||||||
|                 200,                               // Höhe über dem unteren Rand |  | ||||||
|                 0                                  // Z-Ebene |  | ||||||
|         ); |  | ||||||
|         toolbarContainer.setPreferredSize(new Vector3f(app.getCamera().getWidth(), 200, 0)); // Volle Breite |  | ||||||
|  |  | ||||||
|  |  | ||||||
|         // Menü-Container: Ein Nested-Container für Kontostand und "Meine Gulag Frei Karten" |  | ||||||
|         accountContainer = toolbarContainer.addChild(new Container()); |         accountContainer = toolbarContainer.addChild(new Container()); | ||||||
|         // Menü-Container: Ein Container für Übersicht |  | ||||||
|         overviewContainer = toolbarContainer.addChild(new Container()); |         overviewContainer = toolbarContainer.addChild(new Container()); | ||||||
|  |  | ||||||
|         receivedEvent(new UpdatePlayerView()); |         receivedEvent(new UpdatePlayerView()); | ||||||
|  |  | ||||||
|  |  | ||||||
|         overviewContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); |         overviewContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); | ||||||
|  |  | ||||||
|         // Menü-Container: Ein Container für Würfel |         // Würfelbereich | ||||||
|         Container diceContainer = toolbarContainer.addChild(new Container()); |         Container diceContainer = toolbarContainer.addChild(new Container()); | ||||||
|         diceContainer.setLayout(new SpringGridLayout(Axis.X, Axis.Y)); |         diceContainer.setLayout(new SpringGridLayout(Axis.X, Axis.Y)); | ||||||
|  |  | ||||||
|         // Create a horizontal container to align leftContainer and rightContainer side by side |  | ||||||
|         Container horizontalContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y)); |         Container horizontalContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y)); | ||||||
|         horizontalContainer.setPreferredSize(new Vector3f(200, 150, 0)); // Adjust size as needed |         horizontalContainer.setPreferredSize(new Vector3f(200, 150, 0)); | ||||||
|  |  | ||||||
|         // Create the first container (leftContainer) |         // Linker Würfel | ||||||
|         Container leftContainer = new Container(); |         Container leftContainer = new Container(); | ||||||
|         leftContainer.setPreferredSize(new Vector3f(100, 150, 0)); // Adjust size as needed |         leftContainer.setPreferredSize(new Vector3f(100, 150, 0)); | ||||||
|  |  | ||||||
|         imageLabel = new Label(""); |         imageLabel = new Label(""); | ||||||
|         IconComponent icon = new IconComponent("Pictures/dice/one.png"); // Icon mit Textur erstellen |         IconComponent icon = new IconComponent("Pictures/dice/one.png"); | ||||||
|         icon.setIconSize(new Vector2f(100,100)); // Skalierung des Bildes |         icon.setIconSize(new Vector2f(100, 100)); | ||||||
|         imageLabel.setIcon(icon); |         imageLabel.setIcon(icon); | ||||||
|  |  | ||||||
|         imageLabel2 = new Label(""); |         // Rechter Würfel | ||||||
|         IconComponent icon2 = new IconComponent("Pictures/dice/two.png"); // Icon mit Textur erstellen |  | ||||||
|         icon2.setIconSize(new Vector2f(100,100)); // Skalierung des Bildes |  | ||||||
|         imageLabel2.setIcon(icon2); |  | ||||||
|  |  | ||||||
|         // Create the second container (rightContainer) |  | ||||||
|         Container rightContainer = new Container(); |         Container rightContainer = new Container(); | ||||||
|         rightContainer.setPreferredSize(new Vector3f(100, 150, 0)); // Adjust size as needed |         rightContainer.setPreferredSize(new Vector3f(100, 150, 0)); | ||||||
|         leftContainer.setBackground(null); |         imageLabel2 = new Label(""); | ||||||
|         rightContainer.setBackground(null); |         IconComponent icon2 = new IconComponent("Pictures/dice/two.png"); | ||||||
|         diceContainer.setBackground(null); |         icon2.setIconSize(new Vector2f(100, 100)); | ||||||
|         horizontalContainer.setBackground(null); |         imageLabel2.setIcon(icon2); | ||||||
|  |  | ||||||
|         imageLabel.setTextVAlignment(VAlignment.Center); |  | ||||||
|         imageLabel.setTextHAlignment(HAlignment.Center); |  | ||||||
|         imageLabel2.setTextVAlignment(VAlignment.Center); |  | ||||||
|         imageLabel2.setTextHAlignment(HAlignment.Center); |  | ||||||
|  |  | ||||||
|         leftContainer.addChild(imageLabel); |         leftContainer.addChild(imageLabel); | ||||||
|         rightContainer.addChild(imageLabel2); |         rightContainer.addChild(imageLabel2); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|         // Add leftContainer and rightContainer to the horizontal container |  | ||||||
|         horizontalContainer.addChild(leftContainer); |         horizontalContainer.addChild(leftContainer); | ||||||
|         horizontalContainer.addChild(rightContainer); |         horizontalContainer.addChild(rightContainer); | ||||||
|  |  | ||||||
|         // Add the horizontalContainer to the diceContainer (top section) |  | ||||||
|         diceContainer.addChild(horizontalContainer); |         diceContainer.addChild(horizontalContainer); | ||||||
|  |  | ||||||
|         // Add the Würfeln button directly below the horizontalContainer |         // Würfeln-Button | ||||||
|         Button diceButton = new Button("Würfeln"); |         Button diceButton = new Button("Würfeln"); | ||||||
|         diceButton.setPreferredSize(new Vector3f(200, 50, 0)); // Full width for Würfeln button |         diceButton.setPreferredSize(new Vector3f(200, 50, 0)); | ||||||
|         diceButton.addClickCommands(s -> ifTopDialog(() -> { |         diceButton.addClickCommands(s -> ifTopDialog(() -> { | ||||||
|  |             startDiceAnimation(); | ||||||
|             app.getGameLogic().send(new RollDice()); |             app.getGameLogic().send(new RollDice()); | ||||||
|             app.getGameLogic().playSound(Sound.BUTTON); |             app.getGameLogic().playSound(Sound.BUTTON); | ||||||
|         })); |         })); | ||||||
|         diceContainer.addChild(diceButton); |         diceContainer.addChild(diceButton); | ||||||
|  |  | ||||||
|  |         // Menü-Container für weitere Aktionen | ||||||
|  |  | ||||||
|  |  | ||||||
|         // Menü-Container: Ein Nested-Container für Handeln, Grundstücke und Zug beenden |  | ||||||
|         Container menuContainer = toolbarContainer.addChild(new Container()); |         Container menuContainer = toolbarContainer.addChild(new Container()); | ||||||
|         menuContainer.addChild(addTradeMenuButton()); |         menuContainer.addChild(addTradeMenuButton()); | ||||||
|         menuContainer.addChild(addPropertyMenuButton()); |         menuContainer.addChild(addPropertyMenuButton()); | ||||||
|         menuContainer.addChild(addEndTurnButton()); |         menuContainer.addChild(addEndTurnButton()); | ||||||
|         menuContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); |         menuContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); | ||||||
|  |  | ||||||
|         // Füge die Toolbar zur GUI hinzu |  | ||||||
|         app.getGuiNode().attachChild(toolbarContainer); |         app.getGuiNode().attachChild(toolbarContainer); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private Button addTradeMenuButton() { |     private Button addTradeMenuButton() { | ||||||
|         Button tradebutton = new Button("Handeln"); |         Button tradeButton = new Button("Handeln"); | ||||||
|         tradebutton.setPreferredSize(new Vector3f(150, 50, 0)); // Größe des Buttons |         tradeButton.setPreferredSize(new Vector3f(150, 50, 0)); | ||||||
|         tradebutton.addClickCommands(s  ->  ifTopDialog( () -> { |         tradeButton.addClickCommands(s -> ifTopDialog(() -> { | ||||||
|             app.getGameLogic().playSound(Sound.BUTTON); |             app.getGameLogic().playSound(Sound.BUTTON); | ||||||
|             new ChoosePartner(app).open(); |             new ChoosePartner(app).open(); | ||||||
|         })); |         })); | ||||||
|         return tradebutton; |         return tradeButton; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private Button addPropertyMenuButton() { |     private Button addPropertyMenuButton() { | ||||||
|         Button propertyMenuButton = new Button("Grundstücke"); |         Button propertyMenuButton = new Button("Grundstücke"); | ||||||
|         propertyMenuButton.setFontSize(30.0f); |         propertyMenuButton.setPreferredSize(new Vector3f(150, 50, 0)); | ||||||
|         propertyMenuButton.setPreferredSize(new Vector3f(150, 50, 0)); // Größe des Buttons |  | ||||||
|         propertyMenuButton.addClickCommands(s -> ifTopDialog(() -> { |         propertyMenuButton.addClickCommands(s -> ifTopDialog(() -> { | ||||||
|             app.getGameLogic().playSound(Sound.BUTTON); |             app.getGameLogic().playSound(Sound.BUTTON); | ||||||
|             new BuildingAdminMenu(app).open(); |             new BuildingAdminMenu(app).open(); | ||||||
| @@ -169,7 +124,7 @@ public class Toolbar extends Dialog implements GameEventListener{ | |||||||
|  |  | ||||||
|     private Button addEndTurnButton() { |     private Button addEndTurnButton() { | ||||||
|         Button endTurnButton = new Button("Zug beenden"); |         Button endTurnButton = new Button("Zug beenden"); | ||||||
|         endTurnButton.setPreferredSize(new Vector3f(150, 50, 0)); // Größe des Buttons |         endTurnButton.setPreferredSize(new Vector3f(150, 50, 0)); | ||||||
|         endTurnButton.addClickCommands(s -> ifTopDialog(() -> { |         endTurnButton.addClickCommands(s -> ifTopDialog(() -> { | ||||||
|             app.getGameLogic().playSound(Sound.BUTTON); |             app.getGameLogic().playSound(Sound.BUTTON); | ||||||
|             app.getGameLogic().send(new EndTurn()); |             app.getGameLogic().send(new EndTurn()); | ||||||
| @@ -177,29 +132,80 @@ public class Toolbar extends Dialog implements GameEventListener{ | |||||||
|         return endTurnButton; |         return endTurnButton; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     private void startDiceAnimation() { | ||||||
|     public void close() { |         animatingDice = true; | ||||||
|         app.getGuiNode().detachChild(toolbarContainer); |  | ||||||
|         super.close(); |         // Starte die Animation und speichere die Startzeit | ||||||
|  |         long startTime = System.currentTimeMillis(); | ||||||
|  |  | ||||||
|  |         Thread diceAnimation = new Thread(() -> { | ||||||
|  |             int[] currentFace = {1}; | ||||||
|  |             try { | ||||||
|  |                 while (System.currentTimeMillis() - startTime < 2500) { // Animation läuft für 4 Sekunden | ||||||
|  |                     currentFace[0] = (currentFace[0] % 6) + 1; | ||||||
|  |  | ||||||
|  |                     String rotatingImage1 = diceToString(currentFace[0]); | ||||||
|  |                     String rotatingImage2 = diceToString((currentFace[0] % 6) + 1); | ||||||
|  |  | ||||||
|  |                     IconComponent newIcon1 = new IconComponent(rotatingImage1); | ||||||
|  |                     newIcon1.setIconSize(new Vector2f(100, 100)); | ||||||
|  |                     app.enqueue(() -> imageLabel.setIcon(newIcon1)); | ||||||
|  |  | ||||||
|  |                     IconComponent newIcon2 = new IconComponent(rotatingImage2); | ||||||
|  |                     newIcon2.setIconSize(new Vector2f(100, 100)); | ||||||
|  |                     app.enqueue(() -> imageLabel2.setIcon(newIcon2)); | ||||||
|  |  | ||||||
|  |                     // Warte 100 ms, bevor die Bilder wechseln | ||||||
|  |                     Thread.sleep(100); | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|     @Override |                 // Animation beenden | ||||||
|     public void escape() { |                 animatingDice = false; | ||||||
|         new SettingsMenu(app).open(); |  | ||||||
|  |                 // Zeige das finale Ergebnis | ||||||
|  |                 if (latestDiceRollEvent != null) { | ||||||
|  |                     showFinalDiceResult(latestDiceRollEvent); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |             } catch (InterruptedException e) { | ||||||
|  |                 System.err.println("Würfelanimation unterbrochen: " + e.getMessage()); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |         diceAnimation.start(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void showFinalDiceResult(DiceRollEvent event) { | ||||||
|  |         int diceRoll1 = event.a(); | ||||||
|  |         int diceRoll2 = event.b(); | ||||||
|  |  | ||||||
|  |         String finalImage1 = diceToString(diceRoll1); | ||||||
|  |         String finalImage2 = diceToString(diceRoll2); | ||||||
|  |  | ||||||
|  |         IconComponent finalIcon1 = new IconComponent(finalImage1); | ||||||
|  |         finalIcon1.setIconSize(new Vector2f(100, 100)); | ||||||
|  |         app.enqueue(() -> imageLabel.setIcon(finalIcon1)); | ||||||
|  |  | ||||||
|  |         IconComponent finalIcon2 = new IconComponent(finalImage2); | ||||||
|  |         finalIcon2.setIconSize(new Vector2f(100, 100)); | ||||||
|  |         app.enqueue(() -> imageLabel2.setIcon(finalIcon2)); | ||||||
|  |  | ||||||
|  |         app.getGameLogic().playSound(Sound.BUTTON); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void receivedEvent(DiceRollEvent event) { |     public void receivedEvent(DiceRollEvent event) { | ||||||
|         updateDiceImages(event.a(), event.b()); |         latestDiceRollEvent = event; // Speichere das Event | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void receivedEvent(UpdatePlayerView event) { |     public void receivedEvent(UpdatePlayerView event) { | ||||||
|  |         playerHandler = app.getGameLogic().getPlayerHandler(); | ||||||
|  |         System.err.println("Update Player View"); | ||||||
|  |  | ||||||
|         // Clear existing accountContainer and overviewContainer content |         // Clear existing accountContainer and overviewContainer content | ||||||
|         accountContainer.clearChildren(); |         accountContainer.clearChildren(); | ||||||
|         overviewContainer.clearChildren(); |         overviewContainer.clearChildren(); | ||||||
|  |  | ||||||
|         // Update accountContainer |  | ||||||
|         accountContainer.addChild(new Label("Kontostand", new ElementId("label-Bold"))); |         accountContainer.addChild(new Label("Kontostand", new ElementId("label-Bold"))); | ||||||
|         accountContainer.addChild(new Label( |         accountContainer.addChild(new Label( | ||||||
|                 playerHandler.getPlayerById(app.getId()).getAccountBalance() + " EUR", |                 playerHandler.getPlayerById(app.getId()).getAccountBalance() + " EUR", | ||||||
| @@ -212,10 +218,9 @@ public class Toolbar extends Dialog implements GameEventListener{ | |||||||
|         )); |         )); | ||||||
|         accountContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); |         accountContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); | ||||||
|  |  | ||||||
|         // Update overviewContainer |  | ||||||
|         overviewContainer.addChild(new Label("Übersicht", new ElementId("label-Bold"))); |         overviewContainer.addChild(new Label("Übersicht", new ElementId("label-Bold"))); | ||||||
|         for (Player player : playerHandler.getPlayers()) { |         for (Player player : playerHandler.getPlayers()) { | ||||||
|             if (player.getId() != app.getId()) { // Skip the current player |             if (player.getId() != app.getId()) { | ||||||
|                 overviewContainer.addChild(new Label( |                 overviewContainer.addChild(new Label( | ||||||
|                         player.getName() + ": " + player.getAccountBalance() + " EUR", |                         player.getName() + ": " + player.getAccountBalance() + " EUR", | ||||||
|                         new ElementId("label-Text") |                         new ElementId("label-Text") | ||||||
| @@ -225,41 +230,33 @@ public class Toolbar extends Dialog implements GameEventListener{ | |||||||
|         overviewContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); |         overviewContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     private void updateDiceImages(int a, int b) { |  | ||||||
|         //TODO dice toll animation |  | ||||||
|         IconComponent icon1 = new IconComponent(diceToString(a)); |  | ||||||
|         IconComponent icon2 = new IconComponent(diceToString(b)); |  | ||||||
|         icon1.setIconSize(new Vector2f(100, 100)); |  | ||||||
|         icon2.setIconSize(new Vector2f(100, 100)); |  | ||||||
|         imageLabel.setIcon(icon1); |  | ||||||
|         imageLabel2.setIcon(icon2); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private String diceToString(int i) { |     private String diceToString(int i) { | ||||||
|         switch (i) { |         switch (i) { | ||||||
|             case 1: |             case 1: | ||||||
|                 return "Pictures/dice/one.png"; |                 return "Pictures/dice/one.png"; | ||||||
|          |  | ||||||
|             case 2: |             case 2: | ||||||
|                 return "Pictures/dice/two.png"; |                 return "Pictures/dice/two.png"; | ||||||
|          |  | ||||||
|             case 3: |             case 3: | ||||||
|                 return "Pictures/dice/three.png"; |                 return "Pictures/dice/three.png"; | ||||||
|          |  | ||||||
|             case 4: |             case 4: | ||||||
|                 return "Pictures/dice/four.png"; |                 return "Pictures/dice/four.png"; | ||||||
|          |  | ||||||
|             case 5: |             case 5: | ||||||
|                 return "Pictures/dice/five.png"; |                 return "Pictures/dice/five.png"; | ||||||
|          |  | ||||||
|             case 6: |             case 6: | ||||||
|                 return "Pictures/dice/six.png"; |                 return "Pictures/dice/six.png"; | ||||||
|          |  | ||||||
|             default: |             default: | ||||||
|                 throw new IllegalArgumentException("Invalid dice number: " + i); |                 throw new IllegalArgumentException("Invalid dice number: " + i); | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void close() { | ||||||
|  |         app.getGuiNode().detachChild(toolbarContainer); | ||||||
|  |         super.close(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void escape() { | ||||||
|  |         new SettingsMenu(app).open(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -14,8 +14,6 @@ import com.simsilica.lemur.style.ElementId; | |||||||
| import pp.dialog.Dialog; | import pp.dialog.Dialog; | ||||||
| import pp.monopoly.client.MonopolyApp; | import pp.monopoly.client.MonopolyApp; | ||||||
| import pp.monopoly.client.gui.SettingsMenu; | import pp.monopoly.client.gui.SettingsMenu; | ||||||
| import pp.monopoly.model.card.Card; // TODO für den Import der Queue notwendig |  | ||||||
| import pp.monopoly.model.card.DeckHelper; |  | ||||||
| /** | /** | ||||||
|  * SettingsMenu ist ein Overlay-Menü, das durch ESC aufgerufen werden kann. |  * SettingsMenu ist ein Overlay-Menü, das durch ESC aufgerufen werden kann. | ||||||
|  */ |  */ | ||||||
| @@ -24,14 +22,13 @@ public class EventCard extends Dialog { | |||||||
|     private final Geometry overlayBackground; |     private final Geometry overlayBackground; | ||||||
|     private final Container eventCardContainer; |     private final Container eventCardContainer; | ||||||
|     private final Container backgroundContainer; |     private final Container backgroundContainer; | ||||||
|  |     private final String description; | ||||||
|  |  | ||||||
|  |  | ||||||
|     public EventCard(MonopolyApp app) { |     public EventCard(MonopolyApp app, String description) { | ||||||
|         super(app.getDialogManager()); |         super(app.getDialogManager()); | ||||||
|         this.app = app; |         this.app = app; | ||||||
|  |         this.description = description; | ||||||
|         //Generate the corresponfing field |  | ||||||
|         Card card = new DeckHelper().drawCard(); // TODO nimmt die Karten gerade unabhängig aus dem DeckHelper |  | ||||||
|  |  | ||||||
|         // Halbtransparentes Overlay hinzufügen |         // Halbtransparentes Overlay hinzufügen | ||||||
|         overlayBackground = createOverlayBackground(); |         overlayBackground = createOverlayBackground(); | ||||||
| @@ -56,7 +53,7 @@ public class EventCard extends Dialog { | |||||||
|         // Text, der auf der Karte steht |         // Text, der auf der Karte steht | ||||||
|         // Die Preise werden dynamisch dem BoardManager entnommen |         // Die Preise werden dynamisch dem BoardManager entnommen | ||||||
|         Container propertyValuesContainer = eventCardContainer.addChild(new Container()); |         Container propertyValuesContainer = eventCardContainer.addChild(new Container()); | ||||||
|         propertyValuesContainer.addChild(new Label(card.getDescription(), new ElementId("label-Text"))); |         propertyValuesContainer.addChild(new Label(description, new ElementId("label-Text"))); | ||||||
|         propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); |         propertyValuesContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); | ||||||
|         propertyValuesContainer.setPreferredSize(new Vector3f(300,200,10)); |         propertyValuesContainer.setPreferredSize(new Vector3f(300,200,10)); | ||||||
|  |  | ||||||
| @@ -114,6 +111,6 @@ public class EventCard extends Dialog { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void escape() { |     public void escape() { | ||||||
|         new SettingsMenu(app).open(); |         close(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -26,12 +26,14 @@ import pp.monopoly.model.IntPoint; | |||||||
| import pp.monopoly.model.fields.BoardManager; | import pp.monopoly.model.fields.BoardManager; | ||||||
| import pp.monopoly.notification.ClientStateEvent; | import pp.monopoly.notification.ClientStateEvent; | ||||||
| import pp.monopoly.notification.DiceRollEvent; | import pp.monopoly.notification.DiceRollEvent; | ||||||
|  | import pp.monopoly.notification.EventCardEvent; | ||||||
| import pp.monopoly.notification.GameEvent; | import pp.monopoly.notification.GameEvent; | ||||||
| import pp.monopoly.notification.GameEventBroker; | import pp.monopoly.notification.GameEventBroker; | ||||||
| import pp.monopoly.notification.GameEventListener; | import pp.monopoly.notification.GameEventListener; | ||||||
| import pp.monopoly.notification.InfoTextEvent; | import pp.monopoly.notification.InfoTextEvent; | ||||||
| import pp.monopoly.notification.Sound; | import pp.monopoly.notification.Sound; | ||||||
| import pp.monopoly.notification.SoundEvent; | import pp.monopoly.notification.SoundEvent; | ||||||
|  | import pp.monopoly.notification.UpdatePlayerView; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Controls the client-side game logic for Monopoly. |  * Controls the client-side game logic for Monopoly. | ||||||
| @@ -225,9 +227,8 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker { | |||||||
|      */ |      */ | ||||||
|     @Override |     @Override | ||||||
|     public void received(EventDrawCard msg) { |     public void received(EventDrawCard msg) { | ||||||
|          |  | ||||||
|         // Kartenlogik |  | ||||||
|         playSound(Sound.EVENT_CARD); |         playSound(Sound.EVENT_CARD); | ||||||
|  |         notifyListeners(new EventCardEvent(msg.getCardDescription())); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @@ -282,8 +283,8 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker { | |||||||
|      */ |      */ | ||||||
|     @Override |     @Override | ||||||
|     public void received(PlayerStatusUpdate msg) { |     public void received(PlayerStatusUpdate msg) { | ||||||
|          |         playerHandler = msg.getPlayerHandler(); | ||||||
|      |         notifyListeners(new UpdatePlayerView()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|   | |||||||
| @@ -7,12 +7,15 @@ | |||||||
|  |  | ||||||
| package pp.monopoly.game.server; | package pp.monopoly.game.server; | ||||||
|  |  | ||||||
|  | import java.util.ArrayList; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Random; | import java.util.Random; | ||||||
|  |  | ||||||
| import com.jme3.network.serializing.Serializable; | import com.jme3.network.serializing.Serializable; | ||||||
|  |  | ||||||
| import pp.monopoly.message.server.DiceResult; | import pp.monopoly.message.server.DiceResult; | ||||||
|  | import pp.monopoly.message.server.EventDrawCard; | ||||||
|  | import pp.monopoly.message.server.PlayerStatusUpdate; | ||||||
| import pp.monopoly.model.FieldVisitor; | import pp.monopoly.model.FieldVisitor; | ||||||
| import pp.monopoly.model.Figure; | import pp.monopoly.model.Figure; | ||||||
| import pp.monopoly.model.card.Card; | import pp.monopoly.model.card.Card; | ||||||
| @@ -36,7 +39,7 @@ public class Player implements FieldVisitor<Void>{ | |||||||
|     private String name; |     private String name; | ||||||
|     private int accountBalance = 15000; |     private int accountBalance = 15000; | ||||||
|     private Figure figure; |     private Figure figure; | ||||||
|     private List<PropertyField> properties; |     private List<PropertyField> properties = new ArrayList<>(); | ||||||
|     private int getOutOfJailCard; |     private int getOutOfJailCard; | ||||||
|     private int fieldID; |     private int fieldID; | ||||||
|     private DiceResult rollResult; |     private DiceResult rollResult; | ||||||
| @@ -319,7 +322,9 @@ public class Player implements FieldVisitor<Void>{ | |||||||
|     @Override |     @Override | ||||||
|     public Void visit(EventField field) { |     public Void visit(EventField field) { | ||||||
|         Card c = getHandler().getLogic().getDeckHelper().drawCard(); |         Card c = getHandler().getLogic().getDeckHelper().drawCard(); | ||||||
|         getHandler().getLogic().getDeckHelper().visit(c, this); |         getHandler().getLogic().getDeckHelper().visit(c, this); //Logic | ||||||
|  |         getHandler().getLogic().send(this, new EventDrawCard(c.getDescription())); // Card notification | ||||||
|  |         getHandler().getLogic().send(this, new PlayerStatusUpdate(getHandler())); //update view | ||||||
|         return null; |         return null; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -408,6 +413,10 @@ public class Player implements FieldVisitor<Void>{ | |||||||
|         return state.rollDice(); |         return state.rollDice(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     private void visitEvent() { | ||||||
|  |         getHandler().getLogic().getBoardManager().getFieldAtIndex(36).accept(this); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * A interface representing the PlayerStates |      * A interface representing the PlayerStates | ||||||
|      */ |      */ | ||||||
| @@ -519,7 +528,7 @@ public class Player implements FieldVisitor<Void>{ | |||||||
|  |  | ||||||
|         @Override |         @Override | ||||||
|         public DiceResult rollDice() { |         public DiceResult rollDice() { | ||||||
|             throw new UnsupportedOperationException("not allowed"); |             return null; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         @Override |         @Override | ||||||
|   | |||||||
| @@ -2,36 +2,24 @@ package pp.monopoly.message.server; | |||||||
|  |  | ||||||
| import com.jme3.network.serializing.Serializable; | import com.jme3.network.serializing.Serializable; | ||||||
|  |  | ||||||
| import pp.monopoly.game.server.PlayerColor; | import pp.monopoly.game.server.PlayerHandler; | ||||||
|  |  | ||||||
| @Serializable | @Serializable | ||||||
| public class PlayerStatusUpdate extends ServerMessage{ | public class PlayerStatusUpdate extends ServerMessage{ | ||||||
|  |  | ||||||
|     private String playerName; |     private PlayerHandler playerHandler; | ||||||
|     private String status; |  | ||||||
|     private PlayerColor color; |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Default constructor for serialization purposes. |      * Default constructor for serialization purposes. | ||||||
|      */ |      */ | ||||||
|     private PlayerStatusUpdate() { /* empty */ } |     private PlayerStatusUpdate() { /* empty */ } | ||||||
|  |  | ||||||
|     public PlayerStatusUpdate(String playerName, String status, PlayerColor color) { |     public PlayerStatusUpdate(PlayerHandler playerHandler) { | ||||||
|         this.playerName = playerName; |         this.playerHandler = playerHandler; | ||||||
|         this.status = status; |  | ||||||
|         this.color = color; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public String getPlayerName() { |     public PlayerHandler getPlayerHandler() { | ||||||
|         return playerName; |         return playerHandler; | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public String getStatus() { |  | ||||||
|         return status; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public PlayerColor getColor() { |  | ||||||
|         return color; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|   | |||||||
| @@ -48,6 +48,8 @@ public class DeckHelper{ | |||||||
|         cards.add(new Card("Du hast eine Party veranstaltet und dick Gewinn gemacht. Ziehe ein: 1500 EUR", "party-gewinn")); |         cards.add(new Card("Du hast eine Party veranstaltet und dick Gewinn gemacht. Ziehe ein: 1500 EUR", "party-gewinn")); | ||||||
|         cards.add(new Card("Zur falschen Zeit am falschen Ort. Du musst einen Bergmarsch planen und setzt eine Runde aus.", "bergmarsch")); |         cards.add(new Card("Zur falschen Zeit am falschen Ort. Du musst einen Bergmarsch planen und setzt eine Runde aus.", "bergmarsch")); | ||||||
|         cards.add(new Card("Dein Jodel eines Eispenis mit Unterhodenbeleuchtung geht viral. Ziehe ein: 1000 EUR", "jodel-eispenis")); |         cards.add(new Card("Dein Jodel eines Eispenis mit Unterhodenbeleuchtung geht viral. Ziehe ein: 1000 EUR", "jodel-eispenis")); | ||||||
|  |  | ||||||
|  |         shuffle(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void visit(Card card, Player player) { |     public void visit(Card card, Player player) { | ||||||
| @@ -203,7 +205,7 @@ public class DeckHelper{ | |||||||
|         } |         } | ||||||
|      |      | ||||||
|         private void namensschildTruppenkueche(Player player) { |         private void namensschildTruppenkueche(Player player) { | ||||||
|             //TODO |             //TODO 10 existiert nicht mehr | ||||||
|         } |         } | ||||||
|      |      | ||||||
|         private void spendierhosenUnibar(Player player) { |         private void spendierhosenUnibar(Player player) { | ||||||
|   | |||||||
| @@ -0,0 +1,10 @@ | |||||||
|  | package pp.monopoly.notification; | ||||||
|  |  | ||||||
|  | public record EventCardEvent(String description) implements GameEvent{ | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void notifyListener(GameEventListener listener) { | ||||||
|  |         listener.receivedEvent(this); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -58,5 +58,12 @@ public interface GameEventListener { | |||||||
|      * |      * | ||||||
|      * @param event the received event |      * @param event the received event | ||||||
|      */ |      */ | ||||||
| default void receivedEvent(UpdatePlayerView event) { /*Do nothing */} |     default void receivedEvent(UpdatePlayerView event) { /*Do nothing */} | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Indicates that an event card has been drawn | ||||||
|  |      * | ||||||
|  |      * @param event the received event | ||||||
|  |      */ | ||||||
|  |     default void receivedEvent(EventCardEvent event) { /*Do nothing */} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -38,8 +38,10 @@ import pp.monopoly.message.client.TradeOffer; | |||||||
| import pp.monopoly.message.client.TradeResponse; | import pp.monopoly.message.client.TradeResponse; | ||||||
| import pp.monopoly.message.client.ViewAssetsRequest; | import pp.monopoly.message.client.ViewAssetsRequest; | ||||||
| import pp.monopoly.message.server.DiceResult; | import pp.monopoly.message.server.DiceResult; | ||||||
|  | import pp.monopoly.message.server.EventDrawCard; | ||||||
| import pp.monopoly.message.server.GameStart; | import pp.monopoly.message.server.GameStart; | ||||||
| import pp.monopoly.message.server.NextPlayerTurn; | import pp.monopoly.message.server.NextPlayerTurn; | ||||||
|  | import pp.monopoly.message.server.PlayerStatusUpdate; | ||||||
| import pp.monopoly.message.server.ServerMessage; | import pp.monopoly.message.server.ServerMessage; | ||||||
| import pp.monopoly.model.Figure; | import pp.monopoly.model.Figure; | ||||||
| import pp.monopoly.model.IntPoint; | import pp.monopoly.model.IntPoint; | ||||||
| @@ -132,6 +134,8 @@ public class MonopolyServer implements MessageListener<HostedConnection>, Connec | |||||||
|         Serializer.registerClass(Figure.class); |         Serializer.registerClass(Figure.class); | ||||||
|         Serializer.registerClass(PlayerHandler.class); |         Serializer.registerClass(PlayerHandler.class); | ||||||
|         Serializer.registerClass(DiceResult.class); |         Serializer.registerClass(DiceResult.class); | ||||||
|  |         Serializer.registerClass(EventDrawCard.class); | ||||||
|  |         Serializer.registerClass(PlayerStatusUpdate.class); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void registerListeners() { |     private void registerListeners() { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user