libgdx resolution/density 缩放资产

libgdx resolution/density scaling assets

快速提问,

我正在 libgdx 开发一款游戏,但遇到了障碍。我正在尝试扩展我的资产,我正在使用 Gdx.graphics.getDensity() 来获取密度,然后使用它作为乘数来设置我的资产大小。我遇到的问题是,在具有 2560x1600 分辨率的平板电脑上,密度为 2.0,而具有 1080x1920 的 nexus 5 模拟器的密度为 2.652...平板电脑如何密度比小的phone小?

如果基于 android 应用程序屏幕尺寸的密度不可靠,我应该使用什么来获得我的缩放乘数?

回答你的第一个问题,这是硬件问题。 Nexus 5 可能具有比第二个更高的 PPI(每英寸像素)比率,即使分辨率更小。

关于你的第二个问题,我建议 Gdx.graphics.getDensity() 的替代方案:如果你试图确保你的资源相对于屏幕大小相同(即 2560x1600 显示器上的 80x80 资源在 1280x800 显示器上会是尺寸的一半),那么我认为您想保留相同尺寸的资产并 改为更改相机尺寸

当您在 libGDX(或任何游戏引擎)中创建游戏时,您需要记住游戏中三组 sizes/coordinates 之间的区别:

  • Viewport 大小是屏幕上 space 游戏绘制的大小。它以像素为单位,默认为您的 window 尺寸(在全屏游戏中,屏幕尺寸)。
  • 游戏世界size/coordinates完全是随心所欲。它们以您想要的任何单位进行测量(米、英寸、香蕉、F16 等)。你会知道你在游戏世界单位工作,因为你有花车。
  • 相机大小是'world'您一次可以看到的数量,以游戏单位衡量。您可以让您的相机显示世界的 1280x800 部分或世界的 3x5 部分或 137.6x42 部分。棘手的是 libGDX 的 OrthographicCamera class 默认视口大小,就像 1 个游戏单元 == 1 像素一样。

希望这是有道理的。让我们看看其中的含义:

假设我在我的游戏世界中有一个 800x600 GU(游戏单元)资产在 0,0。我的视口大小是 2560x1600,我的相机也缩放到 2560x1600。我的 800x600 GU 对象将在屏幕上呈现 800x600 像素的图像。

现在假设我想将我的游戏移植到具有相同比例的其他屏幕尺寸(现在只是为了让事情简单化)。我的视口大小仍然是 2560x1600,但我将相机更改为 8x5 GU,将游戏对象更改为 2.5x1.875 GU。这些尺寸将被明确地设置——独立于视口尺寸。这使得 1 GU = 320px。最终结果是我的游戏对象仍会在屏幕上呈现 800x600 像素的图像。

现在让我们看看这在 1280x800 像素的分辨率下如何工作:我的视口是 1280x800 像素,但我的相机保持在 8x5 GU,我的游戏对象保持在 2.5x1.875 GU。由于相机的大小,1 GU = 160px,这意味着我的游戏对象以 400x300 渲染,这意味着它在较小的屏幕上按比例相同。

希望没有图片也能理解。当您开始使用具有不同纵横比的屏幕时(即从 8x5 屏幕变为 3x2 屏幕),您需要一些额外的逻辑来保持视口的纵横比与相机的纵横比相同(否则一切都会被拉伸)。幸运的是,libGDX 提供了 some viewports which will do this for you.

您可以在此处找到 libGDX 社区的 external tutorial,其中详细讨论了此问题。