2016-11-21 67 views
2

我非常喜歡libgdx開發者,但是我在一段時間內遇到了一個問題,所以我決定在這裏問一下。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由於底部和頂部邊緣因爲我的地圖部分被切斷

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

你們能幫忙嗎? 謝謝

+0

究竟是什麼問題?您的相機邊界機制不再適用,或者是屏幕部分被切斷的問題? – noone

+0

第二個。例如,頂部和底部邊緣被切掉,所以我沒有看到地圖結束幀。當然我知道這是FillViewport的工作方式,但它應該可以修改相機邊界來修復它 –

+0

我不確定它是否在這種情況下,但你可以嘗試添加'getTopGutterHeight()'和'getBottomGutterHeight( )'給你的minCameraY和maxCameraY(或者換個方式,減去而不是添加?) – noone

回答

0

我從上面的評論中嘗試了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。沒有任何東西被切斷,但是在不同的長寬比中,我也可以看到境外的世界。

兩者的解決方案都是用相同的顏色來清除屏幕上的邊框和背景,在兩種情況下都能達到令人滿意的效果。

它stil有一些限制。由於邊界是世界的一部分(平鋪塊),當它具有相同的顏色時可以。如果邊框具有不同的顏色,則在邊界之外渲染一種顏色將不是一個解決方案。

由於沒有人與Tenfour04,我還是打開了建議:)

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

+0

只要這個世界至少和屏幕一樣大,我不確定你怎麼能最終看到超越邊界,假設你使用你在問題中顯示的相機夾具。我所做的是使用虛擬寬度和高度爲4:3的分辨率,然後確保世界足以覆蓋至少16:9的版本。例如,如果您的虛擬尺寸是400x300,那麼您的世界至少需要534寬,以確保您永遠不會看到虛空。你可以添加額外的風景瓷磚,以確保在小舞臺上。 – Tenfour04

+0

我添加了一些屏幕截圖來顯示問題 –

0

你爲什麼不使用FitViewport代替FullViewport?這樣它不會切斷你的屏幕,對吧?

+0

,並使醜陋的白色條紋 –

0

這有點晚了,但我沒有妥協的解決方案!

這裏的寬度和高度是以像素爲單位的世界大小。我在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();