Frage von jaunel, 21

Wie kann man in libGDX eine Map an einer bestimmten Position rendern?

Bis jetzt wird eine Map immer nur bei 0,0 gerendert. Ich habe auch schon probiert, eine neue Map zu laden und zu rendern, was bis jetzt auch funktioniert. Jedoch wird diese immer an der Kamera Position = 0,0 gerendert.

Wie kann man es hinbekommen, dass man mehrere Maps hintereinander rendert, jede an einer anderen Position?

Man findet absolut nichts dazu im Internet!

Wenn es wirklich nicht gehen sollte, hättet ihr vielleicht Tipps oder Level Editoren wie man das für einen unendlichen Platformer am besten hinbekommen könnte?

(Ich benutze Android Studio und die Map wurde mit Tiled Map Editor erstellt) Freue mich über alle nützlichen Antworten! :D

Antwort
von Springrbua, 10

Dafür gibt es in LibGDX die Camera. Für 2D verwendet man die sogenannte "OrthographicCamera".

Du solltest ja bereits die ViewPorts verwenden, um auch unterschiedliche Auflösungen und Bildformate (16:9, 4:3 etc.) richtig zu behandeln. falls nicht, ließ dir das hier (https://github.com/libgdx/libgdx/wiki/Viewports) durch.

Wie du siehts verwenden diese ViewPorts bereits eine Camera. Diese Camera kannst du mithilfe der "translate(float x, float y)" Methode bewegen.

Beim rendern des ganzen musst du dann camera.update() aufrufen und anschließend die ProjectionMatrix deines Batches (vermutlich SpriteBatch) auf "camera.combined" setzen. Wenn du anschließend mit diesem BAtch alles renderst, wird die Position deiner OrthographicCamera beim rendern mit einbezogen.

Hier (https://github.com/libgdx/libgdx/wiki/Orthographic-camera) gibt es ein tutorial dazu.

Kommentar von jaunel ,

Erstmal vielen Dank für deine Antwort! Hätte nicht erwartet dass ich eine bekomme.

Ich benutze bereits eine Camera, heißt das also dass ich jedes Mal wenn ich etwas an einer anderen Stelle rendern will alles komplett updaten muss?

(hier ein Ausschnitt davon) :

Deine Antwort hat mir ansonsten sehr weiter geholfen! :D

gamecam.translate(0.5f, 0);
gamecam.update();
game.batch.setProjectionMatrix(gamecam.combined);

gamePort = new FitViewport(TheGame.V_WIDTH / TheGame.PPM, TheGame.V_HEIGHT / TheGame.PPM, gamecam);
renderer = new OrthogonalTiledMapRenderer(map, 1 / TheGame.PPM);

map = mapLoader.load("levels/level2.tmx");
renderer.setMap(map);
Kommentar von jaunel ,

(mir ist gerade aufgefallen, dass ich die Neu-Zuweisung von gamePort und renderer auch weglassen könnte)

Kommentar von Springrbua ,

Du musst nicht alles updaten, sondern lediglich die camera (gamecam.update()) und die ProjectionMatrix deines Batches (game.batch.setProjectionMatrix(gamecam.combined)). Wichtig ist die Reihenfolge, da erst durch das gamecam.update() die combined-Matrix der Camera neu berechnet wird.  

Das heißt du kannst einfach immer vor dem Rendern diese zwei Methoden aufrufen und kannst so sicher sein, dass das Bild mit der aktuellen Camera-Position berechnet wird.  

Die Camera-Position kannst du z.B. bei Maus-Bewegungen oder so, über die Translate-Methode bewegen.

Ich muss aber dazu sagen, dass ich selbst nie mit TiledMapRenderer gearbeitet habe. Aber ich denke das Ganze sollte damit gleich funktionieren, vorausgesetzt der TiledMapRenderer verwendet deinen Batch und deine Camera

Keine passende Antwort gefunden?

Fragen Sie die Community