2017-06-15 4 views
1

Ich arbeite an einem Spiel, das erfordert, dass ich dynamisch Karten mit Text auf ihnen erzeuge. Um dies zu erreichen, versuche ich, einen generischen Kartenhintergrund und etwas Text in einen Bildpuffer zu rendern und daraus eine TexturRegion zur Verwendung als Sprite zu erzeugen.LibGDX FrameBuffer zu TextureRegion rendert falsches Sprite

Mein aktueller Versuch schafft einige ziemlich ... unerwartete Ergebnisse: This is the sprite that is returnedThis is what comes out of the PixMap screenshot

Das große, bunte Bild oben ist, was das Sprit durch die unten stehende Funktion zurück aussieht. Das gerenderte Bild ist eigentlich das vollständige Spritesheet, aus dem der Texturatlas ein Sprite lädt.

Das zweite Bild (welches das erwartete Ergebnis ist) ist der Inhalt des PNG-Screenshots, der aus dem Pixmap gegen Ende der Funktion generiert wird.

Ich kann bestätigen, dass die TextureRegion, die in der Funktion generiert wird, verwendet wird, da das Ändern der Parameter fboRegion.flip() das resultierende Sprite beeinflusst.

private Sprite generateCard(String text, TextureAtlas atlas){ 
    //Create and configure font 
    BitmapFont font = new BitmapFont(); 
    font.setColor(Color.RED); 

    //Create a SpriteBatch (Temporary, need to pass this in later) 
    SpriteBatch sb = new SpriteBatch(); 

    //Create sprite from texture atlas 
    Sprite sprite = atlas.createSprite("back", 3); 

    //Create FrameBuffer 
    FrameBuffer fbo = new FrameBuffer(Pixmap.Format.RGBA8888, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false); 
    //Extract Texture from FrameBuffer 
    TextureRegion fboRegion = new TextureRegion(fbo.getColorBufferTexture()); 
    //Flip the TextureRegion 
    fboRegion.flip(false, true); 

    //Begin using the FrameBuffer (disable drawing to the screen?) 
    fbo.begin(); 
    //Clear the FrameBuffer with transparent black 
    Gdx.gl.glClearColor(0f, 0f, 0f, 0f); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT); 

    sb.begin(); 
    //Draw card background 
    sb.draw(sprite, 0,0, sprite.getWidth(), sprite.getHeight()); 
    //Draw card text 
    font.draw(sb, text, 20, 100); 

    sb.end(); 

    //Take "Screenshot" of the FrameBuffer 
    Pixmap pm = ScreenUtils.getFrameBufferPixmap(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
    PixmapIO.writePNG(new FileHandle("screenshot.png"), pm); 

    fbo.end(); 

    sb.dispose(); 
    fbo.dispose(); 

    return new Sprite(fboRegion); 
} 

Wenn jemand irgendwelche Vorschläge hat, würde ich die Hilfe sehr schätzen. Ich habe das Gefühl, dass etwas in der falschen Reihenfolge passiert, aber ich kann nicht sehen, wo der FrameBuffer das Bild, von dem es gerendert wird, bekommen kann oder warum das zurückgegebene Sprite das falsche Bild hat, aber den FrameBuffer an ein PNG ablegt gibt das richtige Bild.

Antwort

0

Also nach ein paar zusätzlichen Experimenten habe ich herausgefunden, dass der obige Code genau so funktioniert wie beabsichtigt. Ich habe es geschafft, das Problem bis zu einem anderen Code zu verfolgen, der die Dimensionen und die Position des Sprites annimmt, aber eine andere Textur rendert (daher das Spiegeln, wenn ich den Texturbereich ändere).

Dank denen, die meine Frage auscheckten.

Verwandte Themen