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它们并使用最大的可用或使用标准的一个,并提供游戏中的设置来改变它们。