diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/GameAppState.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/GameAppState.java deleted file mode 100644 index 916e437..0000000 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/GameAppState.java +++ /dev/null @@ -1,99 +0,0 @@ -//////////////////////////////////////// -// Programming project code -// UniBw M, 2022, 2023, 2024 -// www.unibw.de/inf2 -// (c) Mark Minas (mark.minas@unibw.de) -//////////////////////////////////////// - -package pp.monopoly.client; - -import java.lang.System.Logger; - -import java.lang.System.Logger.Level; - -import com.jme3.input.controls.ActionListener; -import com.jme3.scene.Node; - -import pp.monopoly.client.gui.TestWorld; - -/** - * Represents the state responsible for managing the battle interface within the Battleship game. - * This state handles the display and interaction of the battle map, including the opponent's map. - * It manages GUI components, input events, and the layout of the interface when this state is enabled. - */ -public class GameAppState extends MonopolyAppState { - private static final Logger LOGGER = System.getLogger(MonopolyAppState.class.getName()); - - /** - * A listener for handling click events in the battle interface. - * When a click is detected, it triggers the corresponding actions on the opponent's map. - */ - private final ActionListener clickListener = (name, isPressed, tpf) -> click(isPressed); - - /** - * The root node for all GUI components in the battle state. - */ - private final Node battleNode = new Node("Game"); //NON-NLS - - /** - * A view representing the opponent's map in the GUI. - */ - private TestWorld testWorld; - - /** - * Enables the battle state by initializing, laying out, and adding GUI components. - * Attaches the components to the GUI node and registers input listeners. - */ - @Override - protected void enableState() { - LOGGER.log(Level.DEBUG, "Enabling game state"); - battleNode.detachAllChildren(); - initializeGuiComponents(); - addGuiComponents(); - getApp().getGuiNode().attachChild(battleNode); - } - - /** - * Disables the battle state by removing GUI components and unregistering input listeners. - * Also handles cleanup of resources, such as the opponent's map view. - */ - @Override - protected void disableState() { - getApp().getGuiNode().detachChild(battleNode); - getApp().getInputManager().removeListener(clickListener); - } - - /** - * Initializes the GUI components used in the battle state. - * Creates the opponent's map view and adds a grid overlay to it. - */ - private void initializeGuiComponents() { - - // Initialisiere TestWorld mit Spielern - testWorld = new TestWorld(getApp()); - testWorld.initializeScene(); - } - - - /** - * Adds the initialized GUI components to the battle node. - * Currently, it attaches the opponent's map view to the node. - */ - private void addGuiComponents() { - } - - /** - * Handles click events in the battle interface. If the event indicates a click (not a release), - * it translates the cursor position to the model's coordinate system and triggers the game logic - * for interacting with the opponent's map. - * - * @param isPressed whether the mouse button is currently pressed (true) or released (false) - */ - private void click(boolean isPressed) { - } - - @Override - public void update(float tpf) { - super.update(tpf); - } -} diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/BobTheBuilder.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/BobTheBuilder.java index 4fc8acc..a6abeb7 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/BobTheBuilder.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/BobTheBuilder.java @@ -1,9 +1,5 @@ package pp.monopoly.client.gui; -import static com.jme3.material.Materials.LIGHTING; - -import java.util.stream.Collectors; - import com.jme3.material.Material; import com.jme3.material.RenderState.BlendMode; import com.jme3.math.ColorRGBA; @@ -14,7 +10,6 @@ import com.jme3.scene.Spatial; import com.jme3.scene.shape.Box; import pp.monopoly.client.MonopolyApp; -import pp.monopoly.game.server.Player; import pp.monopoly.model.Figure; import pp.monopoly.model.Hotel; import pp.monopoly.model.House; @@ -48,7 +43,7 @@ public class BobTheBuilder extends GameBoardSynchronizer { // Setze die Rotation basierend auf der Feld-ID node.setLocalRotation(figure.getRot().toQuaternion()); - // node.addControl(new FigureControl(figure)); + node.addControl(new FigureControl(figure)); return node; } @@ -146,14 +141,6 @@ public class BobTheBuilder extends GameBoardSynchronizer { @Override public void receivedEvent(UpdatePlayerView event) { - board.removePlayers(); - - //TODO transition animation - for (Player player : app.getGameLogic().getPlayerHandler().getPlayers()) { - board.add(player.getFigure()); - } - for (Item item : board.getItems().stream().filter(p -> p instanceof Figure).collect(Collectors.toList())) { - add(item); - } + //TODO player move animation } } diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/FigureControl.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/FigureControl.java new file mode 100644 index 0000000..0d7da19 --- /dev/null +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/FigureControl.java @@ -0,0 +1,28 @@ +package pp.monopoly.client.gui; + +import com.jme3.renderer.RenderManager; +import com.jme3.renderer.ViewPort; +import com.jme3.scene.control.AbstractControl; + +import pp.monopoly.model.Figure; + +public class FigureControl extends AbstractControl { + + private final Figure figure; + + public FigureControl(Figure figure) { + super(); + this.figure = figure; + } + + @Override + protected void controlUpdate(float tpf) { + //TODO: animation + } + + @Override + protected void controlRender(RenderManager rm, ViewPort vp) { + // No rendering required + } + +} diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/TestWorld.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/TestWorld.java deleted file mode 100644 index f9a4e0b..0000000 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/TestWorld.java +++ /dev/null @@ -1,565 +0,0 @@ -package pp.monopoly.client.gui; - -import java.util.ArrayList; -import java.util.List; -import java.util.Timer; -import java.util.TimerTask; - -import com.jme3.light.AmbientLight; -import com.jme3.light.DirectionalLight; -import com.jme3.material.Material; -import com.jme3.math.ColorRGBA; -import com.jme3.math.FastMath; -import com.jme3.math.Vector3f; -import com.jme3.renderer.RenderManager; -import com.jme3.renderer.ViewPort; -import com.jme3.scene.control.AbstractControl; -import com.jme3.texture.Texture; - -import pp.monopoly.client.MonopolyApp; -import pp.monopoly.client.gui.popups.AcceptTrade; -import pp.monopoly.client.gui.popups.BuildingPropertyCard; -import pp.monopoly.client.gui.popups.ConfirmTrade; -import pp.monopoly.client.gui.popups.EventCardPopup; -import pp.monopoly.client.gui.popups.FoodFieldCard; -import pp.monopoly.client.gui.popups.GateFieldCard; -import pp.monopoly.client.gui.popups.Gulag; -import pp.monopoly.client.gui.popups.GulagInfo; -import pp.monopoly.client.gui.popups.LooserPopUp; -import pp.monopoly.client.gui.popups.NoMoneyWarning; -import pp.monopoly.client.gui.popups.ReceivedRent; -import pp.monopoly.client.gui.popups.RejectTrade; -import pp.monopoly.client.gui.popups.Rent; -import pp.monopoly.client.gui.popups.TimeOut; -import pp.monopoly.client.gui.popups.WinnerPopUp; -import pp.monopoly.game.server.Player; -import pp.monopoly.game.server.PlayerHandler; -import pp.monopoly.message.server.NotificationMessage; -import pp.monopoly.message.server.TradeReply; -import pp.monopoly.model.fields.BuildingProperty; -import pp.monopoly.model.fields.FoodField; -import pp.monopoly.model.fields.GateField; -import pp.monopoly.notification.EventCardEvent; -import pp.monopoly.notification.GameEventListener; -import pp.monopoly.notification.PopUpEvent; -import pp.monopoly.notification.UpdatePlayerView; - -/** - * TestWorld zeigt eine einfache Szene mit Spielfeld und Spielfiguren. - */ -public class TestWorld implements GameEventListener { - - private final MonopolyApp app; - private PlayerHandler playerHandler; - private CameraController cameraController; - private Toolbar toolbar; - private List existingHouses = new ArrayList<>(); - - /** - * Konstruktor für die TestWorld. - * - * @param app Die Hauptanwendung - */ - public TestWorld(MonopolyApp app) { - this.app = app; - this.playerHandler = app.getGameLogic().getPlayerHandler(); - app.getGameLogic().addListener(this); - cameraController = new CameraController(app.getCamera()); - } - - /** - * Initialisiert die Szene mit Spielfeld und Figuren. - */ - public void initializeScene() { - // Entferne bestehende Inhalte - app.getGuiNode().detachAllChildren(); - app.getRootNode().detachAllChildren(); - - System.out.println("Szene initialisiert."); - - //Füge Inhalte ein - setSkyColor(); - createBoard(); - addLighting(); - createPlayerFigures(); - toolbar = new Toolbar(app); - toolbar.open(); - } - - /** - * Setzt die Hintergrundfarbe der Szene auf hellblau. - */ - private void setSkyColor() { - app.getViewPort().setBackgroundColor(new com.jme3.math.ColorRGBA(0.5f, 0.7f, 1.0f, 1.0f)); - } - - /** - * Erstellt das Spielfeld und fügt es zur Szene hinzu. - */ - private void createBoard() { - try { - com.jme3.scene.shape.Box box = new com.jme3.scene.shape.Box(10, 0.1f, 10); - com.jme3.scene.Geometry geom = new com.jme3.scene.Geometry("Board", box); - - Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Light/Lighting.j3md"); - Texture texture = app.getAssetManager().loadTexture("Pictures/board2.png"); - mat.setTexture("DiffuseMap", texture); - geom.setMaterial(mat); - - geom.setLocalTranslation(0, -0.1f, 0); - - com.jme3.math.Quaternion rotation = new com.jme3.math.Quaternion(); - rotation.fromAngleAxis(FastMath.HALF_PI, com.jme3.math.Vector3f.UNIT_Y); - geom.setLocalRotation(rotation); - - app.getRootNode().attachChild(geom); - } catch (Exception e) { - System.err.println("Fehler beim Erstellen des Spielfelds: " + e.getMessage()); - } - } - - private void addLighting() { - // Direktionales Licht - DirectionalLight sun = new DirectionalLight(); - sun.setColor(ColorRGBA.White); - sun.setDirection(new Vector3f(-0.5f, -0.7f, -1.0f).normalizeLocal()); - app.getRootNode().addLight(sun); - - // Umgebungslicht - AmbientLight ambient = new AmbientLight(); - ambient.setColor(new ColorRGBA(0.6f, 0.6f, 0.6f, 1.0f)); - app.getRootNode().addLight(ambient); - } - - private com.jme3.math.Quaternion calculateRotationForField(int fieldID) { - com.jme3.math.Quaternion rotation = new com.jme3.math.Quaternion(); - - // Berechne die Rotation basierend auf der Feld-ID - if (fieldID >= 0 && fieldID <= 9) { - // Untere Seite (0-9) - rotation.fromAngleAxis(0, Vector3f.UNIT_Y); // Richtung: nach oben - } else if (fieldID >= 10 && fieldID <= 19) { - // Rechte Seite (10-19) - rotation.fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_Y); // Richtung: nach links - } else if (fieldID >= 20 && fieldID <= 29) { - // Obere Seite (20-29) - rotation.fromAngleAxis(FastMath.PI, Vector3f.UNIT_Y); // Richtung: nach unten - } else if (fieldID >= 30 && fieldID <= 39) { - // Linke Seite (30-39) - rotation.fromAngleAxis(3 * FastMath.HALF_PI, Vector3f.UNIT_Y); // Richtung: nach rechts - } - - // Korrigiere die Richtung für die Quadranten 10–19 und 30–39 (gegenüberliegende Richtung) - if ((fieldID >= 10 && fieldID <= 19) || (fieldID >= 30 && fieldID <= 39)) { - com.jme3.math.Quaternion oppositeDirection = new com.jme3.math.Quaternion(); - oppositeDirection.fromAngleAxis(FastMath.PI, Vector3f.UNIT_Y); // 180° drehen - rotation = rotation.multLocal(oppositeDirection); - } - - // Füge zusätzliche 90° nach links hinzu - com.jme3.math.Quaternion leftTurn = new com.jme3.math.Quaternion(); - leftTurn.fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_Y); // 90° nach links - rotation = rotation.multLocal(leftTurn); - - return rotation; - } - - /** - * Erstellt die Spielfiguren basierend auf der bereits bekannten Spielerliste. - */ - private void createPlayerFigures() { - for (Player player : playerHandler.getPlayers()) { - try { - // Lade das Modell - com.jme3.scene.Spatial model = app.getAssetManager().loadModel( - "models/" + "Spielfiguren/" + player.getFigure().getType() + "/" + player.getFigure().getType() + ".j3o"); - - // Skaliere und positioniere das Modell - model.setLocalScale(0.5f); - Vector3f startPosition = calculateFieldPosition(player.getFieldID(), player.getId()); - model.setLocalTranslation(startPosition); - - // Setze die Rotation basierend auf der Feld-ID - model.setLocalRotation(calculateRotationForField(player.getFieldID())); - - model.setName("PlayerFigure_" + player.getId()); - - // Füge das Modell zur Szene hinzu - app.getRootNode().attachChild(model); - } catch (Exception e) { - System.err.println("Fehler beim Laden des Modells für Spieler " + player.getId() + ": " + e.getMessage()); - } - } - } - - private Vector3f calculateFieldPosition(int fieldID, int playerIndex) { - float offset = 0.1f; - float baseX = 0.0f; - float baseZ = 0.0f; - - switch (fieldID) { - case 0: baseX = -9.1f; baseZ = -9.1f; break; - case 1: baseX = -6.5f; baseZ = -9.1f; break; - case 2: baseX = -4.9f; baseZ = -9.1f; break; - case 3: baseX = -3.3f; baseZ = -9.1f; break; - case 4: baseX = -1.6f; baseZ = -9.1f; break; - case 5: baseX = 0.0f; baseZ = -9.1f; break; - case 6: baseX = 1.6f; baseZ = -9.1f; break; - case 7: baseX = 3.3f; baseZ = -9.1f; break; - case 8: baseX = 4.9f; baseZ = -9.1f; break; - case 9: baseX = 6.5f; baseZ = -9.1f; break; - case 10: baseX = 9.1f; baseZ = -9.1f; break; - case 11: baseX = 9.1f; baseZ = -6.5f; break; - case 12: baseX = 9.1f; baseZ = -4.9f; break; - case 13: baseX = 9.1f; baseZ = -3.3f; break; - case 14: baseX = 9.1f; baseZ = -1.6f; break; - case 15: baseX = 9.1f; baseZ = 0.0f; break; - case 16: baseX = 9.1f; baseZ = 1.6f; break; - case 17: baseX = 9.1f; baseZ = 3.3f; break; - case 18: baseX = 9.1f; baseZ = 4.9f; break; - case 19: baseX = 9.1f; baseZ = 6.5f; break; - case 20: baseX = 9.1f; baseZ = 9.1f; break; - case 21: baseX = 6.5f; baseZ = 9.1f; break; - case 22: baseX = 4.9f; baseZ = 9.1f; break; - case 23: baseX = 3.3f; baseZ = 9.1f; break; - case 24: baseX = 1.6f; baseZ = 9.1f; break; - case 25: baseX = 0.0f; baseZ = 9.1f; break; - case 26: baseX = -1.6f; baseZ = 9.1f; break; - case 27: baseX = -3.3f; baseZ = 9.1f; break; - case 28: baseX = -4.9f; baseZ = 9.1f; break; - case 29: baseX = -6.5f; baseZ = 9.1f; break; - case 30: baseX = -9.1f; baseZ = 9.1f; break; - case 31: baseX = -9.1f; baseZ = 6.5f; break; - case 32: baseX = -9.1f; baseZ = 4.9f; break; - case 33: baseX = -9.1f; baseZ = 3.3f; break; - case 34: baseX = -9.1f; baseZ = 1.6f; break; - case 35: baseX = -9.1f; baseZ = 0.0f; break; - case 36: baseX = -9.1f; baseZ = -1.6f; break; - case 37: baseX = -9.1f; baseZ = -3.3f; break; - case 38: baseX = -9.1f; baseZ = -4.9f; break; - case 39: baseX = -9.1f; baseZ = -6.5f; break; - default: throw new IllegalArgumentException("Ungültige Feld-ID: " + fieldID); - } - - float xOffset = (playerIndex % 2) * offset; - float zOffset = (playerIndex / 2) * offset; - - return new Vector3f(baseX + xOffset, 0, baseZ + zOffset); - } - - private void movePlayerFigure(Player player) { - int playerIndexOnField = calculatePlayerIndexOnField(player.getFieldID(), player.getId()); - String figureName = "PlayerFigure_" + player.getId(); - com.jme3.scene.Spatial figure = app.getRootNode().getChild(figureName); - - if (figure != null) { - // Füge einen Delay hinzu (z.B. 3 Sekunden) - Timer timer = new Timer(); - timer.schedule(new TimerTask() { - @Override - public void run() { - app.enqueue(() -> { - // Setze die Position - Vector3f targetPosition = calculateFieldPosition(player.getFieldID(), player.getId()); - figure.setLocalTranslation(targetPosition); - - // Aktualisiere die Rotation basierend auf der Feld-ID - figure.setLocalRotation(calculateRotationForField(player.getFieldID())); - }); - } - }, 3000); // 3000 Millisekunden Delay - } else { - System.err.println("Figur für Spieler " + player.getId() + " nicht gefunden."); - } - } - - private int getFieldIDFromPosition(Vector3f position) { - for (int fieldID = 0; fieldID < 40; fieldID++) { - Vector3f fieldPosition = calculateFieldPosition(fieldID, 0); - if (fieldPosition.distance(position) < 0.5f) { // Toleranz für Positionserkennung - return fieldID; - } - } - throw new IllegalArgumentException("Position entspricht keinem gültigen Feld: " + position); - } - - - - /** - * Berechnet den Eckpunkt basierend auf Start- und Zielposition. - * - * @param startPosition Die Startposition der Figur. - * @param targetPosition Die Zielposition der Figur. - * @return Die Position der Ecke, die passiert werden muss. - */ - private Vector3f calculateCornerPosition(Vector3f startPosition, Vector3f targetPosition) { - // Ziel: Immer entlang der Spielfeldkante navigieren - float deltaX = targetPosition.x - startPosition.x; - float deltaZ = targetPosition.z - startPosition.z; - - // Überprüfen, ob Bewegung entlang X oder Z-Koordinate zuerst erfolgen soll - if (deltaX != 0 && deltaZ != 0) { - if (Math.abs(deltaX) > Math.abs(deltaZ)) { - // Bewegung entlang X zuerst - return new Vector3f(targetPosition.x, 0, startPosition.z); - } else { - // Bewegung entlang Z zuerst - return new Vector3f(startPosition.x, 0, targetPosition.z); - } - } else { - // Bewegung ist bereits entlang einer Achse (keine Ecke erforderlich) - return targetPosition; - } - } - - private List calculatePath(int startFieldID, int targetFieldID, int playerIndex) { - List pathPoints = new ArrayList<>(); - - // Bewegung im Uhrzeigersinn - if (startFieldID < targetFieldID) { - for (int i = startFieldID; i <= targetFieldID; i++) { - // Füge Ecken hinzu, falls sie überschritten werden - if (i == 10 || i == 20 || i == 30 || i == 0) { - pathPoints.add(calculateFieldPosition(i, playerIndex)); - } - } - } else { - // Bewegung über das Ende des Spielfelds hinaus (z.B. von 39 zu 5) - for (int i = startFieldID; i < 40; i++) { - if (i == 10 || i == 20 || i == 30 || i == 0) { - pathPoints.add(calculateFieldPosition(i, playerIndex)); - } - } - for (int i = 0; i <= targetFieldID; i++) { - if (i == 10 || i == 20 || i == 30 || i == 0) { - pathPoints.add(calculateFieldPosition(i, playerIndex)); - } - } - } - - // Füge das Ziel hinzu - pathPoints.add(calculateFieldPosition(targetFieldID, playerIndex)); - - return pathPoints; - } - - - - private int calculatePlayerIndexOnField(int fieldID, int playerID) { - List playersOnField = playerHandler.getPlayers().stream() - .filter(p -> p.getFieldID() == fieldID) - .toList(); - - for (int i = 0; i < playersOnField.size(); i++) { - if (playersOnField.get(i).getId() == playerID) { - return i; - } - } - return 0; - } - - private void animateMovementAlongPath(com.jme3.scene.Spatial figure, List pathPoints) { - float animationDurationPerSegment = 2.5f; // Langsamere Animation (2.5 Sekunden pro Segment) - int[] currentSegment = {0}; - - app.enqueue(() -> { - figure.addControl(new AbstractControl() { - private float elapsedTime = 0.0f; - - @Override - protected void controlUpdate(float tpf) { - if (currentSegment[0] >= pathPoints.size() - 1) { - this.setEnabled(false); // Animation abgeschlossen - return; - } - - elapsedTime += tpf; - float progress = Math.min(elapsedTime / animationDurationPerSegment, 1.0f); - - Vector3f start = pathPoints.get(currentSegment[0]); - Vector3f end = pathPoints.get(currentSegment[0] + 1); - - Vector3f interpolatedPosition = start.interpolateLocal(end, progress); - figure.setLocalTranslation(interpolatedPosition); - - if (progress >= 1.0f) { - elapsedTime = 0.0f; - currentSegment[0]++; - } - } - - @Override - protected void controlRender(RenderManager rm, ViewPort vp) { - // Nicht benötigt - } - }); - }); - } - - @Override - public void receivedEvent(PopUpEvent event) { - if (event.msg().equals("Buy")) { - Timer timer = new Timer(); - timer.schedule(new TimerTask() { - @Override - public void run() { - app.enqueue(() -> { - int field = app.getGameLogic().getPlayerHandler().getPlayerById(app.getId()).getFieldID(); - Object fieldObject = app.getGameLogic().getBoardManager().getFieldAtIndex(field); - - if (fieldObject instanceof BuildingProperty) { - new BuildingPropertyCard(app).open(); - } else if (fieldObject instanceof GateField) { - new GateFieldCard(app).open(); - } else if (fieldObject instanceof FoodField) { - new FoodFieldCard(app).open(); - } - }); - } - }, 2500); - } else if (event.msg().equals("Winner")) { - new WinnerPopUp(app).open(); - } else if (event.msg().equals("Looser")) { - new LooserPopUp(app).open(); - } else if (event.msg().equals("timeout")) { - new TimeOut(app).open(); - } else if (event.msg().equals("tradeRequest")) { - new ConfirmTrade(app).open(); - } else if (event.msg().equals("goingToJail")) { - new Gulag(app).open(); - } else if (event.msg().equals("NoMoneyWarning")) { - new NoMoneyWarning(app).open(); - } else if(event.msg().equals("rent")) { - new Rent(app, ( (NotificationMessage) event.message()).getRentOwner(), ( (NotificationMessage) event.message()).getRentAmount() ).open(); - } else if (event.msg().equals("jailtryagain")) { - new GulagInfo(app, 1).open(); - } else if (event.msg().equals("jailpay")) { - new GulagInfo(app, 3).open(); - } else if (event.msg().equals("tradepos")) { - new AcceptTrade(app, (TradeReply) event.message()).open(); - } else if (event.msg().equals("tradeneg")) { - new RejectTrade(app, (TradeReply) event.message()).open(); - } else if (event.msg().equals("ReceivedRent")) { - new ReceivedRent(app, ( (NotificationMessage) event.message()).getRentOwner(), ( (NotificationMessage) event.message()).getRentAmount() ).open(); - } - } - - private Vector3f calculateBuildingPosition(int fieldID) { - float baseX = 0.0f; - float baseZ = 0.0f; - - switch (fieldID) { - case 0: baseX = -8.4f; baseZ = -7.7f; break; - case 1: baseX = -6.3f; baseZ = -7.7f; break; - case 2: baseX = -4.7f; baseZ = -7.7f; break; - case 3: baseX = -3.1f; baseZ = -7.7f; break; - case 4: baseX = -1.4f; baseZ = -7.7f; break; - case 5: baseX = 0.2f; baseZ = -7.7f; break; - case 6: baseX = 1.8f; baseZ = -7.7f; break; - case 7: baseX = 3.5f; baseZ = -7.7f; break; - case 8: baseX = 5.1f; baseZ = -7.7f; break; - case 9: baseX = 6.7f; baseZ = -7.7f; break; - case 10: baseX = 8.2f; baseZ = -7.7f; break; - case 11: baseX = 8.2f; baseZ = -6.5f; break; //passt - case 12: baseX = 8.2f; baseZ = -4.9f; break; //passt - case 13: baseX = 8.2f; baseZ = -3.3f; break; //passt - case 14: baseX = 8.2f; baseZ = -1.6f; break; //passt - case 15: baseX = 8.2f; baseZ = 0.0f; break; //passt - case 16: baseX = 8.2f; baseZ = 1.6f; break; //passt - case 17: baseX = 8.2f; baseZ = 3.3f; break; //passt - case 18: baseX = 8.2f; baseZ = 4.9f; break; //passt - case 19: baseX = 8.2f; baseZ = 6.5f; break; //passt - case 20: baseX = 8.2f; baseZ = 7.7f; break; - case 21: baseX = 6.5f; baseZ = 7.7f; break; - case 22: baseX = 4.9f; baseZ = 7.7f; break; - case 23: baseX = 3.3f; baseZ = 7.7f; break; - case 24: baseX = 1.6f; baseZ = 7.7f; break; - case 25: baseX = 0.0f; baseZ = 7.7f; break; - case 26: baseX = -1.6f; baseZ = 7.7f; break; - case 27: baseX = -3.3f; baseZ = 7.7f; break; - case 28: baseX = -4.9f; baseZ = 7.7f; break; - case 29: baseX = -6.5f; baseZ = 7.7f; break; - case 30: baseX = -7.2f; baseZ = 7.7f; break; - case 31: baseX = -7.2f; baseZ = 6.5f; break; - case 32: baseX = -7.2f; baseZ = 4.9f; break; - case 33: baseX = -7.2f; baseZ = 3.3f; break; - case 34: baseX = -7.2f; baseZ = 1.6f; break; - case 35: baseX = -7.2f; baseZ = 0.0f; break; - case 36: baseX = -7.2f; baseZ = -1.6f; break; - case 37: baseX = -7.2f; baseZ = -3.3f; break; - case 38: baseX = -7.2f; baseZ = -4.9f; break; - case 39: baseX = -7.2f; baseZ = -6.5f; break; - default: throw new IllegalArgumentException("Ungültige Feld-ID: " + fieldID); - } - - return new Vector3f(baseX, 0, baseZ); - } - - private void updateHousesOnBoard() { - app.enqueue(() -> { - List propertiesWithBuildings = app.getGameLogic().getBoardManager().getPropertiesWithBuildings(); - - for (BuildingProperty property : propertiesWithBuildings) { - int houseCount = property.getHouses(); - int hotelCount = property.getHotel(); - - String uniqueIdentifier = "Building_" + property.getId() + "_" + (hotelCount > 0 ? "Hotel" : houseCount); - - if (existingHouses.contains(uniqueIdentifier)) continue; - - try { - String modelPath = hotelCount > 0 - ? "models/Hotel/Hotel.j3o" - : "models/Haus/" + houseCount + "Haus.j3o"; - - com.jme3.scene.Spatial buildingModel = app.getAssetManager().loadModel(modelPath); - - Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Light/Lighting.j3md"); - - buildingModel.setMaterial(mat); - - buildingModel.setLocalScale(0.5f); - Vector3f position = calculateBuildingPosition(property.getId()).add(0, 0.5f, 0); - buildingModel.setLocalTranslation(position); - - com.jme3.math.Quaternion rotation = new com.jme3.math.Quaternion(); - if (property.getId() >= 1 && property.getId() <= 10) { - rotation.fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_Y); - } else if (property.getId() >= 21 && property.getId() <= 30) { - rotation.fromAngleAxis(3 * FastMath.HALF_PI, Vector3f.UNIT_Y); - } else if (property.getId() >= 31 && property.getId() <= 39) { - rotation.fromAngleAxis(FastMath.PI, Vector3f.UNIT_Y); - } - - buildingModel.setLocalRotation(rotation); - buildingModel.setName(uniqueIdentifier); - app.getRootNode().attachChild(buildingModel); - existingHouses.add(uniqueIdentifier); - - } catch (Exception e) { - System.err.println("Fehler beim Hinzufügen eines Gebäudes: " + e.getMessage()); - } - } - }); - } - - @Override - public void receivedEvent(EventCardEvent event) { - Timer timer = new Timer(); - timer.schedule(new TimerTask() { - @Override - public void run() { - app.enqueue(() -> new EventCardPopup(app, event.description()).open()); - } - }, 2500); - } - - @Override - public void receivedEvent(UpdatePlayerView event) { - this.playerHandler = app.getGameLogic().getPlayerHandler(); - for (Player player : playerHandler.getPlayers()) { - movePlayerFigure(player); - } - updateHousesOnBoard(); - } -} diff --git a/Projekte/monopoly/model/src/main/java/pp/monopoly/game/client/ActiveState.java b/Projekte/monopoly/model/src/main/java/pp/monopoly/game/client/ActiveState.java index 9be8d2d..1f2b35e 100644 --- a/Projekte/monopoly/model/src/main/java/pp/monopoly/game/client/ActiveState.java +++ b/Projekte/monopoly/model/src/main/java/pp/monopoly/game/client/ActiveState.java @@ -1,9 +1,4 @@ package pp.monopoly.game.client; - -import pp.monopoly.game.server.Player; -import pp.monopoly.message.server.NextPlayerTurn; -import pp.monopoly.message.server.ViewAssetsResponse; - /** * Represents the active client state in the Monopoly game. * Extends {@link ClientState}. @@ -24,17 +19,4 @@ public class ActiveState extends ClientState { boolean isTurn() { return true; } - - @Override - void recivedNextPlayerTurn(NextPlayerTurn msg) { - logic.getBoard().clear(); - for (Player player : logic.getPlayerHandler().getPlayers()) { - logic.getBoard().add(player.getFigure()); - } - } - - @Override - void recivedViewAssetsResponse(ViewAssetsResponse msg) { - - } } \ No newline at end of file diff --git a/Projekte/monopoly/model/src/main/java/pp/monopoly/game/client/ClientGameLogic.java b/Projekte/monopoly/model/src/main/java/pp/monopoly/game/client/ClientGameLogic.java index 2a5a9ce..a6e47a4 100644 --- a/Projekte/monopoly/model/src/main/java/pp/monopoly/game/client/ClientGameLogic.java +++ b/Projekte/monopoly/model/src/main/java/pp/monopoly/game/client/ClientGameLogic.java @@ -5,6 +5,8 @@ import java.lang.System.Logger.Level; import java.util.ArrayList; import java.util.List; +import com.jme3.math.Vector3f; + import pp.monopoly.game.server.Player; import pp.monopoly.game.server.PlayerHandler; import pp.monopoly.message.client.ClientMessage; @@ -24,8 +26,10 @@ import pp.monopoly.message.server.TradeReply; import pp.monopoly.message.server.TradeRequest; import pp.monopoly.message.server.ViewAssetsResponse; import pp.monopoly.model.Board; +import pp.monopoly.model.Figure; import pp.monopoly.model.Hotel; import pp.monopoly.model.House; +import pp.monopoly.model.Rotation; import pp.monopoly.model.TradeHandler; import pp.monopoly.model.fields.BoardManager; import pp.monopoly.model.fields.BuildingProperty; @@ -231,7 +235,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker { playerHandler = msg.getPlayerHandler(); setState(new WaitForTurnState(this)); for (Player player : playerHandler.getPlayers()) { - board.add(player.getFigure()); + board.add(new Figure(Vector3f.ZERO, Rotation.NORTH, player.getFigure())); } notifyListeners(new ButtonStatusEvent(false)); notifyListeners(new UpdatePlayerView()); diff --git a/Projekte/monopoly/model/src/main/java/pp/monopoly/game/server/Player.java b/Projekte/monopoly/model/src/main/java/pp/monopoly/game/server/Player.java index 83659c9..4badf81 100644 --- a/Projekte/monopoly/model/src/main/java/pp/monopoly/game/server/Player.java +++ b/Projekte/monopoly/model/src/main/java/pp/monopoly/game/server/Player.java @@ -23,7 +23,6 @@ import pp.monopoly.message.server.NextPlayerTurn; import pp.monopoly.message.server.NotificationMessage; import pp.monopoly.message.server.PlayerStatusUpdate; import pp.monopoly.model.FieldVisitor; -import pp.monopoly.model.Figure; import pp.monopoly.model.card.Card; import pp.monopoly.model.fields.BuildingProperty; import pp.monopoly.model.fields.EventField; @@ -44,7 +43,7 @@ public class Player implements FieldVisitor{ private final int id; private String name; private int accountBalance = 15000; - private Figure figure; + private String figure; private Set properties = new HashSet<>(); private int getOutOfJailCard; private int fieldID; @@ -82,11 +81,19 @@ public class Player implements FieldVisitor{ this.handler = handler; } - public void setFigure(Figure figure) { + /** + * Set the figure of the player + * @param figure the figure to be set + */ + public void setFigure(String figure) { this.figure = figure; } - - public Figure getFigure(){ + + /** + * Returns the figure of the player + * @return the figure of the player + */ + public String getFigure() { return figure; } @@ -180,7 +187,6 @@ public class Player implements FieldVisitor{ earnMoney(2000); // Passing GO gives money } fieldID = (fieldID + steps) % 40; - figure.moveTo(fieldID); handler.getLogic().send(this, new PlayerStatusUpdate(handler)); handler.getLogic().getBoardManager().getFieldAtIndex(fieldID).accept(this); return fieldID; @@ -194,7 +200,6 @@ public class Player implements FieldVisitor{ public int setPosition(int position){ if(position < 40 && position >= 0) { fieldID = position; - figure.moveTo(fieldID); handler.getLogic().send(this, new PlayerStatusUpdate(handler)); handler.getLogic().getBoardManager().getFieldAtIndex(fieldID).accept(this); } @@ -212,7 +217,6 @@ public class Player implements FieldVisitor{ earnMoney(2000); } fieldID = position; - figure.moveTo(fieldID); handler.getLogic().send(this, new PlayerStatusUpdate(handler)); handler.getLogic().getBoardManager().getFieldAtIndex(fieldID).accept(this); } diff --git a/Projekte/monopoly/model/src/main/java/pp/monopoly/game/server/ServerGameLogic.java b/Projekte/monopoly/model/src/main/java/pp/monopoly/game/server/ServerGameLogic.java index 66befed..71708c7 100644 --- a/Projekte/monopoly/model/src/main/java/pp/monopoly/game/server/ServerGameLogic.java +++ b/Projekte/monopoly/model/src/main/java/pp/monopoly/game/server/ServerGameLogic.java @@ -3,11 +3,9 @@ package pp.monopoly.game.server; import java.lang.System.Logger; import java.lang.System.Logger.Level; import java.util.HashSet; -import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import com.jme3.math.Vector3f; import pp.monopoly.MonopolyConfig; import pp.monopoly.message.client.AlterProperty; @@ -29,8 +27,6 @@ import pp.monopoly.message.server.ServerMessage; import pp.monopoly.message.server.TradeReply; import pp.monopoly.message.server.TradeRequest; import pp.monopoly.message.server.ViewAssetsResponse; -import pp.monopoly.model.Figure; -import pp.monopoly.model.Rotation; import pp.monopoly.model.TradeHandler; import pp.monopoly.model.card.DeckHelper; import pp.monopoly.model.fields.BoardManager; @@ -223,8 +219,7 @@ public class ServerGameLogic implements ClientInterpreter { String name = msg.getName(); String truc = name.length() > 10 ? name.substring(0, 15) : name; player.setName(truc); - Figure figure = new Figure(new Vector3f(0, 1, 0), Rotation.NORTH, msg.getFigure()); - player.setFigure(figure); + player.setFigure(msg.getFigure()); // board.addFigure(figure); playerHandler.setPlayerReady(player, true); LOGGER.log(Level.DEBUG, "Player {0} is ready", player.getName());