En Java, Crear una aplicación que admita diferentes resoluciones / modos de visualización

Soy un principiante que está aprendiendo a escribir juegos en JAVA.

En el juego que estoy escribiendo, intento que sea compatible con múltiples modos de visualización. Primero déjame contarte un poco sobre cómo estoy configurando la configuración de la pantalla en primer lugar.

Al comienzo del código, tengo una lista de modos de visualización que deseo admitir

//List of supported display modes
private static DisplayMode modes[] = {
    new DisplayMode(640, 480, 32, 0),
    new DisplayMode(1024, 768, 32, 0),
}; 

Luego obtengo una lista de modos de visualización compatibles de la tarjeta de video, comparando la lista y utilizo el primer modo de visualización coincidente.

/////////////////////////////////////////////
////Variable Declaration
/////////////////////////////////////////////
private GraphicsDevice vc;

/////////////////////////////////////////////   
//Give Video Card Access to Monitor Screen
/////////////////////////////////////////////
public ScreenManager(){
    GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
    vc = e.getDefaultScreenDevice();
}
/////////////////////////////////////////////
//Find Compatible display mode
/////////////////////////////////////////////
//Compare Display mode supported by the application and display modes supported by the video card
//Use the first matching display mode;
public DisplayMode findFirstCompatibleMode(DisplayMode modes[]){
    DisplayMode goodModes[] = vc.getDisplayModes();
    for(int x=0; x<modes.length; x++){
        for(int y=0; y<goodModes.length; y++){
            if (displayModesMatch(modes[x], goodModes[y])){
                return modes[x];
            }
        }
    }
    return null;
}

/////////////////////////////////////////////   
//Checks if two Display Modes match each other
/////////////////////////////////////////////
public boolean displayModesMatch(DisplayMode m1, DisplayMode m2){

    //Test Resolution
    if (m1.getWidth() != m2.getWidth() || m1.getHeight() != m2.getHeight()){
        return false;
    }

    //Test BitDepth
    if (m1.getBitDepth() != DisplayMode.BIT_DEPTH_MULTI && m2.getBitDepth() != DisplayMode.BIT_DEPTH_MULTI
            && m1.getBitDepth() != m2.getBitDepth()){
        return false;
    }

    //Test Refresh Rate
    if (m1.getRefreshRate() != DisplayMode.REFRESH_RATE_UNKNOWN &&
            m2.getRefreshRate() != DisplayMode.REFRESH_RATE_UNKNOWN &&
            m1.getRefreshRate() != m2.getRefreshRate()){
        return false;
    }

    return true;
}

Actualmente, solo estoy admitiendo dos resoluciones, 640x480 y 1024x768.

Para tener todos los elementos de mi juego disponibles en ambas resoluciones, primero encuentro cuánto cambia el tamaño de la pantalla y almaceno este valor en una variable llamada resizeRatio

private void getResizeRatio(){
    resizeRatio = (double)1024/(double)s.getWidth();
    //s.getWidth() returns the current width of the screen.
}

Y con cada imagen que importo, dividiría el alto y el ancho de la imagen por este resizeRatio.

/////////////////////////////////////////////
//Scale the image to the right proportion for the resolution
/////////////////////////////////////////////
protected Image scaleImage(Image in){
    Image out = in.getScaledInstance((int)(in.getWidth(null)/resizeRatio), (int)(in.getHeight(null)/resizeRatio), Image.SCALE_SMOOTH);
    return out;
}

Todo está bien y bien, hasta que mi aplicación creció más y más. Pronto me doy cuenta de que olvidé cambiar el tamaño de algunos de los iconos, y todos están en el lugar equivocado cuando la resolución es 640x480.

Además, me doy cuenta de que debo escalar, no solo el tamaño de todas mis imágenes, sino también toda la velocidad de movimiento, y todas las posiciones, ya que hacer que mi personaje se mueva a 5px por actualización hace que se mueva significativamente más rápido cuando se muestra a 640x480 que cuando mostrado a 1024x768

Entonces, mi pregunta es, en lugar de escalar individualmente cada imagen, cada icono y cada movimiento, ¿hay alguna manera de escalar todo de una vez? O más bien, debe haber otra forma de hacer esto, ¿alguien podría decirme?

Gracias por leer y cualquier ayuda sería muy apreciada.

Respuesta 1

Tengo dificultades con la biblioteca Processing OpenCV: http://ubaa.net/shared/processing/opencv/index.html Estoy ejecutando el código de muestra más básico posible: import hypermedia.video. *; ...

Tengo una interfaz de servicio que lee así paquetes de servicios; dominio de importación. Artículos; interfaz pública IItemsService extiende IService {public final String NAME = "IItemsService"; / ** Coloca elementos ...

Estoy usando JSF 1.2 y RichFaces 3.3.3, y tengo un problema muy extraño, lo que hace el código es tomar el nombre del elemento de medios que se va a buscar y ponerlo en el atributo del bean de búsqueda searcTitle, y ...

Recibo un pdf en una matriz de bytes. Quiero convertir solo la primera página del pdf en imagen. He cansado las clases proporcionadas por com.lowagie.text.pdf de la siguiente manera: PdfReader reader = new PdfReader (...