我刚刚开始使用LibGDX,我遇到了使用批处理的问题: 我的HomeScreen中有一个渲染方法,可以渲染屏幕上的所有内容,包括一些按钮。在我的班级按钮中,我渲染按钮,之后,我使用批处理来绘制文本。问题是文本是在按钮的矩形后面绘制的(即使批处理在矩形的渲染器之后开始)也不知道它是否清晰,所以这里有一些代码:
在Screen类中:
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
viewport.apply();
vector3.set(Gdx.input.getX(), Gdx.input.getY(), 0);
viewport.unproject(vector3);
renderer.setProjectionMatrix(camera.combined);
renderer.setAutoShapeType(true);
renderer.begin(ShapeRenderer.ShapeType.Filled);
homeStars.render(renderer);
for (Button button: buttons)
{
button.render(renderer);
}
renderer.setColor(1,1,1,1);
//realCursor = cursorToWorldPosition(Gdx.input.getX(),Gdx.input.getY());
//renderer.circle((vector3.x+1)*Const.WORLD_WIDTH/2,(vector3.y+1)*Const.WORLD_HEIGHT/2,5);
renderer.circle(vector3.x,vector3.y,5);
renderer.set(ShapeRenderer.ShapeType.Line);
for(HomeStar star : HomeStars.stars)
{
if(vector3.dst(star.position)<Const.MAX_DIST_MOUSE_STAR){
renderer.line(vector3.x, vector3.y,star.position.x,star.position.y,Color.WHITE, Color.BLUE);
}
}
}
在Button类中:
public void render(ShapeRenderer renderer){
if (mouseOn() == true){
renderer.rect(position.x-width/2,position.y-height/2,width, height, Color.BLACK, Color.VIOLET, Color.BLACK, Color.VIOLET);
}
else if (mouseOn() == false){
renderer.rect(position.x-width/2,position.y-height/2,width, height, Color.BLACK, Color.GRAY, Color.BLACK, Color.GRAY);
}
batch.begin();
font.draw(batch, "yo", position.x, position.y);
batch.end();
}
非常感谢任何帮助,谢谢!
答案 0 :(得分:1)
您无法嵌套SpriteBatch
和ShapeRenderer
。确保在致电renderer.end()
之前致电batch.begin()
,然后在致电renderer.begin()
后致电batch.end()
:
renderer.end();
batch.begin();
font.draw(batch, "yo", position.x, position.y);
batch.end();
renderer.begin();
因为你正在学习,所以现在应该这样做。但请注意,这会很快变得非常低效,因为它会破坏批处理的目的。您应该避免在ShapeRenderer
和SpriteBatch
之间不断切换。 SpriteBatch
非常适合呈现矩形,因此您可能希望仅使用SpriteBatch
作为按钮(或使用scene2作为UI)。