如何在调整大小后使用LWJGL3在LibGDX中居中窗口

时间:2017-10-26 09:09:32

标签: java libgdx lwjgl

我有一个需要居中的未修饰窗口,使用此配置:

Lwjgl3ApplicationConfiguration configuration = Lwjgl3ApplicationConfiguration()
configuration.setIdleFPS(60)
configuration.setBackBufferConfig(8,8,8,8,16,0,0)
configuration.setWindowedMode(1920,1080)
configuration.setTitle("Title")
configuration.setDecorated(false)
configuration.setResizable(false)

稍后,在app中,通过选项,您可以使用从特定宽高比定义的预设更改窗口大小。调整大小是通过以下调用进行的:

Gdx.graphics.setWindowedMode(width, height)

这似乎使窗口保持在其原始的左上角位置(可以在屏幕上的随机位置),但我希望它在显示器上居中,或者将窗口移动到任何所需位置的方式随意。

问题: 使用SetWindowedMode()

更改窗口大小时,如何保持LibGDX创建的窗口和LWJGL3Application居中

1 个答案:

答案 0 :(得分:2)

@ Tenfour04在回答下面的旧答案时表示你可以用

获取LWJGL3Window实例
Lwjgl3Window window = ((Lwjgl3Graphics)Gdx.graphics).getWindow();

然后,您可以使用它在调整大小事件期间设置位置,例如

window.setWindowPos(x, y)

旧答案:

我通过反思来解决这个问题

public void setWindowSize(int width, int height) {
  Lwjgl3Application app = (Lwjgl3Application) Gdx.app
  Field windowfield = app.class.getDeclaredField("currentWindow")
  if(windowfield.trySetAccessible()) {
    Lwjgl3Window window = windowfield.get(app)
    Gdx.graphics.setWindowedMode(width, height)
    // Can use context size because of no decorations on window
    window.setWindowPos(Gdx.graphics.width/2 - width/2, Gdx.graphics.height/2 - height/2)
  }
}

警告:尽管这有效,但这不是一个好的解决方案。该类的字段由于某种原因而保持私有,并且不将其暴露给API意味着它可以在任何更新时更改,从而使您陷入混乱。

话虽这么说,我正在为像我这样绝望的人发布这个解决方案,因为我不确定还有另一个合适的解决方案。我会急切地等待一个更好的解决方案。