LibGDX - 如何让我的游戏适配所有屏幕分辨率?

3

我目前正在使用正交相机。在深入了解游戏之前,我想先解决屏幕尺寸的问题。当前,我的屏幕尺寸设置为800 x 480。这个设置能够适配其他设备和不同的屏幕尺寸吗?现在我只有一个闪屏和游戏画面。我需要添加哪些代码才能实现这一点。


使用像本地AVD或Genymotion这样的模拟器,来测试各种设备。虽然我没有做过太多的libgdx工作,但这通常是我测试分辨率的方式。 - zgc7009
看一下libgdx关于视口的维基百科,我认为你会在那里找到更好的解决方案!https://github.com/libgdx/libgdx/wiki/Viewports - bemeyer
2个回答

6

在相机上设置一个静态宽度是完全可以的,因为它给了你的游戏一个可靠的单一固定维度。这是有效的,因为相机用于定义世界坐标,而世界坐标不总是与屏幕坐标一一对应。

你的问题出在相机高度的固定上。设置固定高度将导致屏幕根据设备屏幕的纵横比例变得更高或更短。如果你想考虑不同的纵横比,你需要将相机高度(目前为480)乘以显示比例。你可以通过将高度除以宽度再除以高度来获取屏幕比例。这会看起来像是:

float width = Gdx.graphics.getWidth();
float height = Gdx.graphics.getHeight();

OrthographicCamera camera = new OrthographicCamera(800, 480 * (height / width));

正如评论中BennX所指出的那样,LibGDX引入了视口(viewports),可以让你以一种不同的方式做很多与上述相似的事情。要使用视口实现我上面概述的相同效果,您只需使用一个ExtendViewport即可。其作用是在一个方向上保持世界的大小,同时在另一个方向上进行拉伸。因此,世界将首先缩放以填充屏幕,然后在保持纵横比的同时扩展较短的尺寸。要创建这种类型的视口,代码应该类似于:
OrthographicCamera camera = new OrthographicCamera(800, 480);
ExtendViewport viewport = new ExtendViewport(800, 480, camera);

上面的视口将具有最小宽度为800和最小高度为480。在应用视口后,这些值中的一个将保持不变,另一个将根据屏幕的纵横比而改变。较窄的屏幕将具有更多的垂直空间,而较宽的屏幕将具有更多的水平空间。欲了解更多关于视口的信息,请访问LibGDX wiki页面此处


我认为这不是一个好的解决方案。Libgdx在4个月前实现了Viewports,专门解决这个问题,它可以完成所有的工作。https://github.com/libgdx/libgdx/wiki/Viewports - bemeyer
1
@BennX 感谢你提醒。我仍在使用稍旧版本的引擎,其中没有视口功能,所以我不知道这个解决方案。我已更新答案以反映两种解决方案。 - Michael Celey
@Mceley 我需要在我的应用程序的每个屏幕上都应用这行代码吗? - Dakota
你只需要在你的Game类或者其他主要的ApplicationListener类中的create()方法中完成这个操作。然后,如果你正在使用stages,你需要使用setViewport()将viewport设置为当前stage。setViewport() - Michael Celey

0

我使用以下方法,它适用于几乎所有屏幕大小,只有微小的缩放问题。

我总是使用1920.0x1080.0的屏幕尺寸来制作图形图像。

ScreenViewport screenViewport=new ScreenViewport(camera);
screenViewport.setUnitsPerPixel(Math.min(1920.0f/Gdx.graphics.getWidth(),1080.0f/Gdx.graphics.getHeight()));

在这里,您可以从Math.min()或Math.max()中选择您的方法。

这将使您的相机视口大小接近于1920.0 * 1080.0。

Device screen-size Math.max()      Math.max() 
800.0x480.0        1800.0x1080.0   1920.0x1152.0
1920.0x1080.0      1920.0x1080.0   1920.0x1080.0
2048.0x1440.0      1536.0x1080.0   1920.0x1350.0

注意:始终使用camera.viewportWidth和camera.viewportHeight来设置游戏UI屏幕的位置。


很好,别忘了添加:public void resize(int width, int height) { screenViewport.update(width,height); } - AndroLogiciels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接