首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在libgdx中视窗是如何工作的,以及如何正确地设置它?

在libgdx中视窗是如何工作的,以及如何正确地设置它?
EN

Stack Overflow用户
提问于 2020-03-23 20:07:09
回答 2查看 147关注 0票数 0

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

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

我正在写一本书“学习LibGDX游戏开发”,在这本书中,你开发了游戏“峡谷兔”。源代码可以在这里找到:

Canyon Bunny - GitHub

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

代码语言:javascript
复制
private void init() {
        batch = new SpriteBatch();
        camera = new OrthographicCamera(Constants.VIEWPORT_WIDTH, Constants.VIEWPORT_HEIGHT);
        camera.position.set(0, 0, 0);
        camera.update();
    }

视口常量保存在单独的constants -Class中:

代码语言:javascript
复制
    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),即使在桌面上,当你改变窗口大小时,游戏也会保持正确的比例。我不明白为什么。我希望这个游戏尝试在一个长方形的显示器上绘制一个方形的世界,这会导致扭曲。为何不是这样呢?为什么不需要调整视口的宽度或高度以适应纵横比?

EN

回答 2

Stack Overflow用户

发布于 2020-03-23 23:31:40

这行代码:

代码语言:javascript
复制
cameraGUI.setToOrtho(true);

覆盖您在调用时给出的值:

代码语言:javascript
复制
cameraGUI = new OrthographicCamera(Constants.VIEWPORT_GUI_WIDTH, Constants.VIEWPORT_GUI_HEIGHT);

下面的LibGDX代码显示了为什么/如何忽略您设置的视口大小:

代码语言:javascript
复制
/** 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();
    }

因此,您需要改为执行以下操作:

代码语言:javascript
复制
cameraGUI.setToOrtho(true, Constants.VIEWPORT_GUI_WIDTH, Constants.VIEWPORT_GUI_HEIGHT);

此外,不要忘记在更改摄影机的位置或视口尺寸(或其他属性)后立即调用update()

票数 0
EN

Stack Overflow用户

发布于 2020-03-24 23:35:06

我找到原因了。如果您查看一下worldRenderer类,就会发现有一个resize()方法。在此方法中,视口根据纵横比进行调整。我只是想知道,因为到目前为止,我认为resize方法只在调整窗口大小时调用。显然,它在启动时也被称为。有谁能澄清一下吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60813275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档