35

我正在开发一个 libGDX(LWJGL 之上的库)游戏项目,并使用来自几个不同工作站的 Intellij IDEA IDE:

  • Windows 7 x64 笔记本电脑,带有两个显示器(1920x1080 和 1600x1200),nVidia GT540M。
  • 笔记本电脑上的 Ubuntu 12.04 LTS,单显示器 (1366x768),英特尔集成显卡。
  • 具有两个显示器(1920x1080 和 1280x1024)的桌面上的 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() 的调用返回了覆盖两个显示器所需的矩形大小,在我的例子中是 3200x1080,但是当我告诉我的游戏全屏运行,它只使用其中一个显示器,所以相机设置为 1920x1080,但我的相机移动和平铺地图平移认为他们有 3200x1080 可以使用,这使得事情扭曲和无法使用(因为角色可以走开屏幕右侧)。

我猜我的问题实际上来自 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 的建议,将 LWJGL 引用置于问题之中,因为提供显示模式列表的似乎是 LWJGL。

谢谢!

4

8 回答 8

1

我会避免单独使用Toolkit.getDefaultToolkit()和使用libgdxlwjgl.util.Display.getAvailableDisplayModes()描述的方法。

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

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

于 2013-09-03T13:11:05.550 回答
1
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());
}
于 2013-08-31T19:52:21.193 回答
0

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

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);
}

让我知道它是否对您有用。

于 2014-09-13T00:40:42.223 回答
0

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

从文档中:

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

例如:

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

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

舞台.show();"

还有许多其他方法(getBounds(), getDpi(), getScreens()等)也可能对您非常有用。

于 2013-08-13T22:03:12.877 回答
0

也许获取您当前使用的显示器的尺寸,因此在不同尺寸的显示器上,只需获取尺寸即可。对于不同尺寸的显示器,您可能需要做不同的事情。

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

希望这会有所帮助,如果不是 gl

于 2013-09-09T21:46:21.720 回答
0

我会避免完全使用 lwjgl。表面上看起来很简单,但是当您尝试添加更高级的功能时,您会意识到 OpenGL 的包装器不会为您提供该功能,或者它会使程序慢 3 倍。我建议转向 c++ 和 OpenGL(如果这是一个选项)。你会惊讶于它的简单性。否则,跨平台库通常确实存在这些故障。要解决您的问题,您需要停止依赖库来确定您的视口分辨率。相反,请枚举所有可能的显示模式并根据您选择最好的一种。这将导致更多定义的行为,并且比使用看起来像是魔术的默认配置更容易调试。一般来说,您希望始终确保您知道您正在使用什么数据。更糟糕的是,我刚刚注意到您在包装器上使用了包装器。这过于复杂,并且会减慢渲染速度,远远超出您的想象(平均 20 倍)。

于 2013-09-10T05:13:50.553 回答
0

这里

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

您会发现 lwjgl 为您的桌面选择合适的全屏显示模式的便捷方法。您也可以使用相同的方法来确定分辨率,并在以后将其用于您的 gl ops。

于 2014-03-18T06:17:54.447 回答
-2

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

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

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

于 2014-04-23T12:47:30.773 回答