簡體   English   中英

libgdx使用視口的相機位置

[英]libgdx camera position using viewport

我寧願是libgdx開發人員的經驗,但是我在一段時間遇到一個問題,所以我決定在這里提問。

我使用FillViewport,TiledMap,Scene2d和OrtographicCamera。 我希望攝像機跟隨我的播放器實例,但是定義了界限(等於mapsize)。 這意味着攝像頭永遠不會離開地圖之外,因此,當玩家走到地圖盡頭時,攝像頭會停止跟隨,而他會走到屏幕本身的邊緣。 聽起來可能很復雜,但很簡單,我相信您知道我的意思,它在每款游戲中都得到了使用。

我計算了4個值:

minCameraX = camera.viewportWidth / 2;
minCameraY = camera.viewportHeight / 2;
maxCameraX = mapSize.x camera.viewportWidth / 2;
maxCameraY = mapSize.y - camera.viewportHeight / 2;

我刪除了不必要的內容,例如單位轉換,camera.zoom等。然后按如下所示設置相機位置:

camera.position.set(Math.min(maxCameraX, Math.max(posX, minCameraX)), Math.min(maxCameraY, Math.max(posY, minCameraY)), 0);

(posX,posY是播放器位置),這基本上是將相機設置為播放器位置,但如果設置得太高或太低,則將其設置為之前在右軸上定義的最大值或最小值。 (我也嘗試過MathUtils.clamp(),它的工作原理相同。

到目前為止,一切都很完美。 當寬高比改變時會出現問題。 默認情況下,我使用1280x768,但我的手機具有1280x720。 因此,由於FillViewport的工作方式,屏幕的上下邊緣被切除了。 因為我的地圖的那一部分被剪掉了。

我試圖修改最大值和最小值,計算比率差異並將其添加到計算中,更改相機大小,不同的視口和其他一些東西,但均未成功。

你們可以幫忙嗎? 謝謝

我從上面的評論中嘗試了noone和Tenfour04的解決方案。 兩者都不是完美的,但我想我很滿意:

沒有人:

camera.position.x = MathUtils.clamp(camera.position.x, screenWidth/2 + leftGutter, UnitConverter.toBox2dUnits(mapSize.x) - screenWidth/2 + rightGutter);
camera.position.y = MathUtils.clamp(camera.position.y, screenHeight/2 + bottomGutter, UnitConverter.toBox2dUnits(mapSize.y) - screenHeight/2 - topGutter);

但是,它僅適用於較小范圍的分辨率。 對於寬高比與默認寬高比有很大不同的奇怪分辨率,我在邊框后看到了白色條紋。 這意味着整個邊界是打印機,邊界之外的世界的某些部分。 我不知道為什么

Tenfour04:我將視口更改為ExtendViewport。 一切都沒有中斷,但以不同的縱橫比,我也可以看到世界以外的世界。

解決這兩種情況的方法是分別清除與邊框和背景色相同的顏色的屏幕,這兩種情況都令人滿意。

它仍然有一些限制。 由於邊框是世界的一部分(平鋪塊),因此具有相同的顏色是可以的。 如果邊框具有不同的顏色,則無法在邊框之外呈現一種顏色。

謝謝沒人和Tenfour04,我仍然可以征求建議:)

以下是一些屏幕截圖: https : //www.dropbox.com/sh/00h947wkzo73zxa/AAADHehAF4WI8aJ8bu4YzB9Va?dl=0

為什么不使用FitViewport而不是FullViewport? 這樣就不會切斷屏幕,對嗎?

有點晚了,但是我為您提供了一個毫不妥協的解決方案!

此處的寬度和高度是像素的世界尺寸。 我將此代碼與FillViewport一起使用,並且一切正常!

float playerX = player.getBody().getPosition().x*PPM;
float playerY = player.getBody().getPosition().y*PPM;

float visibleW =  viewport.getWorldWidth()/2 + (float)viewport.getScreenX()/(float)viewport.getScreenWidth()*viewport.getWorldWidth();//half of world visible
float visibleH = viewport.getWorldHeight()/2 + (float)viewport.getScreenY()/(float)viewport.getScreenHeight()*viewport.getWorldHeight();

float cameraPosx=0;
float cameraPosy=0;

if(playerX<visibleW){
    cameraPosx = visibleW;
}
else if(playerX>width-visibleW){
    cameraPosx = width-visibleW;
}
else{
    cameraPosx = playerX;
}

if(playerY<visibleH){
    cameraPosy = visibleH;
}
else if(playerY>height-visibleH){
    cameraPosy = height-visibleH;
}
else{
    cameraPosy = playerY;
}

camera.position.set(cameraPosx,cameraPosy,0);

camera.update();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM