默认情况下,在libgdx中使用视口的stage的表元素显示在屏幕右上角,而不是中间

默认情况下,在libgdx中使用视口的stage的表元素显示在屏幕右上角,而不是中间,libgdx,viewport,stage,Libgdx,Viewport,Stage,我正在使用屏幕 当我在我的阶段使用表格类时,我想在屏幕的左上角显示我的表格,但默认情况下它显示在屏幕的右上角 调用tableLeft.left()会将我的表格移动到屏幕的顶部中间。使用tableft.top()将选项卡完全移出屏幕。 如果我不使用任何视口,它工作得非常好,但我会遇到其他问题 还要注意的是,我已经读了大约两个星期关于相机和视点的书,我仍然对它的工作原理感到非常困惑,即使像维基上所有的官方libgdx教程一样阅读了,并且阅读了所有关于它的东西,我可以用谷歌搜索。例如,我不知道为什么我

我正在使用
屏幕

当我在我的
阶段使用
表格
时,我想在屏幕的左上角显示我的
表格
,但默认情况下它显示在屏幕的右上角

调用
tableLeft.left()
会将我的表格移动到屏幕的顶部中间。使用
tableft.top()
将选项卡完全移出屏幕。 如果我不使用任何视口,它工作得非常好,但我会遇到其他问题

还要注意的是,我已经读了大约两个星期关于相机和视点的书,我仍然对它的工作原理感到非常困惑,即使像维基上所有的官方libgdx教程一样阅读了,并且阅读了所有关于它的东西,我可以用谷歌搜索。例如,我不知道为什么我可以从resize()方法中删除所有内容,并且输出完全不变

我的代码如下所示:

@Override
public void show() {
    ....
    camera = new OrthographicCamera(1920, 1080);
    viewport = new FitViewport(1920, 1080, camera);
    viewport.apply();
    ....
    batch = new SpriteBatch();
    ....
    stage = new Stage(viewport, batch);

    Table tableLeft = new Table();
    tableLeft.add(new Label("Dummy Label", skin, "default"));
    stage.addActor(tableLeft);
    .....
}

    @Override
    public void resize(int width, int height) { 
        viewport.update(width, height, true);
        stage.getViewport().update(width, height, true);
        camera.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2, 0);
    }

我想您不需要手动更新视口或居中摄影机:

viewport.update(width, height, true);
camera.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2, 0);
因为

stage.getViewport().update(width, height, true);
在您的案例中已经这样做了:

/** Configures this viewport's screen bounds using the specified screen size and calls {@link #apply(boolean)}. Typically called
 * from {@link ApplicationListener#resize(int, int)} or {@link Screen#resize(int, int)}.
 * <p>
 * The default implementation only calls {@link #apply(boolean)}. */
public void update (int screenWidth, int screenHeight, boolean centerCamera) {
    apply(centerCamera);
}

/** Applies the viewport to the camera and sets the glViewport.
* @param centerCamera If true, the camera position is set to the center of the world. */
public void apply (boolean centerCamera) {
    Gdx.gl.glViewport(screenX, screenY, screenWidth, screenHeight);
    camera.viewportWidth = worldWidth;
    camera.viewportHeight = worldHeight;
    if (centerCamera) camera.position.set(worldWidth / 2, worldHeight / 2, 0);
    camera.update();
}
/**使用指定的屏幕大小配置此视口的屏幕边界,并调用{@link#apply(boolean)}。通常称为
*来自{@link ApplicationListener#resize(int,int)}或{@link Screen#resize(int,int)}。
*
*默认实现只调用{@link#apply(boolean)}*/
公共无效更新(整数屏幕宽度、整数屏幕高度、布尔中心摄影机){
应用(中心摄像机);
}
/**将视口应用于摄影机并设置视口。
*@param centerCamera如果为真,则相机位置设置为世界中心*/
公共无效应用(布尔中心摄影机){
Gdx.gl.glViewport(screenX、screenY、screenWidth、screenHeight);
camera.viewportWidth=世界宽度;
camera.viewportHeight=世界高度;
if(中心摄像头)摄像头位置设置(worldWidth/2,worldHeight/2,0);
camera.update();
}