2011-04-23 2 views
2

J'ai la classe Java suivante que j'ai écrite pour un projet LibGdx OpenGL. L'appareil photo conserve les proportions de l'écran, peu importe la façon dont vous le redimensionnez en mode letterboxing, que ce soit en haut ou en bas ou sur les côtés. Jusqu'ici tout va bien.Comment puis-je calculer la taille de la boîte aux lettres avec cette classe?

Le problème survient lorsque j'essaie d'obtenir les coordonnées x et y de la souris d'un clic et que la boîte aux lettres est impliquée pour cet axe. Tout d'abord voici la classe:

public class Camera { 

private static float viewportWidth; 
private static float viewportHeight; 
private static float aspectRatio; 
private static float barSize; 

/** 
    * Creates an orthographic camera where the "play area" has the given viewport size. The viewport will be scaled to maintain the aspect ratio. 
    * 
    * @param virtualWidth the width of the game screen in virtual pixels. 
    * @param virtualHeight the height of the game screen in virtual pixels. 
    * @return the new camera. 
    * 
    */ 

public static OrthographicCamera createCamera(float virtualWidth, float virtualHeight) { 

    aspectRatio = virtualWidth/virtualHeight; 


    float physicalWidth = Gdx.graphics.getWidth(); 
    float physicalHeight = Gdx.graphics.getHeight(); 

    if (physicalWidth/physicalHeight >= aspectRatio) { 
//  Letterbox left and right. 
     viewportHeight = virtualHeight; 
     viewportWidth = viewportHeight * physicalWidth/physicalHeight; 
     barSize = ????; 
    } 
    else { 
//  Letterbox above and below. 
     viewportWidth = virtualWidth; 
     viewportHeight = viewportWidth * physicalHeight/physicalWidth; 
     barSize = ????; 
    } 

    OrthographicCamera cam = new OrthographicCamera(viewportWidth , viewportHeight); 
    cam.position.set(virtualWidth/2, virtualHeight/2, 0); 
    cam.rotate(180, 1, 0, 0); 
    cam.update(); 
    Gdx.app.log("BTLog", "barSize:"+barSize); 
    return cam; 
} 

public static float getViewportWidth() { 
    return viewportWidth; 
} 

public static float getViewportHeight() { 
    return viewportHeight; 
} 
} 

LibGdx me fournit les coordonnées x et y arrive lorsqu'un même, et je dois traduire ces coordonnées brutes dans l'échelle de mon appareil photo (la hauteur et la largeur virtuelle).

Lorsque l'écran est tendu (pas letterboxing du tout), il est assez facile d'obtenir les coordonnées x et y en utilisant:

xRelative = (int) (x/(float)Gdx.graphics.getWidth() * Camera.getViewportWidth()); 
yRelative = (int) (y/(float)Gdx.graphics.getHeight() * Camera.getViewportHeight()); 

Le problème est quand les letterboxes entrent en jeu, il jette la coordonner pour cet axe. Je sais que je dois prendre en compte la largeur de la boîte aux lettres, mais j'ai un sacré temps à calculer.

Ci-dessus où j'ai "barSize = ????;" mon premier instinct était de faire ceci: barSize = physicalHeight - viewportHeight; // utiliser la hauteur par exemple

Une fois que je reçois le barSize, je suis assez sûr que je peux l'utiliser pour obtenir les bons chiffres (en utilisant l'axe y par exemple):

yRelative = (int) (y/(float)Gdx.graphics.getHeight() * Camera.getViewportHeight() - Camera.getBarSize()); 

Mais les chiffres ne correspond pas. Toutes les suggestions seraient vraiment appréciées!

Répondre

3
Ray ray = camera.getPickRay(x, y); 
System.out.println(ray.origin.x); 
System.out.println(ray.origin.y); 
Questions connexes