tamaño pantalla maximizar dela ajustar java linux libgdx lwjgl multiple-monitors

pantalla - ajustar tamaño jframe java



el tamaño incorrecto de la pantalla completa del juego java y libGDX/LWJGL para múltiples monitores en Ubuntu (8)

Estoy trabajando en un proyecto de juego libGDX (biblioteca en la parte superior de LWJGL) y uso el IDE Intellij IDEA desde varias estaciones de trabajo diferentes:

  • Computadora portátil con Windows 7 x64 con dos pantallas (1920x1080 y 1600x1200), nVidia GT540M.
  • Ubuntu 12.04 LTS en una computadora portátil con una sola pantalla (1366x768), gráficos integrados de Intel.
  • Ubuntu 12.04 LTS en un escritorio con dos pantallas (1920x1080 y 1280x1024), nVidia GTS 450.

Estoy usando OpenJDK para Java 6 en los cuadros de Ubuntu y Sun / Oracle Java 6 en el cuadro de Windows (escuché que Java 6 era el que se usa para la compatibilidad de Android).

Cuando se ejecuta en pantalla completa:

  • Computadora portátil con Windows 7: funciona bien.
  • Laptop Ubuntu: funciona bien.
  • Escritorio de Ubuntu: la imagen de fondo se muestra ampliada, y solo una parte cabe en la pantalla. +

Al analizar esto más a fondo, veo que las llamadas a Gdx.graphics.getHeight () y Gdx.graphics.getWidth () devuelven el tamaño del rectángulo necesario para cubrir ambas pantallas, en mi caso 3200x1080, pero cuando le digo a mi juego que ejecutar pantalla completa, solo usa una de las pantallas, por lo que las cámaras se ajustan a 1920x1080, pero el movimiento de mi cámara y la panorámica del mapa con azulejos creen que tienen 3200x1080 para trabajar, lo que hace que las cosas se distorsionen e inutilicen (ya que el personaje puede de la pantalla a la derecha).

Supongo que mi problema en realidad proviene de los tamaños devueltos por awt.Toolkit''s getScreenSize () llamada, pero no sé cómo interrogarlo más profundamente para obtener el tamaño de la pantalla que usará realmente cuando vaya a pantalla completa.

Mi DesktopStarter obtiene el tamaño de pantalla y establece pantalla completa de la siguiente manera:

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

¿Existe una solución alternativa para obtener el alto / ancho de solo la pantalla en la que se lanzará la "pantalla completa"?

Así que el problema que estoy viendo es que al ejecutar el archivo game.jar, al salir del juego y al volver a ejecutarlo repetidamente, se muestran diferentes modos de visualización en la lista de modos devueltos por Gdx.graphics.getDisplayModes () - como PT señaló a continuación, esta es una capa delgada alrededor de Display.getAvailableDisplayModes() LWJGL. ¿Por qué está pasando esto? ¿Por qué sería un conjunto diferente de modos presentados en las siguientes ejecuciones en Ubuntu?

editar: según la sugerencia de PT, ponga las referencias LWJGL en cuestión, ya que parece ser LWJGL la que proporciona la lista de modos de visualización.

¡Gracias!


Me abstendría de usar Toolkit.getDefaultToolkit() y usar únicamente lwjgl.util.Display.getAvailableDisplayModes() o el método descrito por libgdx .

Una vez que haya configurado una ventana de pantalla completa, busque su tamaño (si su método de configuración no lo sabe) y solo use esta información de allí en adelante.

Si Display.getAvailableDisplayModes() cambia su orden de clasificación en diferentes ejecuciones, simplemente vuelva a ordenarlas y use la más grande disponible o use una estándar y proporcione configuraciones en el juego para cambiarlas.


Me abstendría de usar Toolkit.getDefaultToolkit () y usar únicamente lwjgl.util.Display.getAvailableDisplayModes () o el método descrito por libgdx.

Una vez que haya configurado una ventana de pantalla completa, busque su tamaño (si su método de configuración no lo sabe) y solo use esta información de allí en adelante.

Si Display.getAvailableDisplayModes () cambia su orden de clasificación en diferentes ejecuciones, simplemente vuelva a ordenarlas y use la más grande disponible o use una estándar y proporcione configuraciones en el juego para cambiarlas.


Me abstendría de usar lwjgl por completo. Puede parecer lo suficientemente simple en la superficie, pero a medida que intenta agregar características más avanzadas, se dará cuenta de que un contenedor sobre OpenGL no le dará esa funcionalidad, o hará que el programa sea 3 veces más lento. Sugiero pasar a C ++ y OpenGL (si esta es una opción). Te sorprenderá su simplicidad. De lo contrario, las bibliotecas multiplataforma generalmente tienen este tipo de problemas técnicos. Para resolver su problema, debe dejar de confiar en la biblioteca para determinar las resoluciones de su ventana gráfica. En su lugar, enumere todos los modos de visualización posibles y elija el mejor según usted. Esto dará como resultado un comportamiento mucho más definido y será más fácil de depurar que utilizar una configuración predeterminada que aparece como por arte de magia. En general, siempre debe asegurarse de saber qué datos está usando. Peor aún, me di cuenta de que estás usando un envoltorio sobre un envoltorio. Esto complica demasiado y ralentizará la renderización mucho más de lo que pueda imaginarse (20 veces por término medio).


No estoy seguro, pero funcionó para mí. Simplemente establece el tamaño después de "iniciar" el juego, como en el siguiente código:

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

Avísame si te funcionó.


Podría usar javafx.stage.screen para javafx.stage.screen este problema, pero tendría que agregar JavaFX si se queda con Java 6 o si actualiza a Java 7 (está incluido con Java 7 SDK).

De la documentación:

"Describe las características de un destino de gráficos como el monitor. En un entorno de múltiples pantallas de dispositivos virtuales en el que el área del escritorio podría abarcar múltiples dispositivos de pantalla física, los límites de los objetos de la pantalla son relativos a la pantalla principal.

Por ejemplo:

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

// establece límites de etapa a los límites visibles de la pantalla principal stage.setX (primaryScreenBounds.getMinX ()); stage.setY (primaryScreenBounds.getMinY ()); stage.setWidth (primaryScreenBounds.getWidth ()); stage.setHeight (primaryScreenBounds.getHeight ());

Show de escenario();"

Hay una variedad de otros métodos ( getBounds(), getDpi(), getScreens() , etc.) que también podrían serle útiles.


Tal vez obtenga las dimensiones del monitor que usa actualmente, por lo que en los monitores de diferentes tamaños, solo obtenga las dimensiones. Es posible que deba hacer las cosas de manera diferente para monitores de diferentes tamaños.

Tal vez la imagen de fondo se ha ampliado debido a que piensa que todavía está funcionando en las otras pantallas.

Espero que esto ayude, si no gl



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