【问题标题】:LibGDX FitViewport doesn't fit itself on construction, but it does on resizeLibGDX FitViewport 不适合自己的构造,但它适合调整大小
【发布时间】:2015-06-21 09:27:53
【问题描述】:

我绞尽脑汁想弄清楚这里发生了什么...我正在使用 FitViewport,它在我调整屏幕大小时工作得很好,但是当它在构造函数中首次创建时它不适合自己像它应该的那样进入屏幕(就像我调整大小时一样)。

这是我的构造函数和 resize() 方法的代码:

public class UpgradesScreen implements Screen {

    private ScreenHandler sh;

    private OrthographicCamera cam;
    private Viewport viewport;

    public UpgradesScreen(ScreenHandler sh) {

        Gdx.app.log("UpgradesScreen", "Attached");

        this.sh = sh;

        cam = new OrthographicCamera();
        cam.setToOrtho(true, sh.V_WIDTH, sh.V_HEIGHT);

        viewport = new FitViewport(sh.V_WIDTH, sh.V_HEIGHT, cam);
        viewport.update(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

    }

    @Override
    public void resize(int width, int height) {
        Gdx.app.log("UpgradesScreen", "resizing");
        viewport.update((int) width, (int) height);
    }

我已经检查以确保 Gdx.graphics.getWidth() 给出的数字与我调整屏幕大小时 resize() 方法接收到的 'width' 参数相同(同样使用 'height' 值)。

据我所知,视口在构造函数期间的行为应该与我调整大小时的行为完全相同。那么为什么它很固执,不更新以适应呢?

这是我调整大小后的样子:

...这是第一次创建屏幕时的样子,在手动调整窗口大小之前:

【问题讨论】:

  • 注意:我尝试添加 viewport.update(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());插入 show() 方法以防万一……没有任何区别。
  • 你能显示你的绘图代码吗?
  • 它相当广泛,但并不真正相关。它只是在 960 和 600 的虚拟宽度和高度内使用标准坐标,当调整窗口大小时,FitViewport 会完美地呈现它。问题只是 FitViewport 在首次创建时没有被更新或应用,所以我需要弄清楚为什么以及如何让它这样做。

标签: java libgdx viewport window-resize


【解决方案1】:

您正在创建一个新的 Viewport 对象,该对象在开始时根本没有被使用。

打电话

viewport.apply();

在你的draw call之前。


另外,resize 方法默认在启动时调用。使用它来初始化游戏对象而不是构造函数。


编辑:
看看LibGDX Lifecycle

resize 总是在 render 之前调用。在开始和之后不应该有不同的行为。那是你的根本问题。尝试先修复它。

【讨论】:

  • 嗯,我应该把它放在哪里?我在初始化后立即将 .replace() 行更改为 .apply() ,它仍然在做同样的事情。
  • 在你的draw调用之前调用apply方法。
  • 嗯好吧..似乎将 .apply() 放在 render() 方法中会引起很多冗余开销,因为它只需要在第一个循环上执行 .apply() .与此同时,我将它包装在一个运行时会切换的布尔值中,因此不是每秒执行 .apply() 60 次,而是进行布尔检查,尽管我觉得应该有一种更优雅的方式确保 .apply() on 在第一次运行时发生。
  • 无论如何感谢您的建议。在 render() 循环中有 .apply() 确实可以解决问题:)
  • "resize 总是在渲染之前调用。开始和之后不应该有不同的行为。这是你的根本问题。先尝试修复它。" -- 确切地说,在不手动调整窗口大小的情况下如何阻止 resize() 被调用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
相关资源
最近更新 更多