Maciej Dziuban
Maciej Dziuban

Reputation: 502

LibGDX how to use different batches in one Stage

I'm using LibGDX with Scene2D for my java game. I know my issue is connected to Scene2D, because I used the EXACT same class passing it normally to SpriteBatch (not through Stage instance) and it worked as expected.

I let Stage manage all of my drawables entities which are actors. It draws everything using implementor of Batch; SpriteBatch is the default. And it was working until I wanted to draw a polygon, which has to be drawn by PolygonSpriteBatch, not SpriteBatch.. So during one Stage.draw() call I need to use them both.

I made a CheckedPolygon class which is basically two PolygonSprites drawn on top of each other (one is semi-transparent). SpriteBatch passed in draw() method is temporarily ended to enable PolygonSpriteBatch for a moment, draw the polygon and disable it.

And the output is empty screen, I get nothing. Again, it worked when I wasn't using Stage class.

Here's the class, so you get a better understanding. NOTE: I know this is bad in terms of performance, because I don't dispose of Texture and keep Batch for one object but it's for the sake of simplicity. NOTE2: Yes, I passed it properly to stage, the code is executed, I checked through debugging.

public class CheckedPolygon extends Actor {
    private final PolygonSprite mBackground, mCross;
    private final PolygonSpriteBatch mPolygonSpriteBatch;
    private final Camera mCamera;

    public CheckedPolygon(Camera camera, float[] vertices, short[] triangles) {
        super();
        mCamera = camera;
        mPolygonSpriteBatch = new PolygonSpriteBatch();

        Texture textureBack = new Texture(Gdx.files.internal("source/back.png"));
        textureBack.setWrap(Texture.TextureWrap.Repeat, Texture.TextureWrap.Repeat);
        PolygonRegion regionBack = new PolygonRegion(new TextureRegion(textureBack), vertices, triangles);
        mBackground = new PolygonSprite(regionBack);

        Texture textureCross = new Texture(Gdx.files.internal("source/cross.png"));
        textureCross.setWrap(Texture.TextureWrap.Repeat, Texture.TextureWrap.Repeat);
        PolygonRegion regionCross = new PolygonRegion(new TextureRegion(textureCross), vertices, triangles);
        mCross = new PolygonSprite(regionCross);
    }

    @Override
    public void draw(Batch batch, float parentAlpha) {
        batch.end();

        mPolygonSpriteBatch.setProjectionMatrix(mCamera.combined);
        mPolygonSpriteBatch.begin();

        mBackground.draw(mPolygonSpriteBatch);
        mCross.draw(mPolygonSpriteBatch);

        mPolygonSpriteBatch.end();

        batch.begin();

    }
}

And I use it like this:

CheckedPolygon polygon = new CheckedPolygon(mStage.getCamera(), mTextureAtlas, new float[]{0, 500, 0, 0, 0, 500}, new short[]{0, 1, 2});
mStage.addActor(polygon);

I checked values from methods PolygonSprite.getVertices() and PolygonSprite.getBoundingRectangle() and got some weird outputs...

Output image

Upvotes: 2

Views: 1591

Answers (1)

Pinkie Swirl
Pinkie Swirl

Reputation: 2415

You create an invalid polygon with 0,500 being the first and last point.

So you need to chose valid vertices, for example:

new float[] {0, 0, 0, 500, 500, 500}

I created a small image to visualize it. The line on top is your "polygon", the triangle below is a polygon with the vertices from above:

enter image description here

The vertices you get back from the polygon sprite are otherwise ok, since they contain x, y, color, u, v.

Upvotes: 3

Related Questions