LibGDX Scene2d.ui 自适应尺寸

LibGDX Scene2d.ui Adaptive size with dip

这是我的代码:

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 - an abstract unit that is based on the physical density of the screen.

是不是只根据屏幕的物理密度,而不是根据屏幕尺寸? 我想用它来调整演员的大小和填充。

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

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

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

这个过程的缺点:

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

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