2017-12-05 6 views
0

Ich erstelle ein Spiel in LibGDX und verwende Tiled als mein Kartensystem.Clamp Kamera zu Karte (Zoom Problem)

Ich versuche, eine OrthographicCamera innerhalb der Grenzen meiner TiledMap zu enthalten. Ich verwende MathUtils.clamp, um dies zu erreichen. Wenn die Kamera einen normalen Zoomfaktor von 1,0f hat, funktioniert sie einwandfrei. Wenn die Kamera jedoch weiter herangezoomt wird, z. B. .75f, wird die Kamera an die falsche Stelle geklemmt, da sie keine Informationen über den Zoomwert enthält.

Meine Frage: Wie schließe ich den Zoom-Wert in meinen Klemmcode ein, damit die Kamera korrekt geklemmt wird? Irgendwelche Ideen?

Vielen Dank! - Jake

Antwort

0

Sie von Zoom der Welt Größe multiplizieren sollte, nicht die Kameraposition:

float worldWidth = gameScreen.mapHandler.mapPixelWidth; 
    float worldHeight = gameScreen.mapHandler.mapPixelHeight; 
    float zoom = gameScreen.gameCamera.camera.zoom; 
    float zoomedHalfWorldWidth = zoom * gameScreen.gameCamera.camera.viewportWidth/2; 
    float zoomedHalfWorldHeight = zoom * gameScreen.gameCamera.camera.viewportHeight/2; 

    //min and max values for camera's x coordinate 
    float minX = zoomedHalfWorldWidth; 
    float maxX = worldWidth - zoomedHalfWorldWidth; 

    //min and max values for camera's y coordinate 
    float minY = zoomedHalfWorldHeight; 
    float maxY = worldHeight - zoomedHalfWorldHeight; 

    position.x = MathUtils.clamp(position.x, minX, maxX); 
    position.y = MathUtils.clamp(position.y, minY, maxY); 

Beachten Sie, dass, wenn eine sichtbare Fläche, die kleiner ist als die Welt groß sein, dann müssen Sie anders solchen Situationen umgehen :

if (maxX <= minX) { 
     //visible area width is bigger than the worldWidth -> set the camera at the world centerX 
     position.x = worldWidth/2; 
    } else { 
     position.x = MathUtils.clamp(position.x, minX, maxX); 
    } 

    if (maxY <= minY) { 
     //visible area height is bigger than the worldHeight -> set the camera at the world centerY 
     position.y = worldHeight/2; 
    } else { 
     position.y = MathUtils.clamp(position.y, minY, maxY); 
    }