2
votes

I'm working on a game which requires me to dynamically generate cards with text on them . To achieve this I am attempting to render a generic card background and some text to a frame buffer then create a TextureRegion from this for use as a Sprite.

My current attempt creates some rather...unexpected results: This is the sprite that is returnedThis is what comes out of the PixMap screenshot

The large, colorful image above is what the sprite returned by the below function looks like. The image being rendered is actually the full spritesheet that the texture atlas is loading a sprite from.

The second image (which is the expected result) is the content of the PNG screenshot generated from the pixmap towards the end of the function.

I can confirm that the TextureRegion generated in the function is being used because changing the parameters of fboRegion.flip() does affect the resulting sprite.

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

If anyone has any suggestions I'd greatly appreciate the help. I feel like something is just happening in the wrong order but I can't for the life of me see where the FrameBuffer could be getting the Image it is rendering from or why the returned sprite has the wrong image but dumping the FrameBuffer to a PNG gives the the right image.

1

1 Answers

1
votes

So after a fair bit of extra experimentation I've found out the above code is working exactly as intended. I have managed to track the issue down to some other code which is taking the dimensions and position of the sprite but rendering a different texture (hence the flipping when I changed the texture region).

Thanks to those that checked out my question.