簡體   English   中英

LibGdx-縮放Sprite,攝影機和視口

[英]LibGdx - Scaling Sprites, Camera and Viewports

地獄全部,感謝您的閱讀,

我最近開始從事2D Android / Desktop項目的工作,試圖以我想要的方式顯示我的精靈時陷入困境。

我有一個背景精靈,它是144(w)x 160(h),我希望能夠相對於背景精靈上的點將其他精靈放置到屏幕上。

我想我知道,如果我創建一個144 x 160的攝影機/視口,則可以使用基於背景精靈的144 x 160的坐標將我的精靈放置在背景精靈上。 盡管可以嘗試使用不同的視口類型(FillViewport,FitViewport等),這將適用於移動設備上不同的屏幕分辨率,但可以拉伸背景精靈。

我想要實現的是讓我的背景精靈在不同的屏幕分辨率下保持其比率,並能夠將其他精靈放置在背景精靈上。 Sprite的放置需要在不同的分辨率下工作。

抱歉,如果我的解釋令人困惑或毫無意義。 我會添加一些圖片以幫助解釋,但是我很樂意在帖子中添加任何圖片。 但是,我認為TLTR問題是“在多種屏幕分辨率下顯示子畫面,同時保持正確的比例並以跨多種分辨率工作的方式縮放至屏幕大小和子畫面位置的正確方法是什么?”

謝謝,所有問題歡迎

FitViewport可以完成您描述的操作(保持寬高比),但是在某些設備上會出現黑條。 根據您在libgdx論壇上發布的代碼,我發現您忘記了使用resize方法更新視口,因此它的行為與設計不符。

但是,對於像您描述的那樣的靜態相機游戲,我認為最好的解決方案是將游戲計划在任何設備上始終可見的特定區域周圍,例如,框從(0,0)到(144,160) 。 然后使用寬度和高度分別為144和160的ExtendViewport。以resize更新視口后,可以將攝像機移動到矩形的中心,如下所示:

private static final float GAME_WIDTH = 144;
private static final float GAME_HEIGHT = 160;

public void create(){
    //...
    viewport = new ExtendViewport(GAME_WIDTH, GAME_HEIGHT);
    //...
}

public void resize(int width, int height){
    viewport.update(width, height, false); //centering by putting true here would put (0,0) at bottom left of screen, but then the game rectangle would be off center

    //manually center the center of your game box
    Camera camera = viewport.getCamera();
    camera.position.x = GAME_WIDTH /2;
    camera.position.y = GAME_HEIGHT/2;
    camera.update();
}

現在,您的144x160框就像在FitViewport中一樣位於屏幕的中心,但是您並不會陷入黑條,因為您可以使用任意方法在144x160區域之外繪制額外的背景。

在您的情況下,144:160的縱向寬高比比屏幕上的任何屏幕都要寬,因此您不必擔心會在游戲矩形的側面填充區域。 任何手機或平板電腦的最窄縱橫比似乎都是9:16,因此您可以進行數學計算,以了解應在游戲矩形上方和下方繪制多少額外的背景,以避免在任何設備上顯示黑色。

在這種情況下,它可以算出要填充的矩形上方和下方的48個單位:

  • 在9:16時144像素寬將為256高。
  • (256-160)/ 2 = 48

編輯:我從libgdx論壇上的帖子中看到,您希望游戲區域停留在屏幕頂部,而該區域的其余部分則用於游戲控件。 在這種情況下,我將像這樣更改resize方法,因為您希望游戲區域的頂部邊緣與屏幕的頂部邊緣對齊。 您還可以計算控件區域底部在Y軸上的位置。 (頂部將在Y = 0。)

public void resize(int width, int height){
    viewport.update(width, height, false); 

    //align game box's top edge to top of screen
    Camera camera = viewport.getCamera();
    camera.position.x = GAME_WIDTH /2;
    camera.position.y = GAME_HEIGHT - viewport.getWorldHeight()/2;
    camera.update();

    controlsBottomY = GAME_HEIGHT - viewport.getWorldHeight();
}

我不確定您打算如何進行控制,但是需要將它們放入(0, controlsBottomY)(GAME_WIDTH, 0)框中。 請記住,有些手機的寬高比低至3:4(盡管現在很少見)。 因此,使用0.9的寬高比,在3:4的手機上,只有屏幕底部的17%可供控件使用。 如果只是幾個按鈕,可能會很好,但是如果您有虛擬操縱桿,則可能會出現問題。

暫無
暫無

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

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