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
.
我在 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
.