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:
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.