LibGdx - 缩放精灵,相机和视口

时间:2015-07-22 10:30:22

标签: java android libgdx

Hell All&谢谢你的阅读,

我最近开始研究2D Android /桌面项目,并试图以我想要的方式显示我的精灵。

我有一个背景Sprite,它是144(w)乘160(h),我希望能够将其他精灵相对于背景精灵上的点放在屏幕上。

我想我明白,如果我创建一个144 x 160的相机/视口,我可以使用基于144 x 160背景精灵的坐标将我的精灵定位在背景精灵上。这将适用于在移动设备上找到的不同屏幕分辨率,但是尽管尝试了不同的视口类型(FillViewport,FitViewport等等),它仍会延伸背景精灵。

我想要实现的是让我的背景精灵在不同的屏幕分辨率下保持它的比例,并能够将其他精灵放在背景精灵上。精灵的放置需要在不同的分辨率下工作。

如果我的解释令人困惑或毫无意义,请道歉。我会添加一些图片以帮助解释,但我声明要添加任何帖子。但是我认为TLTR的问题是“在多个分辨率下保持正确的比率并缩放到精灵的屏幕大小和位置,以多种分辨率的方式显示精灵的正确方法是什么?”

谢谢,欢迎所有问题

1 个答案:

答案 0 :(得分:1)

FitViewport可以执行您所描述的操作(保持纵横比),但某些设备上会出现黑条。根据您在libgdx论坛上发布的代码,我发现您忘记在resize方法中更新视口,因此它的行为不符合设计。

然而,对于像你所描述的静态相机游戏,我认为最好的解决方案是在任何设备上始终可见的某个区域周围规划你的游戏,例如,从(0,0)到(144160)。然后使用宽度和高度为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论坛帖子上看到你想让游戏区域卡在屏幕的顶部,剩下的区域用于游戏控制。在这种情况下,我会像这样更改调整大小方法,因为您希望游戏区域的上边缘与屏幕的上边缘对齐。您还可以计算控制区域底部在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%可用于控制。如果它只是几个按钮可能没问题,但如果你有一个虚拟操纵杆可能会有问题。