2012-02-25 1 views
0

Je veux utiliser libgdx comme une solution à la mise à l'échelle des applications en fonction des proportions des écrans. j'ai trouvé ce lien, et je trouve vraiment utile: http://blog.acamara.es/2012/02/05/keep-screen-aspect-ratio-with-different-resolutions-using-libgdx/android - définir le point de départ en haut à gauche sur libgdx

je suis tout à fait rouillé opengl (n'ont pas écrit pour en années) et je souhaite utiliser l'exemple sur ce lien afin que ce serait facile de mettre des images et des formes. malheureusement, le point de départ est au milieu. Je veux l'utiliser comme sur beaucoup d'autres plates-formes - coin supérieur gauche devrait être (0,0), et le coin en bas à droite devrait être (targetWidth-1, targetHeight-1), de ce que je me souviens, je dois bouger (traduire) et faire pivoter la caméra afin de l'atteindre, mais je ne suis pas sûr.

voici mon code modifié de l'exemple du lien pour la méthode onCreate:

@Override 
public void create() 
    { 
    camera=new OrthographicCamera(VIRTUAL_WIDTH,VIRTUAL_HEIGHT); 
    // camera.translate(VIRTUAL_WIDTH/2,VIRTUAL_HEIGHT/2,0); 
    // camera.rotate(90,0,0,1); 
    camera.update(); 
    // 
    font=new BitmapFont(Gdx.files.internal("data/fonts.fnt"),false); 
    font.setColor(Color.RED); 
    // 
    screenQuad=new Mesh(true,4,4,new VertexAttribute(Usage.Position,3,"attr_position"),new VertexAttribute(Usage.ColorPacked,4,"attr_color")); 
    Point bottomLeft=new Point(0,0); 
    Point topRight=new Point(VIRTUAL_WIDTH,VIRTUAL_HEIGHT); 
    screenQuad.setVertices(new float[] {// 
     bottomLeft.x,bottomLeft.y,0f,Color.toFloatBits(255,0,0,255),// 
      topRight.x,bottomLeft.y,0f,Color.toFloatBits(255,255,0,255),// 
      bottomLeft.x,topRight.y,0f,Color.toFloatBits(0,255,0,255),// 
      topRight.x,topRight.y,0f,Color.toFloatBits(0,0,255,255)}); 
    screenQuad.setIndices(new short[] {0,1,2,3}); 
    // 
    bottomLeft=new Point(VIRTUAL_WIDTH/2-50,VIRTUAL_HEIGHT/2-50); 
    topRight=new Point(VIRTUAL_WIDTH/2+50,VIRTUAL_HEIGHT/2+50); 
    quad=new Mesh(true,4,4,new VertexAttribute(Usage.Position,3,"attr_position"),new VertexAttribute(Usage.ColorPacked,4,"attr_color")); 
    quad.setVertices(new float[] {// 
    bottomLeft.x,bottomLeft.y,0f,Color.toFloatBits(255,0,0,255),// 
     topRight.x,bottomLeft.y,0f,Color.toFloatBits(255,255,0,255),// 
     bottomLeft.x,topRight.y,0f,Color.toFloatBits(0,255,0,255),// 
     topRight.x,topRight.y,0f,Color.toFloatBits(0,0,255,255)}); 
    quad.setIndices(new short[] {0,1,2,3}); 
    // 
    texture=new Texture(Gdx.files.internal(IMAGE_FILE)); 
    spriteBatch=new SpriteBatch(); 
    spriteBatch.getProjectionMatrix().setToOrtho2D(0,0,VIRTUAL_WIDTH,VIRTUAL_HEIGHT); 
    } 

jusqu'à présent, j'ai réussi à utiliser ce code pour utiliser des coordonnées mises à l'échelle, et toujours garder le rapport d'aspect (qui est super), mais je n'ai pas réussi à déplacer le point de départ (0,0) dans le coin supérieur gauche.

aidez-moi s'il vous plaît.


EDIT: ok, après quelques tests, je l'ai découvert que la raison de ce ne fonctionne pas est que j'utilise le SpriteBatch. Je pense qu'il ignore la caméra. ce code se produit dans la partie de rendu. peu importe ce que je fais à la caméra, il montrera toujours les mêmes résultats.

@Override 
public void render() 
    { 
    if(Gdx.input.isKeyPressed(Keys.ESCAPE)||Gdx.input.justTouched()) 
    Gdx.app.exit(); 
    // update camera 
    // camera.update(); 
    // camera.apply(Gdx.gl10); 
    // set viewport 
    Gdx.gl.glViewport((int)viewport.x,(int)viewport.y,(int)viewport.width,(int)viewport.height); 
    // clear previous frame 
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
    // 
    final String msg="test"; 
    final TextBounds textBounds=font.getBounds(msg); 
    spriteBatch.begin(); 
    screenQuad.render(GL10.GL_TRIANGLE_STRIP,0,4); 
    quad.render(GL10.GL_TRIANGLE_STRIP,0,4); 
    Gdx.graphics.getGL10().glEnable(GL10.GL_TEXTURE_2D); 
    spriteBatch.draw(texture,0,0,texture.getWidth(),texture.getHeight(),0,0,texture.getWidth(),texture.getHeight(),false,false); 
    spriteBatch.draw(texture,0,VIRTUAL_HEIGHT-texture.getHeight(),texture.getWidth(),texture.getHeight(),0,0,texture.getWidth(),texture.getHeight(),false,false); 
    font.draw(spriteBatch,msg,VIRTUAL_WIDTH-textBounds.width,VIRTUAL_HEIGHT); 
    spriteBatch.end(); 
    } 

Répondre

0

Ces lignes:

camera.translate(VIRTUAL_WIDTH/2,VIRTUAL_HEIGHT/2,0); 
camera.rotate(90,0,0,1); 

devrait déplacer la caméra de telle sorte qu'il fait ce que vous voulez. Cependant, mon code a un supplémentaire:

camera.update() 

appel après qu'il appelle traduire, et il semble que vous manquiez cela. Le doc for Camera.update dit:

update 
public abstract void update() 

Recalculates the projection and view matrix of this camera and the Frustum planes. Use this after you've manipulated any of the attributes of the camera. 
+0

il semble que cela ne fonctionne pas - le rectangle vert ne prend pas l'espace complet de la fenêtre, et le texte et les images ne montrent pas dans les bons endroits. –

+0

il ne semble pas bien fonctionner sur Android. Je ne comprends pas ce qui me manque? Je souhaite également placer le point de départ dans le coin supérieur gauche, et non le point de départ (en bas à gauche). –

+0

Votre caméra est tournée de 90 degrés ... est-ce que ça gâche X et Y? Essayez de supprimer cette ligne ou de la changer à 180? Sans images ou quelques détails, il est difficile de savoir ce qui "ne semble pas bien fonctionner" signifie spécifiquement. Peut-être que le moment est venu de poser une nouvelle question à ce sujet. –

Questions connexes