我正在开发一个libGDX(LWJGL上的库)游戏项目,并使用来自几个不同工作站的Intellij IDEA IDE:
我在Ubuntu盒子上使用OpenJDK for Java 6,在Windows盒子上使用Sun / Oracle Java 6(我听说Java 6是用于Android兼容性的那个)。
全屏运行时:
进一步研究,我看到对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的后续运行中会出现一组不同的模式?
编辑:根据P.T.的建议,将LWJGL引用置于问题,因为似乎是LWJGL提供了显示模式列表。
谢谢!
答案 0 :(得分: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());
}
答案 1 :(得分:1)
我会避免使用Toolkit.getDefaultToolkit()
并仅使用lwjgl.util.Display.getAvailableDisplayModes()
或libgdx描述的方法。
设置全屏窗口后,获取其大小(如果您的设置方法尚不知道)并且仅使用此信息。
如果Display.getAvailableDisplayModes()
在不同的执行中更改了排序顺序,只需对其进行重新排序并使用最大的排序或使用标准排序,并提供游戏内设置以更改它们。
答案 2 :(得分:0)
您可以使用javafx.stage.screen
来解决此问题,但如果您坚持使用Java 6,或者升级到Java 7(它包含在Java 7 SDK中),则必须添加JavaFX。
来自文档:
“描述图形目的地的特征,例如 监控。在虚拟设备的多屏环境中 桌面区域可以跨越多个物理屏幕设备,边界 Screen对象的相对于Screen.primary。
例如:
Rectangle2D primaryScreenBounds = 。Screen.getPrimary()getVisualBounds();
//将舞台边界设置为主屏幕的可见边界 stage.setX(primaryScreenBounds.getMinX()); stage.setY(primaryScreenBounds.getMinY()); stage.setWidth(primaryScreenBounds.getWidth()); stage.setHeight(primaryScreenBounds.getHeight());
stage.show();“
还有其他各种方法(getBounds(), getDpi(), getScreens()
等)也可能对您非常有用。
答案 3 :(得分:0)
也许获取您当前使用的显示器的尺寸,因此在不同尺寸的显示器上,只需获取尺寸。对于不同大小的显示器,您可能需要采取不同的操作。
可能背景图片因为认为它仍然在其他屏幕上工作而放大了。
希望这有帮助,如果不是gl
答案 4 :(得分:0)
我完全不使用lwjgl。表面看起来似乎很简单,但是当你尝试添加更高级的功能时,你会发现OpenGL上的包装器不会给你这个功能,或者它会让程序慢3倍。我建议进入c ++和OpenGL(如果这是一个选项)。你会对它的简洁感到惊讶。 否则,跨平台库通常会出现这些类型的故障。要解决您的问题,您需要停止依赖库来确定视口分辨率。相反,通过所有可能的显示模式进行枚举,并根据您选择最佳模式。这将导致更多定义的行为,并且比使用默认配置更容易调试,默认配置看起来好像是魔术。通常,您希望始终确定您知道正在使用的数据。更糟糕的是,我只是注意到你在包装器上使用了包装器。这会使渲染变得过于复杂并且会减慢渲染速度(平均为20倍)。
答案 5 :(得分:0)
这里
http://www.lwjgl.org/wiki/index.php?title=LWJGL_Basics_5_%28Fullscreen%29
您将找到一种方便的方法,让lwjgl为您的桌面选择合适的全屏显示模式。您也可以使用相同的方法来确定分辨率,并在以后将其用于gl ops。
答案 6 :(得分:0)
我不确定,但它对我有用。只需在&#34; start&#34;之后设置大小。游戏,如下面的代码:
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);
}
让我知道它是否适合你。
答案 7 :(得分:-1)
我会避免使用Toolkit.getDefaultToolkit()并仅使用lwjgl.util.Display.getAvailableDisplayModes()或libgdx描述的方法。
设置全屏窗口后,请获取其大小(如果您的设置方法不知道),并仅使用此信息。
如果Display.getAvailableDisplayModes()在不同的执行中更改其排序顺序,只需重新排序它们并使用最大的可用或使用标准的并提供游戏内设置来更改它们。