Hinzugefügt Kamera und 1. Spielfigut

This commit is contained in:
Luca Puderbach 2024-11-18 07:25:15 +01:00
parent 5fde7451c8
commit 1c99da4fc5
2 changed files with 95 additions and 38 deletions

View File

@ -5,51 +5,55 @@ import com.jme3.math.Vector3f;
import com.jme3.renderer.Camera; 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 { public class CameraController {
private final Camera camera;
private final Camera camera; // Die Kamera, die gesteuert wird private final Vector3f center; // Fokuspunkt der Kamera
private final Vector3f target; // Zielpunkt, den die Kamera fokussieren soll private final float radius; // Radius der Kreisbewegung
private final float radius; // Radius des Kreises private final float height; // Höhe der Kamera über dem Spielfeld
private final float height; // Höhe der Kamera über dem Zielpunkt private final float speed; // Geschwindigkeit der Kamerabewegung
private final float speed; // Geschwindigkeit der Bewegung in Radiant pro Sekunde private float angle; // Aktueller Winkel in der Kreisbewegung
private float angle = 0; // Aktueller Winkel der Kamera in Radiant
/** /**
* Erstellt einen neuen CameraController. * Konstruktor für den CameraController.
* *
* @param camera Die Kamera, die gesteuert wird * @param camera Die Kamera, die gesteuert werden soll
* @param target Der Punkt, auf den die Kamera ausgerichtet wird * @param center Der Mittelpunkt der Kreisbewegung (Fokuspunkt)
* @param radius Der Radius des Kreises, auf dem sich die Kamera bewegt * @param radius Der Radius der Kreisbewegung
* @param height Die Höhe der Kamera über dem Zielpunkt * @param height Die Höhe der Kamera über dem Fokuspunkt
* @param speed Die Geschwindigkeit der Bewegung in Radiant pro Sekunde * @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.camera = camera;
this.target = target; this.center = center;
this.radius = radius; this.radius = radius;
this.height = height; this.height = height;
this.speed = speed; 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 * @param tpf Zeit pro Frame
*/ */
public void update(float tpf) { public void update(float tpf) {
angle += speed * tpf; // Winkel basierend auf Geschwindigkeit und Zeit erhöhen // Aktualisiere den Winkel basierend auf der Geschwindigkeit
if (angle > FastMath.TWO_PI) { angle += speed * tpf;
angle -= FastMath.TWO_PI; // Zurücksetzen, um Überlauf zu vermeiden if (angle >= FastMath.TWO_PI) {
angle -= FastMath.TWO_PI; // Winkel zurücksetzen, um Überläufe zu vermeiden
} }
// Berechne die neue Kameraposition auf der Kreisbahn // Berechne die neue Position der Kamera
float x = FastMath.cos(angle) * radius; float x = center.x + radius * FastMath.cos(angle);
float z = FastMath.sin(angle) * radius; float z = center.z + radius * FastMath.sin(angle);
float y = center.y + height;
// Setze die neue Position der Kamera // Setze die Kameraposition
camera.setLocation(new Vector3f(x, height, z)); camera.setLocation(new Vector3f(x, y, z));
camera.lookAt(target, Vector3f.UNIT_Y); // Kamera bleibt auf das Ziel fokussiert
// Lasse die Kamera auf den Fokuspunkt blicken
camera.lookAt(center, Vector3f.UNIT_Y);
} }
} }

View File

@ -1,6 +1,9 @@
package pp.monopoly.client.gui; package pp.monopoly.client.gui;
import com.jme3.font.BitmapFont;
import com.jme3.font.BitmapText;
import com.jme3.material.Material; import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f; import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry; import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box; import com.jme3.scene.shape.Box;
@ -9,8 +12,8 @@ import com.jme3.texture.Texture;
import pp.monopoly.client.MonopolyApp; import pp.monopoly.client.MonopolyApp;
/** /**
* TestWorld zeigt eine einfache Szene mit einem texturierten Quadrat. * TestWorld zeigt eine einfache Szene mit einem texturierten Quadrat und einem kleinen Würfel.
* Die Kamera wird durch den CameraController gesteuert. * Die Kamera wird durch den CameraController gesteuert, und die Koordinaten des Würfels werden angezeigt.
*/ */
public class TestWorld { public class TestWorld {
@ -34,8 +37,9 @@ public class TestWorld {
app.getRootNode().detachAllChildren(); // Entferne andere Szenenobjekte app.getRootNode().detachAllChildren(); // Entferne andere Szenenobjekte
createBoard(); // Erstelle das Spielfeld createBoard(); // Erstelle das Spielfeld
createCube(); // Füge den Würfel hinzu
// Erstelle den CameraController // Übergib die Kamerasteuerung an CameraController
cameraController = new CameraController( cameraController = new CameraController(
app.getCamera(), // Die Kamera der App app.getCamera(), // Die Kamera der App
Vector3f.ZERO, // Fokus auf die Mitte des Spielfelds Vector3f.ZERO, // Fokus auf die Mitte des Spielfelds
@ -43,9 +47,6 @@ public class TestWorld {
3, // Höhe der Kamera 3, // Höhe der Kamera
0.5f // Geschwindigkeit der Bewegung 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() { private void createBoard() {
// Erstelle ein Quadrat // Erstelle ein Quadrat
Box box = new Box(1, 0.01f, 1); // Dünnes Quadrat für die Textur 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 // Setze das Material mit Textur
Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
@ -75,4 +76,56 @@ public class TestWorld {
app.getRootNode().attachChild(geom); 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);
}
} }