【问题标题】:Pixels to dips, desktop and android像素下降,桌面和安卓
【发布时间】:2013-12-13 16:40:17
【问题描述】:

我正在使用 Libgdx 编写一个 android 游戏,您可能知道,如果操作不正确,许多屏幕分辨率会导致一些问题。所以我尝试使用这个 DP 单位而不是像素。

不过,我这里有这个方法:

public static float pixelToDP(float dp){
    return dp * Gdx.graphics.getDensity();
}

Gdx.graphics.getDensity() 方法实际上得到了 SCALE,所以它已经为我完成了。

现在的问题是,libgdx 是跨平台的,有利于测试。当我在分辨率为 1920x1080 且 dpi 高达 480 的 S4 上启动它时,与我的 1366x768 @ 92dpi 的糟糕且价格过高的笔记本电脑相反,它正好放置在我想要的位置。在桌面上它很遥远,在 X 和 Y 轴上有几百个像素。

这是因为我的屏幕 dpi 测量为@92dpi,分辨率低很多,实际游戏在桌面上不是全屏吗?

这是绘制对象的代码:

table.setPosition(MathHelper.pixelToDP(150), MathHelper.pixelToDP(200));

为了让它在桌面上完美,我必须这样做:

table.setPosition(MathHelper.pixelToDP(480), MathHelper.pixelToDP(700));

这在我的手机上什至看不到,因为比例实际上是 3 倍,这使它在 Y 轴上离屏幕有 200 像素。

有没有办法解决这个问题?还是我基本上必须处理平台检查和不同的代码块?

可能的解决方案:

所以我改变了我的 dp 转换方法,如果我做 100 * 0.5 它将返回一个新值 50 但实际上我想要 100 + 100 * 0.5 的原始值。

不确定这是否是一个正确的解决方法,但不管表格是在笔记本电脑和手机上的完全相同的位置绘制的:

public static float pixelToDP(float dp){
    if(Gdx.graphics.getDensity() < 1)
        return dp + dp * Gdx.graphics.getDensity();
    return dp * Gdx.graphics.getDensity();

这只是一个便宜的解决方案还是应该这样做?

【问题讨论】:

  • 在桌面上输出 0.525,在我的 s4 上输出 3.0。

标签: java android libgdx pixel density-independent-pixel


【解决方案1】:

使用与密度无关的像素意味着所有屏幕上表格的物理尺寸应该相同。由于您的笔记本电脑屏幕(物理上)要大得多,您会看到桌子比预期的要小很多。

我会建议另一种方法,将对象放置在小数部分中。例如宽度的 30% 或高度的 45%。

要实现这一点,只需假设舞台分辨率并根据需要放置对象,然后在 resize 方法中更改视口,以便获得完整视图。 希望对您有所帮助。

更多, https://code.google.com/p/libgdx-users/wiki/AspectRatio

【讨论】:

  • 啊,好吧,我的桌子实际上在两种设备之间的大小不同,因为我的手机有更多像素,所以按钮看起来要小得多,所以我加载了一个更大的尖顶。
  • 没错。但是,您可以简单地更改视口来处理缩放,而不是加载不同的精灵。但无论如何,这都是一个选择问题。祝你好运。
  • 我要试试viewport的方法,实在不想创建不同的res sprites,很费时间。用可能的修复更新了操作,让我知道你的想法
  • 如果您尝试在第三台设备上进行测试,比如低分辨率的安卓手机,您来之不易的校准可能会失败。 :D 我不推荐使用它。
【解决方案2】:

最好的方法是根据执行目标来操纵密度。

所以我通常做的是将密度存储在单例中的一个字段中,并根据场景进行设置:

public class Game {

 public static float density;

  public static initDensity(){
    if (GDX.app.getTarget() == 0){
      density = 2.0f;
    }else {
       density = GDX.graphics.getDensity();
    }
  }

  public float toPixel(float dip){
    return dip * density;
  }
} 

使用这种方法,您可以“模拟”比实际拥有的更密集的屏幕,并且通过使用运行配置中的属性,例如 -Ddensity=2System.getPropery("density"),您可以改变您想要模拟的屏幕。

【讨论】:

    【解决方案3】:

    一种方法是固定视口大小。创建您的相机,例如 1366x768,并使用该坐标放置所有对象。然后相机将填满其他分辨率的整个屏幕。

    cam = new OrthographicCamera(1366, 768);
    

    【讨论】:

      【解决方案4】:

      尝试看一些教程....我个人认为最好处理像素,使用相机会对您有很大帮助,请查看此链接一次

      getting different screen resolutions

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多