在各种手机上使用LibGDX和Stage进行不同的输出

在各种手机上使用LibGDX和Stage进行不同的输出,libgdx,Libgdx,我在三星和LG上有不同的屏幕: 三星(理应如此) ! LG: ! 我尝试了各种视口类型,但没有任何改变。 有什么线索吗? 代码如下: package de.marcofriedmann.slideit.screens; import com.badlogic.gdx.Game; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20;

我在三星和LG上有不同的屏幕:

三星(理应如此) !

LG: !

我尝试了各种视口类型,但没有任何改变。 有什么线索吗? 代码如下:

package de.marcofriedmann.slideit.screens;

import com.badlogic.gdx.Game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Stack;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.utils.viewport.ExtendViewport;

import de.marcofriedmann.slideit.util.Assets;
import de.marcofriedmann.slideit.util.Constants;
import de.marcofriedmann.slideit.util.GameStatistics;
import de.marcofriedmann.slideit.util.IActivityRequestHandler;

public class ScoreScreen extends AbstractGameScreen {
private GameStatistics statistics;
private Stage stage;
private Skin skinSlideIt;
private Skin skinLibgdx;
private Image imgBackground;


public ScoreScreen(Game game, IActivityRequestHandler myRequestHandler,
        GameStatistics statistics) {
    super(game, myRequestHandler);
    this.statistics = statistics;
}

private void rebuildStage() {
    skinSlideIt = new Skin(Gdx.files.internal(Constants.SKIN_SLIDEIT), new TextureAtlas(Constants.TEXTURE_ATLAS_OBJECTS));
    skinLibgdx = new Skin(Gdx.files.internal(Constants.SKIN_LIBGDX_UI), new TextureAtlas(Constants.TEXTURE_ATLAS_LIBGDX_UI));
    Table layerBackground = buildBackgroundLayer();
    Table layerControls = buildControlsLayer();
    stage.clear();
    Stack stack = new Stack();
    stack.setFillParent(true);
    stage.addActor(stack);
    stack.setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    stack.add(layerBackground);
    stack.add(layerControls);

}

private Table buildBackgroundLayer() {
    Table layer = new Table();
    imgBackground = new Image(skinSlideIt, "screenshot_slideit");
    layer.add(imgBackground);
    return layer;
}

private Table buildControlsLayer() {
    LabelStyle labelTitleStyle = new LabelStyle(Assets.instance.fonts.titleFont, Color.WHITE);
    LabelStyle labelNormalStyle = new LabelStyle(Assets.instance.fonts.normalFont, Color.WHITE);
    LabelStyle labelNormalGreenStyle = new LabelStyle(Assets.instance.fonts.normalFont, Color.GREEN);
    Table layer = new Table();
    layer.setFillParent(true);
    layer.top().padTop(50);
    Label actualStatisticsTitle = new Label("Actual Game Statistics ", labelTitleStyle);
    String actualStatisticsText1 = 
            "Number of seconds survived: " + statistics.actualGameStatistics.numActualSecondsSurvived +
            "/" + statistics.numSecondsSurvived;
    String actualStatisticsText2 = 
            "Number of waves survived: " + statistics.actualGameStatistics.numActualWavesSurvived +
            "/" + statistics.numWavesSurvived;
    String actualStatisticsText3 =  
            "Number of wall collisions: " + statistics.actualGameStatistics.numActualWallCollisions + 
            "/" + statistics.numWallCollisions;
    String actualStatisticsText4 = 
            "Number of enemy collisions: " + statistics.actualGameStatistics.numActualEnemyCollisions + 
            "/" + statistics.numEnemyCollisions;

    Label actualStatisticsLabel1;
    if (statistics.actualGameStatistics.numActualSecondsSurvived > statistics.numSecondsSurvived) {
        actualStatisticsLabel1 = new Label(actualStatisticsText1, labelNormalGreenStyle);
        statistics.numSecondsSurvived = statistics.actualGameStatistics.numActualSecondsSurvived;
    } else {
        actualStatisticsLabel1 = new Label(actualStatisticsText1, labelNormalStyle);
    }

    Label actualStatisticsLabel2;
    if (statistics.actualGameStatistics.numActualWavesSurvived > statistics.numWavesSurvived) {
        actualStatisticsLabel2 = new Label(actualStatisticsText2, labelNormalGreenStyle);
        statistics.numWavesSurvived = statistics.actualGameStatistics.numActualWavesSurvived;
    } else {
        actualStatisticsLabel2 = new Label(actualStatisticsText2, labelNormalStyle);
    }

    Label actualStatisticsLabel3;
    if (statistics.actualGameStatistics.numActualWallCollisions > statistics.numWallCollisions) {
        actualStatisticsLabel3 = new Label(actualStatisticsText3, labelNormalGreenStyle);
        statistics.numWallCollisions = statistics.actualGameStatistics.numActualWallCollisions;
    } else {
        actualStatisticsLabel3 = new Label(actualStatisticsText3, labelNormalStyle);
    }

    Label actualStatisticsLabel4;
    if (statistics.actualGameStatistics.numActualEnemyCollisions > statistics.numEnemyCollisions) {
        actualStatisticsLabel4 = new Label(actualStatisticsText4, labelNormalGreenStyle);
        statistics.numEnemyCollisions = statistics.actualGameStatistics.numActualEnemyCollisions;
    } else {
        actualStatisticsLabel4 = new Label(actualStatisticsText4, labelNormalStyle);
    }
    statistics.saveGameStatistics();


    Label overallStatisticsTitle = new Label("Overall Game Statistics ", labelTitleStyle);
    String overallStatisticsText = 
            "Number of games played: " + statistics.numGamesPlayed + "\n" +
            "Number of seconds survived: " + statistics.numSecondsPlayedTotal + "\n" +
            "Number of wall collisions: " + statistics.numWallCollisionsTotal + "\n" +
            "Number of enemy collisions: " + statistics.numEnemyCollisionsTotal;

    Label overallStatisticsLabel = new Label(overallStatisticsText, labelNormalStyle);

    TextButton playButton = new TextButton(" Play ", skinLibgdx);
    playButton.addListener(new ChangeListener() {
        @Override
        public void changed(ChangeEvent event, Actor actor) {
            myRequestHandler.showAds(false);
            game.setScreen(new GameScreen(game, myRequestHandler));
        }
    });

    TextButton resetButton = new TextButton(" Reset ", skinLibgdx);
    resetButton.addListener(new ChangeListener() {
        @Override
        public void changed(ChangeEvent event, Actor actor) {
            statistics.actualGameStatistics.numActualEnemyCollisions = 0;
            statistics.actualGameStatistics.numActualSecondsSurvived = 0;
            statistics.actualGameStatistics.numActualWallCollisions = 0;
            statistics.actualGameStatistics.numActualWavesSurvived = 0;
            statistics.numEnemyCollisions = 0;
            statistics.numEnemyCollisionsTotal = 0;
            statistics.numGamesPlayed = 0;
            statistics.numSecondsPlayedTotal = 0;
            statistics.numSecondsSurvived = 0;
            statistics.numWallCollisions = 0;
            statistics.numWallCollisionsTotal = 0;
            statistics.numWavesSurvived = 0;
            statistics.saveGameStatistics();
            rebuildStage();
        }
    });

    layer.add(actualStatisticsTitle);
    layer.add(playButton);
    layer.row();
    layer.add(actualStatisticsLabel1);
    layer.row();
    layer.add(actualStatisticsLabel2);
    layer.row();
    layer.add(actualStatisticsLabel3);
    layer.row();
    layer.add(actualStatisticsLabel4);
    layer.row();
    layer.add(overallStatisticsTitle);
    layer.add(resetButton);
    layer.row();
    layer.add(overallStatisticsLabel);

    return layer;
}

@Override
public void render(float deltaTime) {
    Gdx.gl.glClearColor(0, 0, 0, 0);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    stage.act(deltaTime);
    stage.draw();
}

@Override
public void resize(int width, int height) {
    stage.getViewport().update(width, height, false);
}

@Override
public void show() {
    stage = new Stage(new ExtendViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()));
    Gdx.input.setInputProcessor(stage);
    rebuildStage();
    myRequestHandler.showAds(true);
}



@Override
public void hide() {
    stage.dispose();
    skinSlideIt.dispose();
    skinLibgdx.dispose();
}

@Override
public void pause() {
    // TODO Auto-generated method stub

}

@Override
public void resume() {
    // TODO Auto-generated method stub

}

@Override
public void dispose() {
    // TODO Auto-generated method stub

}

}

字体中的源纹理对于正在测试的LG手机的低分辨率屏幕来说太大。有几种方法可以解决这个问题。以下是两个备选方案:

  • 创建分辨率较小的字体,并将其加载到具有低分辨率屏幕的设备上
  • 使用ExtendViewport,但不要将
    getHeight()
    getWidth()
    中的实际屏幕尺寸传递给构造函数。相反,为它提供使整个UI显示所需的最小尺寸。它将缩小以适应较小的屏幕。您可能需要将字体上的最小过滤器设置为mipmaplinearNet或MipMapLinearLinear。第二种选择在更广泛的设备上看起来更好,但可能会导致帧速率下降。mag滤波器需要是线性的

StretchViewport对我更有效。真正的诀窍是使用其他尺寸的宽度/高度。我在桌面项目中使用了800x600,这导致了奇怪的行为。对于min filter,我也使用了Linear,因为另一个没有使用Linear。感谢您的帮助:-)StretchViewport在宽高比不同于您正在测试的设备上可能看起来很奇怪,因为UI将被扭曲。如果不使用mipmapping,在分辨率较低的设备上可能会影响性能,或者至少文本看起来不清晰。