LibGDX如何在一个Stage中使用不同的批次

LibGDX how to use different batches in one Stage

我在 java 游戏中使用 LibGDX 和 Scene2D。我知道我的问题与 Scene2D 有关,因为我使用完全相同的 class 将其正常传递给 SpriteBatch(而不是通过 Stage 实例)并且它按预期工作。

我让 Stage 管理我所有的可绘制实体,它们是演员。它使用 Batch 的实现者绘制所有内容; SpriteBatch 是默认值。它一直在工作,直到我想绘制一个多边形,它必须由 PolygonSpriteBatch 绘制,而不是 SpriteBatch.. 所以在一个 Stage.draw() 调用期间我需要同时使用它们。

我制作了一个 CheckedPolygon class,它基本上是两个相互叠加的 PolygonSprites(一个是半透明的)。 draw()方法中传入的SpriteBatch暂时结束启用PolygonSpriteBatch片刻,绘制多边形并禁用。

而且输出是空屏幕,我什么也没得到。同样,当我不使用 Stage class.

时它起作用了

下面是class,让你更好的理解。 注意:我知道这在性能方面很糟糕,因为我没有处理 Texture 并为一个对象保留 Batch,但这是为了简单起见。 NOTE2: 是的,我把它正确地传递到阶段,代码被执行,我通过调试检查。

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

    }
}

我是这样使用的:

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

我检查了方法 PolygonSprite.getVertices() 和 PolygonSprite.getBoundingRectangle() 的值并得到了一些奇怪的输出...

您创建了一个无效的多边形,其中 0,500 是第一个点和最后一个点。

所以你需要选择有效的顶点,例如:

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

我创建了一个小图像来可视化它。上面的线是你的"polygon",下面的三角形是一个多边形,上面有顶点:

你从多边形精灵中得到的顶点在其他方面是没问题的,因为它们包含 x, y, color, u, v.