Java和libGDX / LWJGL游戏全屏错误的大小在Ubuntu上的多个显示器

我正在研究libGDX(LWJGL之上的库)游戏项目,并从几个不同的工作站使用Intellij IDEA IDE:

  • 带有两个显示器(1920×1080和1600×1200)的Windows 7 x64笔记本电脑,nVidia GT540M。
  • 英特尔集成显卡(1366×768)的笔记本电脑上的Ubuntu 12.04 LTS。
  • 带有两个显示器(1920×1080和1280×1024)的桌面上的Ubuntu 12.04 LTS,nVidia GTS 450。

我在Ubuntu盒子上使用OpenJDK for Java 6,在Windows上使用Sun / Oracle Java 6(我听说Java 6是用于Android兼容性的)。

全屏运行时:

  • Windows 7笔记本电脑:工作正常。
  • Ubuntu笔记本电脑:工作正常。
  • Ubuntu桌面:背景图像放大显示,只有一部分适合在屏幕上。 +

进一步看,我看到Gdx.graphics.getHeight()和Gdx.graphics.getWidth()的调用返回需要覆盖这两个显示矩形的大小,在我的情况下是3200×1080,但是当我告诉我的游戏运行全屏,它只使用其中一个显示器,所以相机设置为1920×1080,但我的相机移动和平铺地图平移认为他们有3200×1080的工作,使事情扭曲和无法使用(因为angular色可以走开屏幕右侧)。

我猜我的问题实际上来自awt.Toolkit的getScreenSize()调用所返回的大小,但是我不知道如何更深入地询问它,以获得当我全屏时实际使用的屏幕大小。

我的DesktopStarter获取屏幕大小并设置全屏,如下所示:

LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration(); Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize(); cfg.width = screenDimension.width; cfg.height = screenDimension.height; cfg.fullscreen = true; new LwjglApplication(new Game1(), cfg); 

是否有一个解决方法来获得“全屏”将实际启动的显示器的高度/宽度?

所以我看到的麻烦是执行game.jar文件,退出游戏,然后重复执行,导致Gdx.graphics.getDisplayModes()返回的模式列表中显示不同的显示模式 – 正如PT指出的那样,这是LWJGL的Display.getAvailableDisplayModes()一个薄包装。 为什么发生这种情况? 为什么在Ubuntu的后续运行中会出现不同的模式?

编辑:每PT的build议,把LWJGL引用的问题,因为它似乎是LWJGL提供了显示模式的列表。

谢谢!

我会避免使用Toolkit.getDefaultToolkit()并只使用lwjgl.util.Display.getAvailableDisplayModes()或libgdx描述的方法。

一旦你build立了一个全屏窗口,获取它的大小(如果你的设置方法还不知道),只能使用这个信息。

如果Display.getAvailableDisplayModes()在不同的执行中改变其sorting顺序,只需重新sorting它们并使用最大的可用或使用标准的一个,并提供游戏中的设置来改变它们。

 GraphicsDevice monitors[]=GraphicsEnvironment.getScreenDevices(); Dimension screen_resolution[monitors.length]; for (int monitorID = 0; monitorID < monitors.length; monitorID++) { screen_resolution[monitorID] = new Dimension(monitors[monitorID].getDisplyMode().getWidth(),monitors[monitorID].getDisplyMode().getHeight()); } 

您可以使用javafx.stage.screen来解决这个问题,但是如果您坚持使用Java 6,或者升级到Java 7(它包含在Java 7 SDK中),您必须添加JavaFX。

从文档:

“描述一个graphics目标(如显示器)的特性在一个虚拟设备的多屏幕环境中,桌面区域可以跨越多个物理屏幕设备,屏幕对象的边界是相对于Screen.primary。

例如:

Rectangle2D primaryScreenBounds = Screen.getPrimary()。getVisualBounds();

//将Stage边界设置为主屏幕的可见边界stage.setX(primaryScreenBounds.getMinX()); stage.setY(primaryScreenBounds.getMinY()); stage.setWidth(primaryScreenBounds.getWidth()); stage.setHeight(primaryScreenBounds.getHeight());

stage.show();”

有许多其他的方法( getBounds(), getDpi(), getScreens()等),这也可能是非常有用的。

也许得到你当前使用的显示器的尺寸,所以在不同尺寸的显示器上,只需获得尺寸。 对于不同尺寸的显示器,您可能需要采取不同的操作。

也许背景图像被放大,因为它认为它仍然在其他屏幕上工作。

希望这有助于,如果不是gl

我会避免完全使用lwjgl。 表面看起来似乎很简单,但是当你尝试添加更多的高级特性时,你会发现OpenGL的封装不会给你提供这样的function,或者会让程序慢3倍。 我build议迁移到C ++和OpenGL(如果这是一个选项)。 你会惊讶于它的简单性。 否则,跨平台的库通常会有这样的毛病。 要解决您的问题,您需要停止依靠库来确定您的视口分辨率。 相反,列举所有可能的显示模式,并根据你select最好的一个。 这将导致定义更多的行为,比使用默认的configuration更容易debugging。 一般来说,你要确保你知道你使用的是什么数据。 更糟糕的是,我只注意到你正在使用一个包装器的包装。 这太过复杂,并会减慢渲染更多,你可以想像(平均20倍)。

这里

http://www.lwjgl.org/wiki/index.php?title=LWJGL_Basics_5_%28Fullscreen%29

你会发现一个方便的方法来为你的桌面select一个合适的全屏显示模式。 您可以使用相同的方法来确定分辨率,并在以后使用它。

我不确定,但它对我有效。 只需在“开始”游戏之后设置大小,如下面的代码所示:

 public static void main(String[] args) { LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration(); cfg.title = "Palmeiras!!"; cfg.vSyncEnabled = false; cfg.forceExit = true; cfg.allowSoftwareMode = true; new LwjglApplication(new Palmeiras(null), cfg); Gdx.graphics.setDisplayMode(Gdx.graphics.getDesktopDisplayMode().width, Gdx.graphics.getDesktopDisplayMode().height, true); } 

让我知道,如果它为你工作。

我会避免使用Toolkit.getDefaultToolkit(),并只使用lwjgl.util.Display.getAvailableDisplayModes()或libgdx描述的方法。

一旦你build立了一个全屏窗口,获取它的大小(如果你的设置方法还不知道),只能使用这个信息。

如果Display.getAvailableDisplayModes()在不同的执行中改变其sorting顺序,只需重新sorting它们并使用最大的可用或使用标准的一个,并提供游戏中的设置来改变它们。