libGDX:FitViewport中对象的大小失真

时间:2017-03-20 19:40:15

标签: java android libgdx

我的目标是使用FitViewport创建一个总是以9:16(基本上是16:9,但直立)的宽高比显示的游戏;它应该与目标设备的分辨率无关。为了测试这个设置,我创建了以下最小的工作示例。一个小的绿色方块表示坐标系的原点:

MyGame.java

public class MyGame extends ApplicationAdapter {

    final int WORLD_WIDTH = 900;
    final int WORLD_HEIGHT = 1600;
    Stage stage;
    Viewport vp;        

    public void create() {
        stage = new Stage();
        vp = new FitViewport(WORLD_WIDTH, WORLD_HEIGHT, stage.getCamera());
        stage.setViewport(vp);
        stage.addActor(new MySquare());
    }

    public void render() {
        stage.act();
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        stage.draw();
    }

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

    // dispose...
}

MySquare.java

public class MySquare extends Actor {
    ShapeRenderer renderer = new ShapeRenderer();
    @Override
    public void draw(Batch batch, float alpha){
        batch.end();
        renderer.begin(ShapeRenderer.ShapeType.Filled);
        renderer.setColor(Color.GREEN);
        renderer.rect(0, 0, 50, 50);
        renderer.end();
        batch.begin();
    }
}

不幸的是,结果并不像预期的那样:正如您所看到的,绿色方块实际上不是正方形。对于Windows和Android,这种行为都是相同的(在横向模式下):

enter image description here

,当通过LwjglApplicationConfiguration中的DesktopLauncher.java以编程方式明确设置窗口大小为有效的9:16分辨率时,绿色方块会正确显示。为什么这样,我怎么能避免这种解决方法(这对Android无效)?

1 个答案:

答案 0 :(得分:2)

您的问题是您的形状渲染器忽略了相机。像这样更新:

public void draw(Batch batch, float alpha){
    batch.end();
    renderer.setProjectionMatrix(batch.getProjectionMatrix()); // <<<<< Add this
    renderer.begin(ShapeRenderer.ShapeType.Filled);
    renderer.setColor(Color.GREEN);
    renderer.rect(0, 0, 50, 50);
    renderer.end();
    batch.begin();
}

如果您计划最终使用精灵,并且您只想为您的演员设置矩形占位符,那么您不需要自定义角色。您可以使用通用Actor并在其上调用setDebug(true),并且Stage将使用内部ShapeRenderer自动绘制其轮廓。当然,您必须先在Actor上设置大小和位置。