首页 > 解决方案 > LibGDX Scene2d.ui 带倾角的自适应大小

问题描述

这是我的代码:

public class Menu implements Screen {

private MyGdxGame gameInstance;
public Stage stage;
public Table root;
public Label wellcomeLabel;
public TextButton startButton;

public Menu(MyGdxGame gameInstance) {
    this.gameInstance = gameInstance;
    stage = new Stage();
    root = new Table();
    root.setDebug(true);
    root.setFillParent(true);
    root.top();
    stage.addActor(root);

    wellcomeLabel = new Label("Wellcome!",gameInstance.labelStyle);
    startButton = new TextButton("Start",gameInstance.btnStyle);

    root.add(wellcomeLabel).pad(32);
    root.row();
    root.add(startButton).size(240,100);
}

@Override
public void show() {

}

@Override
public void render(float p1) {
    Gdx.gl.glClearColor(0.4f,0.4f,0.4f,1f);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    stage.act(Gdx.graphics.getDeltaTime());
    stage.draw();
}

@Override
public void resize(int p1, int p2) {

}

@Override
public void pause() {

}

@Override
public void resume() {

}

@Override
public void hide() {

}

@Override
public void dispose() {

}
}

表格可以帮助我们调整演员的位置,但是大小呢?我有一个想法:使用倾角(与密度无关的像素)。但我听到了这个:

Density-independent Pixels - 一个基于屏幕物理密度的抽象单位。

是不是说只根据屏幕的物理密度,而不是根据屏幕大小?我想将它用于演员的大小和填充。

标签: javaandroidlibgdx

解决方案


LibGDX 的 UI 系统没有任何自适应缩放。这意味着如果您想将 ScreenViewport 用于像素完美资产,那么在设置 UI 时,您必须获取当前屏幕尺寸并使用它们来计算缩放因子,并将其乘以您在设置 UI 时使用的每个尺寸。

我不理会这些。相反,我使用 ExtendViewport 在每个屏幕上以一致的比例绘制所有内容:

  • 我使我的 UI 资产规模相当大,以便在任何屏幕上看起来都不错。
  • 我的 UI 资产有自己的 TextureAtlas。我用三线性过滤(MipMapLinearLinear,线性)加载它。这样一来,当按比例缩小时,艺术仍然看起来很清晰。
  • 在我的 BitmapFont 上,我调用setUseIntegerPosition(false)允许字母的非整数定位,这样在放大或缩小时字距调整不会变得不稳定。
  • 我将 ExtendViewport 用于我的 UI Stage 而不是 ScreenViewport。如果它们以 1:1 像素比例绘制,我会根据与我的艺术资产一起使用的屏幕尺寸来选择虚拟尺寸。
  • 无需使用任何手动缩放。可以以我的源艺术的像素单位声明填充、间距和大小。ExtendViewport 会为您处理缩放。

这个过程的缺点:

  • 在较小尺寸的屏幕上使用内存是很浪费的,因为在内存中加载了大于必要的纹理。
  • 文本和 UI 元素比像素完美绘制时的清晰度稍差。
  • 在 GPU 上使用 MipMapLinearLinear 绘制东西比使用最近过滤更重。

好处是您只需要管理一个 UI TextureAtlas。您无需在多个比例上创建它以使其在不同的屏幕尺寸和密度下看起来一致。单位很容易使用。而且由于您使用的是三线性过滤,因此您可以使用缩放来制作动画效果,它们看起来会很平滑。例如,我使用动作让按钮在按下它们时快速放大动画。


推荐阅读