Java и libGDX/LWJGL игра полноэкранный размер неправильного размера для нескольких мониторов на Ubuntu

Я работаю над проектом игры libGDX (библиотека поверх LWJGL) и использую IDE Intellij IDEA с нескольких разных рабочих станций:

  • Ноутбук Windows 7 x64 с двумя дисплеями (1920x1080 и 1600x1200), nVidia GT540M.
  • Ubuntu 12.04 LTS на ноутбуке с одним дисплеем (1366x768), интегрированной графикой Intel.
  • Ubuntu 12.04 LTS на рабочем столе с двумя дисплеями (1920x1080 и 1280x1024), nVidia GTS 450.

Я использую OpenJDK для Java 6 в блоках Ubuntu и Sun/Oracle Java 6 в окне Windows (я слышал, что Java 6 был тем, который использовался для совместимости с Android).

При работе в полноэкранном режиме:

  • Ноутбук Windows 7: отлично работает.
  • Ноутбук Ubuntu: отлично работает.
  • Рабочий стол Ubuntu: фоновое изображение отображается увеличенным, и только часть его подходит на экране. +

Внимательно изучая это, я вижу, что вызовы Gdx.graphics.getHeight() и Gdx.graphics.getWidth() возвращают размер прямоугольника, необходимого для покрытия обоих дисплеев, в моем случае 3200x1080, но когда я говорю моя игра для запуска полноэкранного режима, она использует только один из дисплеев, поэтому камеры устанавливаются на 1920x1080, но мое движение камеры и панорамирование карты Tiled считают, что у них есть 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, как представляется, предоставляет список режимов отображения.

Спасибо!

8 ответов

Я бы воздержался от использования Toolkit.getDefaultToolkit() и использовал исключительно lwjgl.util.Display.getAvailableDisplayModes() или метод, описанный libgdx.

Как только вы настроите полноэкранное окно, выберите его размер (если ваш метод настройки еще этого не знает) и используйте эту информацию только с этой страницы.

Если Display.getAvailableDisplayModes() изменяет порядок сортировки в разных исполнениях, просто повторно сортируйте их и используйте самый большой доступный или используйте стандартный и обеспечить настройки в игре, чтобы изменить их.


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


Здесь

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

вы найдете удобный метод для lwjgl, чтобы выбрать подходящий полноэкранный режим отображения для вашего рабочего стола. Вы можете использовать тот же метод для определения разрешения, а затем использовать его для своих gl ops позже.


Я не уверен, но это сработало для меня. Просто установите размер после "запуска" игры, как в следующем коде:

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

Сообщите мне, если бы это сработало для вас.


Я бы не стал полностью использовать lwjgl. Это может показаться достаточно простым на поверхности, но по мере того, как вы пытаетесь добавить более сложные функции, вы поймете, что оболочка поверх OpenGL не даст вам этой функции, или это сделает программу на 3 раза медленнее. Я предлагаю перейти на С++ и OpenGL (если это опция). Вы будете удивлены его простоте. В противном случае межплатформенные библиотеки обычно имеют такие сбои. Чтобы решить вашу проблему, вам нужно прекратить полагаться на библиотеку, чтобы определить ваши разрешения в окне просмотра. Вместо этого перечислите все возможные режимы отображения и выберите лучший из них в соответствии с вами. Это приведет к значительно более определенному поведению и будет легче отлаживать, чем использовать конфигурацию по умолчанию, которая выглядит как по волшебству. В общем, вы всегда должны быть уверены, что знаете, какие данные вы используете. Хуже того, я только заметил, что вы используете обертку поверх обертки. Это усложняет и замедляет рендеринг гораздо большего, чем вы можете себе представить (в среднем 20 раз).


Вы можете использовать javafx.stage.screen, чтобы обойти эту проблему, но вам придется либо добавить JavaFX, если вы придерживаетесь Java 6, либо перейти на 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());

stage.show();"

Существует множество других методов (getBounds(), getDpi(), getScreens() и т.д.), которые также могут быть очень полезны для вас.


Возможно, вы получите размеры монитора, который вы используете в настоящее время, поэтому на мониторах разного размера просто получите размеры. Возможно, вам придется делать что-то по-другому для мониторов разного размера.

Возможно, фоновое изображение увеличено из-за того, что он все еще работает на других экранах.

Надеюсь, что это поможет, если не gl


Я бы воздержался от использования Toolkit.getDefaultToolkit() и использовал исключительно lwjgl.util.Display.getAvailableDisplayModes() или метод, описанный libgdx.

Как только вы настроите полноэкранное окно, выберите его размер (если ваш метод настройки еще этого не знает) и используйте эту информацию только с этой страницы.

Если Display.getAvailableDisplayModes() изменяет порядок сортировки в разных исполнениях, просто повторно сортируйте их и используйте самый большой доступный или используйте стандартный, и предоставите настройки в игре, чтобы изменить их.

licensed under cc by-sa 3.0 with attribution.