首页 > 解决方案 > 视口在 libgdx 中如何工作以及如何正确设置它?

问题描述

我正在学习 libgdx 的使用,我对视口以及对象在屏幕上的排列方式感到困惑。假设我的 2D 世界是 2x2 单位宽和高。现在我创建一个视口为 1x1 的相机。所以我应该看到我世界的 25%。通常显示器不是方形的。所以我希望 libgdx 能够挤压和拉伸这个正方形以适应显示器。

对于横向滚动条,您可以将视口高度设置为与世界高度相同,并根据纵横比调整视口宽度。与显示器的纵横比无关,您始终可以看到整个世界的高度,但在 x 轴上有不同的扩展。显示器宽于高的人可以在 x 轴上比方形显示器的人看得更远。但是比例会保持不变,不会失真。到目前为止,我认为我掌握了视口逻辑的工作原理。

我正在使用“Learning LibGDX Game Development”一书,您可以在其中开发游戏“canyon bunny”。源代码可以在这里找到:

峡谷兔子 - GitHub

在 WorldRenderer 类中,您可以找到相机的初始化:

private void init() {
        batch = new SpriteBatch();
        camera = new OrthographicCamera(Constants.VIEWPORT_WIDTH, Constants.VIEWPORT_HEIGHT);
        camera.position.set(0, 0, 0);
        camera.update();
    }

视口常量保存在单独的常量类中:

    public class Constants {
        // Visible game world is 5 meters wide
        public static final float VIEWPORT_WIDTH = 5.0f;
        // Visible game world is 5 meters tall
        public static final float VIEWPORT_HEIGHT = 5.0f;
    }

如您所见,视口为 5x5。但是游戏对象在我的手机上具有正确的比例(16:9),即使在桌面上,当您更改窗口大小时,游戏也会保持正确的比例。我不明白为什么。我预计游戏会尝试将世界的方形切口绘制到矩形显示器上,这会导致失真。为什么不是这样?为什么你不需要调整视口的宽度或高度来适应纵横比?

标签: cameralibgdxviewport

解决方案


该行:

cameraGUI.setToOrtho(true);

覆盖您在调用时提供的值:

cameraGUI = new OrthographicCamera(Constants.VIEWPORT_GUI_WIDTH, Constants.VIEWPORT_GUI_HEIGHT);

这是 LibGDX 代码,它显示了您设置的视口大小被忽略的原因/方式:

/** Sets this camera to an orthographic projection using a viewport fitting the screen resolution, centered at
     * (Gdx.graphics.getWidth()/2, Gdx.graphics.getHeight()/2), with the y-axis pointing up or down.
     * @param yDown whether y should be pointing down */
    public void setToOrtho (boolean yDown) {
        setToOrtho(yDown, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    }

    /** Sets this camera to an orthographic projection, centered at (viewportWidth/2, viewportHeight/2), with the y-axis pointing up
     * or down.
     * @param yDown whether y should be pointing down.
     * @param viewportWidth
     * @param viewportHeight */
    public void setToOrtho (boolean yDown, float viewportWidth, float viewportHeight) {
        if (yDown) {
            up.set(0, -1, 0);
            direction.set(0, 0, 1);
        } else {
            up.set(0, 1, 0);
            direction.set(0, 0, -1);
        }
        position.set(zoom * viewportWidth / 2.0f, zoom * viewportHeight / 2.0f, 0);
        this.viewportWidth = viewportWidth;
        this.viewportHeight = viewportHeight;
        update();
    }

所以你需要这样做:

cameraGUI.setToOrtho(true, Constants.VIEWPORT_GUI_WIDTH, Constants.VIEWPORT_GUI_HEIGHT);

也不要忘记update()在您更改相机的位置或视口尺寸(或其他属性)之后立即调用


推荐阅读