2012-02-25 19 views
0

我想使用libgdx作爲根據屏幕縱橫比縮放應用程序的解決方案。 我找到了這個鏈接,我發現它真的有用: http://blog.acamara.es/2012/02/05/keep-screen-aspect-ratio-with-different-resolutions-using-libgdx/android - 在libgdx上設置起始點左上角

我是用OpenGL(已經很多年沒有爲它寫)很生疏,我想使用這個鏈接,這樣的例子放置圖像和形狀將很容易。不幸的是,起點在中間。我想在許多其他平臺上使用它 - 左上角應該是(0,0),右下角應該是(targetWidth-1,targetHeight-1), 我記得,我需要移動(平移)並旋轉相機以實現它,但我不確定。

這裏是我修改爲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); 
    } 

到目前爲止,我已經成功才能使用縮放座標,使用此代碼,並且仍然保持寬高比(這是很棒),但我沒有成功將起點(0,0)移到左上角。

請幫幫我。


編輯:好的,經過一些測試,我發現它不工作的原因是我使用spriteBatch。我認爲它忽略了相機。這段代碼出現在渲染部分。不管我對相機做什麼,它仍然會顯示相同的結果。

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

回答

0

這些行:

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

應移動相機,使得你想要做什麼。然而,我的代碼有一個額外的:

camera.update() 

通話後調用翻譯,它看起來像你缺少。該doc for Camera.update說:

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

看來,這是行不通的 - 綠色矩形不充分窗口空間,以及文本和圖像不正確的位置顯示。 – 2012-02-28 23:12:27

+0

它似乎不能很好地在android上運行。我不明白我錯過了什麼?我也希望把起點放在左上角,而不是現在的(左下角)。 – 2012-02-28 23:51:42

+0

你的相機旋轉了90度...是在搞亂X和Y嗎?嘗試刪除該行或將其更改爲180?沒有圖片或某些細節,就很難知道「看起來不太好」的具體含義。不過,可能是時候爲此提出新的問題了。 – 2012-02-29 09:54:48