繁体   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