Die Kamera bewegt sich jedoch von der TiledMap "weg". Wie kann ich meine Kamera auf der TiledMap belassen? Wenn ich mich also den Rändern meiner Karte nähere, hört die Kamera auf zu scrollen und der Player bewegt sich zum Rand der Kamera?
Also gut, Sie arbeiten hier mit zwei Rechtecken. Eine größere statische (die Karte) und eine kleinere bewegliche (die Kamera) darin. Sie möchten, dass sich die Grenzen des kleineren Rechtecks nicht außerhalb der inneren Grenzen des größeren Rechtecks bewegen.
// These values likely need to be scaled according to your world coordinates.// The left boundary of the map (x)int mapLeft =0;// The right boundary of the map (x + width)int mapRight =0+ map.getWidth();// The bottom boundary of the map (y)int mapBottom =0;// The top boundary of the map (y + height)int mapTop =0+ map.getHeight();// The camera dimensions, halvedfloat cameraHalfWidth = cam.viewportWidth *.5f;float cameraHalfHeight = cam.viewportHeight *.5f;// Move camera after player as normalfloat cameraLeft = cam.position.x - cameraHalfWidth;float cameraRight = cam.position.x + cameraHalfWidth;float cameraBottom = cam.position.y - cameraHalfHeight;float cameraTop = cam.position.y + cameraHalfHeight;// Horizontal axisif(map.getWidth()< cam.viewportWidth){
cam.position.x = mapRight /2;}elseif(cameraLeft <= mapLeft){
cam.position.x = mapLeft + cameraHalfWidth;}elseif(cameraRight >= mapRight){
cam.position.x = mapRight - cameraHalfWidth;}// Vertical axisif(map.getHeight()< cam.viewportHeight){
cam.position.y = mapTop /2;}elseif(cameraBottom <= mapBottom){
cam.position.y = mapBottom + cameraHalfHeight;}elseif(cameraTop >= mapTop){
cam.position.y = mapTop - cameraHalfHeight;}
Die Logik ist also ziemlich einfach. Bewahren Sie die kleine Box in der größeren Box auf. Sobald Sie diese Idee verstanden haben, können Sie diesen Code reduzieren. Sie können es sogar in eine Reihe verschachtelter Min / Max-Anweisungen in Ihrer Kamerapositionsverfolgung verschieben, wenn Sie dies bevorzugen.
Ich sollte früher ins Bett gehen. Ich hatte so etwas implementiert, konnte es aber nicht zum Laufen bringen. Aber anstatt eine nette setPosition()Methode aufzurufen , die die Grenzen festlegt, habe ich immer noch die Nockenposition direkt eingestellt (zB cam.position.set()). Das funktioniert wie ein Zauber! Danke für die Erklärung!
Ariejan
7
Sie können die Kameraposition einfach wie folgt an die Kartengrenzen klemmen:
@Cypher: Es ist halb so groß wie die X- und Y-Achse des Ansichtsfensters.
Matthias
Wäre camViewportHalfXdas also gleichbedeutend mit camera.viewportWidth / 2?
Cypher
0
Um sich Camerain TiledMapGrenzen zu bewegen , OrthogonalTiledMapRendererwurde verwendet.
Mir ist auch aufgefallen, dass es sich unerwartet verhält: Während Cameradie Kartengrenzen erreicht werden, bewegt sich die gekachelte Karte wie durch Trägheit einige Pixel zu weit (dies hängt von der Geschwindigkeit des Wischens ab).
Als Lösung wird bei jeder CameraBewegung Camerazwangsweise in Kartengrenzen gesetzt. Siehe putInMapBounds()Methode.
Um Störungen beim TiledMapRendern zu vermeiden , wird verwendet Math.min(float, float).
Verwenden Sie diesen Listener, um Folgendes zu handhaben Camera:
setPosition()
Methode aufzurufen , die die Grenzen festlegt, habe ich immer noch die Nockenposition direkt eingestellt (zBcam.position.set()
). Das funktioniert wie ein Zauber! Danke für die Erklärung!Sie können die Kameraposition einfach wie folgt an die Kartengrenzen klemmen:
quelle
camViewportHalfX
undcamViewportHalfY
?camViewportHalfX
das also gleichbedeutend mitcamera.viewportWidth / 2
?Um sich
Camera
inTiledMap
Grenzen zu bewegen ,OrthogonalTiledMapRenderer
wurde verwendet.Mir ist auch aufgefallen, dass es sich unerwartet verhält: Während
Camera
die Kartengrenzen erreicht werden, bewegt sich die gekachelte Karte wie durch Trägheit einige Pixel zu weit (dies hängt von der Geschwindigkeit des Wischens ab).Als Lösung wird bei jeder
Camera
BewegungCamera
zwangsweise in Kartengrenzen gesetzt. SieheputInMapBounds()
Methode.Um Störungen beim
TiledMap
Rendern zu vermeiden , wird verwendetMath.min(float, float)
.Verwenden Sie diesen Listener, um Folgendes zu handhaben
Camera
:quelle
Wenn Sie den Zoomfaktor haben, um den Sie sich kümmern müssen, fand ich, dass dies viel besser funktioniert:
quelle