当前位置: 首页 > 知识库问答 >
问题:

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

劳昊明
2023-03-14

我用SpriteBatch绘制纹理,用ShapeRenderer绘制形状。

这是我在演员中的代码

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

共有1个答案

施俊远
2023-03-14
@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();尝试更改顺序

另一方面,如果绘制方法。它是stage类,使用所需的参数调用它,public void draw(Batch Batch,float parentAlpha)

 类似资料:
  • 问题内容: 如何从一个活动屏幕导航到另一个活动屏幕?在第一个屏幕中,我有一个按钮,如果我单击该按钮,则必须移至另一个“活动”屏幕。 问题答案:

  • 问题内容: 在终端中工作时,我看到了最后一个Shell命令执行输出的历史记录。如果运行vim,我会看到全屏打开的文件。退出vim时,我可以再次看到最后一个shell命令的历史记录。 但是,当我从屏幕上使用vim时。我在退出vim时看到的是刚刚编辑的文件的足迹,而不是最后一个shell命令的历史记录。 我想看看外壳的历史。 我该如何实现这种行为? 我用了: terminal.app和iterm2.a

  • 我在写一个程序,允许用户通过菜单选项画出不同的形状,画出后的形状需要在同一屏幕上,但问题是在菜单中选择另一个选项画出另一个形状后,前一个形状就消失了。我该怎么解决这个?这是我的程序: 仅在中。

  • null 但这三条不同的道路对我都不起作用。对于路径,以“无法找到指定的路径”失败。对于和路径,会出现“无法启动屏幕键盘”错误对话框。 我在这里找到了一个可能的解决办法,它比我想要的要复杂一点(二阳的帖子):http://social.msdn.microsoft.com/forums/en-us/netfx64bit/thread/10ebc62f-e6d7-4072-9fd1-ea3784a0

  • 我正在尝试用MVVM模式的登录活动创建一个初始屏幕。我的闪屏确实工作得很好,但当它试图完成并启动LoginActivity时,应用程序崩溃了。我得到如下错误。 请帮我解决这个问题。我需要在我的项目中有一个slapsh屏幕,其中包含MVVM模式和LoginActive的房间db。非常欢迎解释或代码示例。 我的Splash活动 我的登录活动 我的登录查看模型 我得到的错误 E/AndroidRunti

  • 问题内容: 如何以与IE,Firefox和Opera兼容的方式使访问者的浏览器使用JavaScript全屏显示? 问题答案: 这与您使用JavaScript进入全屏显示的时间非常接近: