gpt4 book ai didi

libgdx - 如何在一个屏幕中使用 SpriteBatch 和 ShapeRenderer?

转载 作者:行者123 更新时间:2023-12-04 22:20:02 28 4
gpt4 key购买 nike

我使用 SpriteBatch 绘制纹理和 ShapeRenderer 绘制一些形状。

这是我在 Actor 中的代码

@Override
public void draw(Batch batch, float parentAlpha) {
batch.end();
Gdx.gl.glEnable(GL20.GL_ARRAY_BUFFER_BINDING);
Gdx.gl.glEnable(GL20.GL_BLEND);
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
shapeRenderer.begin(ShapeType.Filled);

//change color

shapeRenderer.setColor(color);

shapeRenderer.rect(rectangle.x, rectangle.y, rectangle.width, rectangle.height);

shapeRenderer.end();
Gdx.gl.glDisable(GL20.GL_BLEND);
batch.begin();
}

并在屏幕上调用 stage.draw()
@Override
public void render(float delta) {
Gdx.gl20.glClearColor(0, 0, 0, 0);
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
Gdx.gl20.glEnable(GL20.GL_TEXTURE_2D);
stage.act(delta);
stage.draw();
//......
}

它正在工作,但不可预测地抛出异常:
STACK_TRACE=java.lang.IllegalStateException: SpriteBatch.end must be called before begin.
at com.badlogic.gdx.graphics.g2d.SpriteBatch.begin(SpriteBatch.java:164)
at com.badlogic.gdx.scenes.scene2d.Stage.draw(Stage.java:127)
at c.i.a.a(AbstractCardRoomRenderer.java:3078)
at c.i.s.a(TLMNCardRoomRenderer.java:1158)
at c.j.e.render(GameScreen.java:22)
at com.badlogic.gdx.Game.render(Game.java:46)
at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:422)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1522)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1239)

编辑:有关我在做什么的更多详细信息:

我想要的是绘制一个形状。因为舞台的批次正在绘制所以我不得不结束它以进行形状绘制。我的代码仍然有效,但有时,我认为另一个 Actor 使用 stage 的批处理来绘制其他东西。它使舞台开始批处理。所以它在开始和结束之间发生冲突。

例如actor draw方法:
batch.end();
//drawing shapes

batch.begin() (somewhere else) <--- I think this code is call when stage call draw on other actor

//drawing completed
batch.begin()

编辑:
如果其他人的答案不适合您,请考虑我在下面作为答案发布的解决方法。

最佳答案

@Override
public void draw(Batch batch, float parentAlpha) {
batch.end(); <--
Gdx.gl.glEnable(GL20.GL_ARRAY_BUFFER_BINDING);
../// other code


shapeRenderer.end();
Gdx.gl.glDisable(GL20.GL_BLEND);
batch.begin(); <--

我认为错误在于您正在调用 batch.end () 之前 bacth.begin (); 尝试更改顺序

另一方面,如果绘制方法。这是舞台课,你用你需要的参数调用他, public void draw (Batch batch, float parentAlpha)

关于libgdx - 如何在一个屏幕中使用 SpriteBatch 和 ShapeRenderer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30894456/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com