From 1c99da4fc5c5a0e5bf88556a59249a3f33fd9d00 Mon Sep 17 00:00:00 2001 From: Luca Puderbach Date: Mon, 18 Nov 2024 07:25:15 +0100 Subject: [PATCH] =?UTF-8?q?Hinzugef=C3=BCgt=20Kamera=20und=201.=20Spielfig?= =?UTF-8?q?ut?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../monopoly/client/gui/CameraController.java | 56 +++++++------- .../pp/monopoly/client/gui/TestWorld.java | 77 ++++++++++++++++--- 2 files changed, 95 insertions(+), 38 deletions(-) diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/CameraController.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/CameraController.java index 605bea3..314ebb6 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/CameraController.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/CameraController.java @@ -5,51 +5,55 @@ import com.jme3.math.Vector3f; import com.jme3.renderer.Camera; /** - * CameraController steuert die Bewegung der Kamera in einem Kreis um eine Zielposition. + * Steuert die Kamerabewegung in der Szene. */ public class CameraController { - - private final Camera camera; // Die Kamera, die gesteuert wird - private final Vector3f target; // Zielpunkt, den die Kamera fokussieren soll - private final float radius; // Radius des Kreises - private final float height; // Höhe der Kamera über dem Zielpunkt - private final float speed; // Geschwindigkeit der Bewegung in Radiant pro Sekunde - private float angle = 0; // Aktueller Winkel der Kamera in Radiant + private final Camera camera; + private final Vector3f center; // Fokuspunkt der Kamera + private final float radius; // Radius der Kreisbewegung + private final float height; // Höhe der Kamera über dem Spielfeld + private final float speed; // Geschwindigkeit der Kamerabewegung + private float angle; // Aktueller Winkel in der Kreisbewegung /** - * Erstellt einen neuen CameraController. + * Konstruktor für den CameraController. * - * @param camera Die Kamera, die gesteuert wird - * @param target Der Punkt, auf den die Kamera ausgerichtet wird - * @param radius Der Radius des Kreises, auf dem sich die Kamera bewegt - * @param height Die Höhe der Kamera über dem Zielpunkt - * @param speed Die Geschwindigkeit der Bewegung in Radiant pro Sekunde + * @param camera Die Kamera, die gesteuert werden soll + * @param center Der Mittelpunkt der Kreisbewegung (Fokuspunkt) + * @param radius Der Radius der Kreisbewegung + * @param height Die Höhe der Kamera über dem Fokuspunkt + * @param speed Die Geschwindigkeit der Kamerabewegung */ - public CameraController(Camera camera, Vector3f target, float radius, float height, float speed) { + public CameraController(Camera camera, Vector3f center, float radius, float height, float speed) { this.camera = camera; - this.target = target; + this.center = center; this.radius = radius; this.height = height; this.speed = speed; + this.angle = 0; // Starte bei Winkel 0 } /** - * Aktualisiert die Kameraposition basierend auf der verstrichenen Zeit. + * Aktualisiert die Kameraposition und -ausrichtung. * * @param tpf Zeit pro Frame */ public void update(float tpf) { - angle += speed * tpf; // Winkel basierend auf Geschwindigkeit und Zeit erhöhen - if (angle > FastMath.TWO_PI) { - angle -= FastMath.TWO_PI; // Zurücksetzen, um Überlauf zu vermeiden + // Aktualisiere den Winkel basierend auf der Geschwindigkeit + angle += speed * tpf; + if (angle >= FastMath.TWO_PI) { + angle -= FastMath.TWO_PI; // Winkel zurücksetzen, um Überläufe zu vermeiden } - // Berechne die neue Kameraposition auf der Kreisbahn - float x = FastMath.cos(angle) * radius; - float z = FastMath.sin(angle) * radius; + // Berechne die neue Position der Kamera + float x = center.x + radius * FastMath.cos(angle); + float z = center.z + radius * FastMath.sin(angle); + float y = center.y + height; - // Setze die neue Position der Kamera - camera.setLocation(new Vector3f(x, height, z)); - camera.lookAt(target, Vector3f.UNIT_Y); // Kamera bleibt auf das Ziel fokussiert + // Setze die Kameraposition + camera.setLocation(new Vector3f(x, y, z)); + + // Lasse die Kamera auf den Fokuspunkt blicken + camera.lookAt(center, Vector3f.UNIT_Y); } } 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 index 34fb5dc..ab4c3f8 100644 --- 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 @@ -1,6 +1,9 @@ package pp.monopoly.client.gui; +import com.jme3.font.BitmapFont; +import com.jme3.font.BitmapText; import com.jme3.material.Material; +import com.jme3.math.ColorRGBA; import com.jme3.math.Vector3f; import com.jme3.scene.Geometry; import com.jme3.scene.shape.Box; @@ -9,8 +12,8 @@ import com.jme3.texture.Texture; import pp.monopoly.client.MonopolyApp; /** - * TestWorld zeigt eine einfache Szene mit einem texturierten Quadrat. - * Die Kamera wird durch den CameraController gesteuert. + * TestWorld zeigt eine einfache Szene mit einem texturierten Quadrat und einem kleinen Würfel. + * Die Kamera wird durch den CameraController gesteuert, und die Koordinaten des Würfels werden angezeigt. */ public class TestWorld { @@ -34,18 +37,16 @@ public class TestWorld { app.getRootNode().detachAllChildren(); // Entferne andere Szenenobjekte createBoard(); // Erstelle das Spielfeld + createCube(); // Füge den Würfel hinzu - // Erstelle den CameraController + // Übergib die Kamerasteuerung an CameraController cameraController = new CameraController( - app.getCamera(), // Die Kamera der App - Vector3f.ZERO, // Fokus auf die Mitte des Spielfelds - 5, // Radius des Kreises - 3, // Höhe der Kamera - 0.5f // Geschwindigkeit der Bewegung + app.getCamera(), // Die Kamera der App + Vector3f.ZERO, // Fokus auf die Mitte des Spielfelds + 5, // Radius des Kreises + 3, // Höhe der Kamera + 0.5f // Geschwindigkeit der Bewegung ); - - // Deaktiviere den Maus-Cursor - app.enqueue(() -> app.getInputManager().setCursorVisible(false)); } /** @@ -65,7 +66,7 @@ public class TestWorld { private void createBoard() { // Erstelle ein Quadrat Box box = new Box(1, 0.01f, 1); // Dünnes Quadrat für die Textur - Geometry geom = new Geometry("Box", box); + Geometry geom = new Geometry("Board", box); // Setze das Material mit Textur Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); @@ -75,4 +76,56 @@ public class TestWorld { app.getRootNode().attachChild(geom); } + + /** + * Füge einen kleinen blauen 3D-Würfel hinzu und zeige seine Koordinaten an. + */ + private void createCube() { + // Erstelle einen kleinen 3D-Würfel + Box cube = new Box(0.1f, 0.1f, 0.1f); // Sehr kleine Kantenlänge + Geometry cubeGeom = new Geometry("PlayerPiece", cube); + + // Erstelle ein Material mit einer blauen Farbe + Material cubeMat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); + cubeMat.setColor("Color", ColorRGBA.Blue); // Blaue Farbe + cubeGeom.setMaterial(cubeMat); + + // Positioniere den Würfel + float boardWidth = 1; // Breite des Bretts (aus `createBoard`) + float boardDepth = 1; // Tiefe des Bretts (aus `createBoard`) + Vector3f cubePosition = new Vector3f( + boardWidth + 0.3f, // Verschiebe den Würfel nach rechts + 0.1f, // Höhe knapp über dem Brett + boardDepth - 0.3f // Position in Richtung der unteren rechten Ecke + ); + cubeGeom.setLocalTranslation(cubePosition); + + // Füge den Würfel zur Szene hinzu + app.getRootNode().attachChild(cubeGeom); + + // Zeige die Koordinaten des Würfels an + displayCubeCoordinates(cubePosition); + } + + /** + * Zeige die Koordinaten des Würfels im GUI an. + * + * @param position Die Position des Würfels + */ + private void displayCubeCoordinates(Vector3f position) { + // Lade die Schriftart + BitmapFont font = app.getAssetManager().loadFont("Interface/Fonts/Default.fnt"); + BitmapText coordinatesText = new BitmapText(font); + + // Setze den Text mit den Koordinaten + coordinatesText.setText(String.format("Würfel Koordinaten: X=%.2f, Y=%.2f, Z=%.2f", + position.x, position.y, position.z)); + + // Positioniere den Text auf dem Bildschirm + coordinatesText.setLocalTranslation(10, app.getCamera().getHeight() - 10, 0); // X, Y (oben links) + coordinatesText.setSize(font.getCharSet().getRenderedSize() * 1.5f); // Schriftgröße + + // Füge den Text zum GUI-Node hinzu + app.getGuiNode().attachChild(coordinatesText); + } }