2016-06-13 19 views
0

Ich versuche ein symmetrisches 4-Wege-Programm zu erstellen, bei dem 1 Kamera eine bestimmte Szene anzeigt, aber nur die Ansicht der Kamera für jedes der 4 Felder gedreht wird.LIBGDX: Wie kann man eine Kameraansicht horizontal/vertikal spiegeln?

Zum Beispiel: symmetry

Quadrant 1 würde die regelmäßige Ausrichtung der Welt mit positiv x nach rechts und positivem y nach oben. Quadrant 2 wäre positiv x nach links und positiv y nach oben und so weiter.

Ich habe eine Möglichkeit gefunden, die gleiche Kameraansicht in mehrere Panels zu zeichnen, indem ich mein Sprite - Batch mehrere Male starte und beende (nicht sicher, ob dies eine schlechte Sache ist, aber es ist die Art und Weise, wie ich es funktionierte) glViewport von jedem Panel.

batch.setProjectionMatrix(cam.combined); 

    batch.begin();   
    Gdx.gl.glViewport(0,Gdx.graphics.getHeight()/2,Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2); 
    batch.draw(img, 0, 0); 
    batch.end(); 

    batch.begin(); 
    Gdx.gl.glViewport(0,0,Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2); 
    batch.draw(img, 0, 0); 
    batch.end();   

    batch.begin(); 
    Gdx.gl.glViewport(Gdx.graphics.getWidth()/2,0,Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2); 
    batch.draw(img, 0, 0); 
    batch.end(); 

    batch.begin(); 
    Gdx.gl.glViewport(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2,Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2); 
    batch.draw(img, 0, 0); 
    batch.end(); 

Ich denke, eine lineare Transformation es tun würde, aber ich habe nicht mit Libgdx oder linearen Algebra genug, um zu sehen, eine sofortige klare Antwort gearbeitet.

Jede Hilfe wäre willkommen. Vielen Dank.

Antwort

0

Es gibt ein paar Möglichkeiten, wie Sie dies tun können.

Flipping die Kamera

eine Matrix halten um die Flips zu tun, ohne mit der Kamera durcheinander.

private final Matrix4 tmpM = new Matrix4(); 

Dann können Sie es Flip für die drei blätterte Quadranten:

Gdx.gl.glViewport(0,Gdx.graphics.getHeight()/2,Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2); 
batch.setProjectionMatrix(cam.combined); 
batch.begin();   
batch.draw(img, 0, 0); 
batch.end(); 

Gdx.gl.glViewport(0,0,Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2); 
batch.setProjectionMatrix(tmpM.set(cam.combined).scl(1, -1, 1)); 
batch.begin();   
batch.draw(img, 0, 0); 
batch.end(); 

Gdx.gl.glViewport(Gdx.graphics.getWidth()/2,0,Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2); 
batch.setProjectionMatrix(tmpM.set(cam.combined).scl(-1, -1, 1)); 
batch.begin();   
batch.draw(img, 0, 0); 
batch.end(); 

Gdx.gl.glViewport(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2,Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2); 
batch.setProjectionMatrix(tmpM.set(cam.combined).scl(-1, -1, 1)); 
batch.begin();   
batch.draw(img, 0, 0); 
batch.end(); 

Framebuffer

Wenn Ihre Szene komplex ist, kann dies schneller sein, weil die eigentliche Szene nur eine gezeichnet Zeit. Erstellen Sie Ihr Bildspeicherobjekt in der Größenänderung. Der Versuch/Fang ist, weil einige alte Telefone oder Haushalt Telefone RGBA8888 Farbe in einem Rahmenpufferobjekt nicht unterstützen.

public void resize (int width, int height){ 
    if (frameBuffer != null) frameBuffer.dispose(); 
    try { 
     frameBuffer = new FrameBuffer(Pixmap.Format.RGBA8888, width/2, height/2, false); 
    } catch (GdxRuntimeException e) { 
     frameBuffer = new FrameBuffer(Pixmap.Format.RGB565, width/2, height/2, false); 
    } 
} 

es dann wie folgt verwenden:

frameBuffer.begin(); 
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
batch.setProjectionMatrix(cam.combined); 
batch.begin();   
batch.draw(img, 0, 0); 
batch.end(); 
frameBuffer.end(); 

Texture fbTex = frameBuffer.getColorBufferTexture(); 
batch.getProjectionMatrix().idt(); 
batch.begin(); 
batch.draw(fbTex, -1, 1, 1, -1); 
batch.draw(fbTex, -1, 0, 1, 1); 
batch.draw(fbTex, 0, 0, 1, 1); 
batch.draw(fbTex, 0, 1, 1, -1); 
batch.end(); 
0

können Sie TextureRegion Flip von

void flip(boolean x, boolean y); 

Methode kurz vor batch.draw() verwenden.

Wenn Ihr img ist Texture Instanz, die Sie werfen kann es zu TextureRegion ein durch folgende Konstruktor

public TextureRegion(Texture texture) 
Verwandte Themen