LibGDX绘制线条

10
我正在尝试使用libGDX制作类似弹弓的东西。
我的代码
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();

    }

这样做将会产生以下输出结果: 在此输入图片描述 这看起来很糟糕,如果我在我的安卓手机上调试,logcat 将会被这条消息刷屏。

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

我的游戏存在卡顿问题,当我触摸屏幕时,帧率只有30帧,不触摸屏幕时则为60帧...

另外,我需要在画线时增加一点厚度,这样当线条更大时,我将不得不使其变粗,以呈现酷炫的效果。

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

有人能提供帮助吗?


3
我猜你因为在每帧渲染中创建ShapeRenderer实例而受到了垃圾邮件的困扰。尝试在构造函数中创建一次,而不是每帧都创建它。 - desertkun
但是我应该如何绘制带有厚度的线条呢? - Boldijar Paul
通常每个帖子只提出一个问题。SO是围绕这一点设计的。无论如何,请参见https://dev59.com/bnLYa4cB1Zd3GeqPXGNL?rq=1以获取线条粗细信息。 - P.T.
3个回答

15

我在帮助程序或工具类中有类似这样的东西。通常我用它来调试和可视化正在发生的事情。

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

现在我可以在任何投影矩阵上从任何位置轻松绘制一条线。

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

如果您希望在另一个SpriteBatch的begin和end之外进行绘制,那么最好在单独的静态方法中开始和结束ShapeRenderer,或者将其公开并根据需要自行完成。 如果您希望在每帧绘制许多线条,则最好这样做。

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


3
您可以通过调用 Gdx.gl10.glLineWidth(像素宽度) 来设置线条的粗细。

怎样让它看起来更好? - Boldijar Paul
@Paul,你可以绘制纹理。例如,使用大小为[1px]x[16px]的“线”图案拉伸源纹理到[line_length]x[16px],并旋转以适应起始点和结束点(使用Math.atan2)。稍后我可以提供一些代码。 - desertkun
为什么我的手机上线条更粗?我使用的宽度是10。 - Boldijar Paul

1

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

}

哈哈,这个问题很老了!另外,render方法中的shaperenderer非常不好。 - Boldijar Paul
是的...在渲染方法中创建新对象并不是游戏开发中最好的做法。我很兴奋,因为我确切地知道如何回答SO上的问题,所以我忍不住回答了这个10个月前的问题... - Eric Christensen
我记得那种感觉,兄弟! :) - Boldijar Paul
顺便说一下,我认为你的答案是错误的,shapetype.filled会绘制任何填充的形状,如圆形、矩形,而不是线条,实际上,你不能填充一条线。 - Boldijar Paul
我现在正在我的游戏中使用它。我刚刚比较了line和filled。对于ShapeRenderer.rectLine(),你肯定想要Filled。它可以像shaptype.line一样应用于ShapeRenderer.line(),但可能效率要低得多。 - Eric Christensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接