我正在开发一个应用程序,我需要绘制我的精灵的痕迹。我尝试使用ShapeRenderer来做它,并且它正确地绘制了线,但是在绘制线之后,它再次被擦除。因此我尝试使用折线进行,并在每次更新时添加点,但过了一段时间后,此折线太大而无法绘制。
我的代码在一个重写的Actor类中,在每次绘制调用时检查精灵是否已移动,如果是,则使用ShapeRenderer绘制该线。有没有办法,保持这条线?
代码:
ShapeRenderer renderer = StageActivity.stageListener.shapeRenderer;
renderer.setColor(color);
Gdx.gl.glLineWidth(strokeWidth);
line.add(sprite.look.getX());
line.add(sprite.look.getY());
renderer.polyline(getLineVertices());
getLineVertices()方法只是将我的ArrayList转换为float []数组。
编辑:
由于上面的代码具有非常差的性能和很多行,我尝试了Framebuffer,这本质上是我需要的(我认为),但它没有得到绘制,我做错了什么?
buffer.begin();
renderer.begin(ShapeRenderer.ShapeType.Line);
renderer.line(previousPoint.x, previousPoint.y, sprite.look.getX(), sprite.look.getY());
renderer.end();
buffer.end();
batch.draw(buffer.getColorBufferTexture(), 0, 0);
缓冲区是我的Actor中的全局变量。
答案 0 :(得分:1)
当需要在render
方法中更新和从这些集合中绘制线条时,您应该在某些集合中保留线条点
Array<Vector2> lines = new Array<Vector2>();
...
//when you need to draw next line you just update lines array
lines.add(new Vector2(sprite.look.getX(), sprite.look.getY()));
//and in your render method you're just rendering these lines independently
if(lines.size() > 1) { //one point is not a line
for(int i = 1; i < lines.size(); i++)
renderer.line(lines.get(i-1), lines.get(i));
}
还要考虑不要一直绘制所有行 - 如果行数非常大(如数千行),那么无论如何你都会遇到性能问题 - 绘图是相当昂贵的操作
答案 1 :(得分:0)
我用framebuffer解决了我的问题。它没有呈现,因为我必须在调用framebuffer.getColorBufferTexture()之前调用batch.end()。