Linha de traçado LibGDX

Eu estou tentando fazer algo como um estilingue usando libGDX.

Meu código

if (Gdx.input.isTouched()) { ShapeRenderer sr = new ShapeRenderer(); sr.setColor(Color.BLACK); sr.setProjectionMatrix(camera.combined); sr.begin(ShapeType.Line); sr.line(player.getLeft().x, player.getLeft().y, Global.game_touch_position.x, Global.game_touch_position.y); sr.line(player.getRight().x, player.getRight().y, Global.game_touch_position.x, Global.game_touch_position.y); sr.end(); } 

Fazendo isso eu terei a saída insira a descrição da imagem aqui Isso parece horrível, e se eu depurar no meu telefone Android, o logcat é spam pela mensagem

 02-17 18:55:27.371: D/dalvikvm(7440): GC_CONCURRENT freed 1884K, 40% free 8287K/13635K, paused 15ms+2ms, total 40ms 

E demora, eu tenho 30 qps quando eu toco na canvas, e 60 quando eu não …

Eu também preciso desenhar a linha com um pouco de espessura, então quando a linha for maior, eu terei que torná-la mais espessa, para dar uma aparência legal.

Qual é a melhor maneira de desenhar uma linha simples no libgdx? Se eu não encontrar nenhuma resposta, provavelmente eu vou desenhar círculos de um ponto da linha para o outro … isso pareceria ok, mas não parecerá um estilingue …

Qualquer ajuda?

Eu só tenho algo parecido com isso em um auxiliar ou aula de utilidades. Eu costumo usá-lo para depurar e visualizar o que está acontecendo.

 private static ShapeRenderer debugRenderer = new ShapeRenderer(); public static void DrawDebugLine(Vector2 start, Vector2 end, int lineWidth, Color color, Matrix4 projectionMatrix) { Gdx.gl.glLineWidth(lineWidth); debugRenderer.setProjectionMatrix(projectionMatrix); debugRenderer.begin(ShapeRenderer.ShapeType.Line); debugRenderer.setColor(color); debugRenderer.line(start, end); debugRenderer.end(); Gdx.gl.glLineWidth(1); } public static void DrawDebugLine(Vector2 start, Vector2 end, Matrix4 projectionMatrix) { Gdx.gl.glLineWidth(2); debugRenderer.setProjectionMatrix(projectionMatrix); debugRenderer.begin(ShapeRenderer.ShapeType.Line); debugRenderer.setColor(Color.WHITE); debugRenderer.line(start, end); debugRenderer.end(); Gdx.gl.glLineWidth(1); } 

Agora eu posso desenhar facilmente uma linha de qualquer lugar que eu quiser em qualquer matriz de projeção que eu queira.

 HelperClass.DrawDebugLine(new Vector2(0,0), new Vector2(100,100), camera.combined); 

Você quer desenhar fora do outro começo e fim do SpriteBatch . E se você quiser fazer um monte de linhas em cada quadro, é melhor começar e terminar o ShapeRenderer em um método estático separado ou torná-lo público e fazê-lo você mesmo, dependendo de suas necessidades.

Obviamente, você pode criar mais methods para mais formas ou mais sobrecargas.

Você pode definir a espessura da linha chamando Gdx.gl10.glLineWidth(width_in_pixels) .

O ShapeRenderer tem um método chamado rectLine () que desenha uma linha com uma espessura especificada. É exatamente o que você está procurando com a sua questão de espessura de linha. Você também desejará alterar sr.begin (ShapeType.Line) para sr.begin (ShapeType.Filled)

 if (Gdx.input.isTouched()) { ShapeRenderer sr = new ShapeRenderer(); sr.setColor(Color.BLACK); sr.setProjectionMatrix(camera.combined); sr.begin(ShapeType.Filled); sr.rectLine(player.getLeft().x, player.getLeft().y, Global.game_touch_position.x, Global.game_touch_position.y, desired_thickness); sr.rectLine(player.getRight().x, player.getRight().y, Global.game_touch_position.x, Global.game_touch_position.y, desired_thickness); sr.end(); }