Java LibGDX 画线

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21835062/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 10:58:54  来源:igfitidea点击:

LibGDX draw line

javalibgdx

提问by Boldijar Paul

I'm trying to make something like a slingshot using libGDX.

我正在尝试使用 libGDX 制作类似弹弓的东西。

My code

我的代码

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

    }

Doing this i will have the output enter image description hereThis looks awful, and if I debug on my android phone , the logcat is spammed by the message

这样做我会得到输出 在此处输入图片说明这看起来很糟糕,如果我在我的 android 手机上调试,logcat 会被消息发送垃圾邮件

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

And lags, I have like 30 fps when i touch the screen , and 60 when i don't...

并且滞后,当我触摸屏幕时我有 30 fps,当我不触摸时有 60 fps...

I also need to draw the line with a little bit of thickness, so when the line is bigger, i will have to make it thicker, to give a cool look.

我还需要画一点粗细的线条,所以当线条变大时,我必须把它变粗,看起来很酷。

Which is the best way to draw a simple line in libgdx ? If I won't find any answer probably i'm going to draw circles from a point of the line to the other..this would look ok , but won't look like a slingshot...

在 libgdx 中绘制简单线条的最佳方法是什么?如果我找不到任何答案,我可能会从线的一点到另一点画圆圈......这看起来不错,但看起来不像弹弓......

Any help?

有什么帮助吗?

采纳答案by Madmenyo

I just have something like this in a helper or utils class. I usually use it for debugging and visualizing whats going on.

我只是在 helper 或 utils 类中有这样的东西。我通常用它来调试和可视化正在发生的事情。

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);
    }

Now I can easily draw a line from anywhere I like on any projection matrix I want.

现在我可以轻松地从我喜欢的任何投影矩阵上的任何地方画一条线。

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

You want to draw outside the other SpriteBatchbegin and end. And if you want to make a lot of lines each frame you are better off beginning and ending the ShapeRenderer in a separate static method or make it public and do it yourself depending on your needs.

您想在其他SpriteBatch开始和结束之外绘制。如果您想在每一帧中制作很多行,最好在单独的静态方法中开始和结束 ShapeRenderer,或者将其公开并根据您的需要自行完成。

Obviously you can create more methods for more shapes or more overloads.

显然,您可以为更多形状或更多重载创建更多方法。

回答by desertkun

You could set line thickness by calling Gdx.gl10.glLineWidth(width_in_pixels).

您可以通过调用设置线条粗细Gdx.gl10.glLineWidth(width_in_pixels)

回答by Eric Christensen

ShapeRenderer has a method called rectLine() that draws a line with a specified thickness. It is exactly what you're looking for with your line thickness question. You will also want to change sr.begin(ShapeType.Line) to sr.begin(ShapeType.Filled)

ShapeRenderer 有一个名为 rectLine() 的方法,它可以绘制一条具有指定粗细的线。这正是您正在寻找的线宽问题。您还需要将 sr.begin(ShapeType.Line) 更改为 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();

}