【问题标题】:How does the viewport work in libgdx and how to set it up correctly?视口在 libgdx 中如何工作以及如何正确设置它?
【发布时间】:2020-03-23 12:07:08
【问题描述】:

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

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

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

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),即使在桌面上,当您更改窗口大小时,游戏也会保持正确的比例。我不明白为什么。我预计游戏会尝试将世界的方形切口绘制到矩形显示器上,这会导致失真。为什么不是这样?为什么不需要调整视口的宽度或高度来适应纵横比?

【问题讨论】:

  • 显然 VIEWPORT_WIDTH 的改变根本不会改变游戏的外观。 VIEWPORT_WIDTH = 100 和 VIEWPORT_WIDTH = 1 的游戏看起来相同。对我来说没有意义。 VIEWPORT_HEIGHT 确实改变了外观。
  • 这可能会有所帮助:stackoverflow.com/q/40059360/506796

标签: camera libgdx viewport


【解决方案1】:

行:

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()

【讨论】:

  • 感谢您的回复,但我的问题不是指“cameraGUI”而是指“相机”。我编辑了我的问题并删除了所有与 cameraGUI 相关的内容。
【解决方案2】:

我找到了原因。如果您查看 worldRenderer 类,则有一个方法 resize()。在这种方法中,视口适应纵横比。我只是想知道,因为直到现在我认为 resize 方法仅在调整窗口大小时才被调用。显然它也在启动时被调用。谁能澄清一下?

【讨论】:

  • 将断点放在你的resize方法中,检查它是否被调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 2014-06-10
  • 2014-04-02
相关资源
最近更新 更多