libGDX中的分辨率独立性


22

如何使我的libGDX游戏分辨率/密度独立?有没有一种方法可以将图像尺寸指定为“绝对”,而与底层密度无关?

我正在做一个非常简单的儿童游戏;屏幕上只显示了一堆精灵,还有一些菜单文本(主要是选项菜单)。我想知道的是:如何使子画面/字体分辨率独立?(为了方便起见,我将它们包装在自己的班级中。)

由于它是一款简单的儿童游戏,因此我无需担心游戏的“可玩区域”。我想尽可能多地使用屏幕空间。

我现在正在做的事情,似乎超级不正确,是简单地创建适合高分辨率的图像,然后缩小(或很少放大)以适合屏幕尺寸。即使在我的纹理上进行线性映射,这似乎也行得通(在桌面版本中),但是较小的分辨率看起来很难看。

此外,这似乎在Android的“设备独立像素”(DPs)面前飞了起来。还是我丢失了某些东西,而libGDX已经以某种方式解决了这个问题?

解决此问题的最佳方法是什么?我找到了这个链接;这是解决问题的好方法吗?:http : //www.dandeliongamestudio.com/2011/09/12/android-fragmentation-density-independent-pixel-dip/

它提到了如何控制图像,但是没有提到如何指定字体/图像大小而与密度无关。



@thedaian不太满意。那是关于分辨率的问题;我更关心密度和分辨率之间的相互作用。
ashes999 2012年

Answers:


12

由于您可以在运行时在libgdx中读取设备密度并渲染字体,因此我使用以下解决方案来实现与密度无关的字体​​大小:

float densityIndependentSize = origFontSize * Gdx.graphics.getDensity();
int fontSize = Math.round(densityIndependentSize );
BitmapFont font = generator.generateFont(fontSize );

我的讨论是关于图像以及字体。虽然+1用于动态字体渲染(我已经这样做了)。
ashes999

10

要在libgdx中实现此目的,您可以在其中使用“ orthographicCamera”来指定要使用的尺寸,并且在每种分辨率下,您可能会看到所有图像都按比例缩放到该尺寸(我使用800X480,因为它在Android中是较大的屏幕),效果很好:)

public class GameStage extends Stage 
{ 
     public GameStage(float width, float height, boolean stretch) 
     { 
          this.camera = new OrthographicCamera(800, 480);
          this.camera.position.set(800/2, 480/2, 0f); 
     } 
}

我可以获取代码示例吗?
ashes999 2012年

就是代码,然后创建一个实现Screen接口的类,在构建舞台的构造函数中,在render方法中放置stage.draw()。如果您不想使用舞台,则可以在Camera类型的Screen实现类中声明一个变量,并执行与Stage中相同的操作,但是在render方法中,您将更新应用于相机。
Rudy_TM 2012年

这实际上效果很好。
you786 2013年

4

我相信Android的“与设备无关的像素”只是用于对设备进行分类的量尺,实际上并不可用作可渲染像素。因此,您不会错过任何神奇的DPI解决基础设施。据我了解的最新水平,您已经找到了所有选择。有两种处理不同设备的基本方法:

  1. 缩放现有图像以匹配实际设备DPI。
  2. 基于DPI,可以在运行时从各种预缩放图像中进行选择。

当然,您可以将两者混合使用(先选择一个大致准确的图像,然后对其进行缩放),或者对UI的不同元素使用不同的方法(例如,针对字体/文本的现有图像,以及对游戏玩法的动态缩放)精灵)。

您的特定游戏正在尝试做的事情实际上可以改变哪种方法更有意义。例如,如果您有一个屏幕菜单,则需要确保这些按钮是指尖大小的合理倍数(因此,该按钮始终易于击打,但不会超出所需的大小)。平板电脑等大型设备)。另外,如果您要构建一个益智游戏,想确保整个拼图一次可见,则需要缩放元素以使其适合屏幕(例如,井字游戏)游戏中,您可能希望每个元素都使用大约1/3的屏幕)。

我认为对于诸如字体之类的细节很多的东西,您将需要使用各种预先渲染的带有文本的图像,然后选择最匹配的图像。因此,按钮可能会将其相对形状/大小从一台设备更改为另一台设备,但通常看起来总是很好。

请查看Mario Zerchner的Beginning Android Games,以了解有关问题和解决方案的一些讨论。请注意,Mario是libGDX的作者,因此该书的方法与libGDX相似(请注意它们不是一对一的,该书涵盖编写类似于libGDX的库,但不是libGDX本身)。


即使从基于DPI的预制图像集合中进行选择,我也看不到如何保证“此精灵必须显示为64x64”。
ashes999 '02

1
我假设您将OpenGL摄像头设置为与物理显示匹配,因此1个OpenGL像素映射为1个显示像素。届时,一个64x64的图像将在屏幕上显示为64x64。正如Rudy_TM指出的那样,您可以将相机映射弄乱以获得全屏缩放。
PT

好的,这看起来像我追求的“秘密调味料”。我会检查一下,谢谢。
ashes999 2012年

0

一种方法是为游戏定义最小纵横比和最大纵横比。这些将是您要支持的比率。然后,您需要使用libGdx现在提供的Viewport。视口将根据您提供的设置缩放您的世界。

视口有几种类型,您需要选择最适合您的游戏的视口。

例如,您可以使用ExtendViewport并固定您的高度或宽度,然后计算另一个。然后,您需要确保可以以最小纵横比看到所有图形。扩展视口将使图形缩放到正确的纵横比,而不会扭曲图形。但是,ExtendViewport通过为您的世界增加额外的空间来工作,因此您还应该提供背景图形,例如,覆盖覆盖的长宽比的整个范围,当世界小于最大长宽比时,图形的多余部分将不会被显示。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.