LIBGDX: How do I draw a filled polygon with the shaperenderer?

拟墨画扇 提交于 2019-12-21 07:56:37

问题


I have defined a shape using an array of vertices:

float[] points =  new float[]{50,60,50,70,60,70, 60,60,50,60};

And I am drawing this here:

shapeRenderer.polygon(floatNew);

This just gives an outline of the shape.
How do I fill it with colour?
Thanks


回答1:


Currently, ShapeRenderer supports polygon drawing (by line) but not filling.

This code is clipping the polygon on triangles, and then drawing each triangle separately.

Edit ShapeRenderer.java like this:

EarClippingTriangulator ear = new EarClippingTriangulator();

public void polygon(float[] vertices, int offset, int count)
{
    if (shapeType != ShapeType.Filled && shapeType != ShapeType.Line)
        throw new GdxRuntimeException("Must call begin(ShapeType.Filled) or begin(ShapeType.Line)");
    if (count < 6)
        throw new IllegalArgumentException("Polygons must contain at least 3 points.");
    if (count % 2 != 0)
        throw new IllegalArgumentException("Polygons must have an even number of vertices.");

    check(shapeType, null, count);

    final float firstX = vertices[0];
    final float firstY = vertices[1];
    if (shapeType == ShapeType.Line)
    {
        for (int i = offset, n = offset + count; i < n; i += 2)
        {
            final float x1 = vertices[i];
            final float y1 = vertices[i + 1];

            final float x2;
            final float y2;

            if (i + 2 >= count)
            {
                x2 = firstX;
                y2 = firstY;
            } else
            {
                x2 = vertices[i + 2];
                y2 = vertices[i + 3];
            }

            renderer.color(color);
            renderer.vertex(x1, y1, 0);
            renderer.color(color);
            renderer.vertex(x2, y2, 0);

        }
    } else
    {
        ShortArray arrRes = ear.computeTriangles(vertices);

        for (int i = 0; i < arrRes.size - 2; i = i + 3)
        {
            float x1 = vertices[arrRes.get(i) * 2];
            float y1 = vertices[(arrRes.get(i) * 2) + 1];

            float x2 = vertices[(arrRes.get(i + 1)) * 2];
            float y2 = vertices[(arrRes.get(i + 1) * 2) + 1];

            float x3 = vertices[arrRes.get(i + 2) * 2];
            float y3 = vertices[(arrRes.get(i + 2) * 2) + 1];

            this.triangle(x1, y1, x2, y2, x3, y3);
        }
    }
}



回答2:


You cant draw a filled Polygon with the shaperender yet. take a look at this from the bugtracker

You can also read that in the API.

public void polygon(float[] vertices)
Draws a polygon in the x/y plane. The vertices must contain at least 3 points (6 floats x,y). The ShapeRenderer.ShapeType passed to begin has to be ShapeRenderer.ShapeType.Line.


API ShapeRender
Sure if its with ShapeType.Line you just get the outlines.
You need to draw it yourself with Triangles in that case. It should be possible to fill at least Triangles.
Maybe take a look at this from Stackoverflow: drawing-filled-polygon-with-libgdx




回答3:


You should use mesh for that. Take a look at the link. Also, you might want to check PolygonSpriteBatch.




回答4:


Edit your ShapeRenderer.java class replacing polygon() method with the following code:

public void polygon(float[] vertices, int offset, int count) {
    if (currType != ShapeType.Filled && currType != ShapeType.Line)
        throw new GdxRuntimeException(
                "Must call begin(ShapeType.Filled) or begin(ShapeType.Line)");
    if (count < 6)
        throw new IllegalArgumentException(
                "Polygons must contain at least 3 points.");
    if (count % 2 != 0)
        throw new IllegalArgumentException(
                "Polygons must have an even number of vertices.");

    checkDirty();
    checkFlush(count);

    final float firstX = vertices[0];
    final float firstY = vertices[1];
    if (currType == ShapeType.Line) {
        for (int i = offset, n = offset + count; i < n; i += 2) {
            final float x1 = vertices[i];
            final float y1 = vertices[i + 1];

            final float x2;
            final float y2;

            if (i + 2 >= count) {
                x2 = firstX;
                y2 = firstY;
            } else {
                x2 = vertices[i + 2];
                y2 = vertices[i + 3];
            }

            renderer.color(color);
            renderer.vertex(x1, y1, 0);
            renderer.color(color);
            renderer.vertex(x2, y2, 0);

        }
    } else {

        for (int i = offset, n = offset + count; i < n; i += 4) {

            final float x1 = vertices[i];
            final float y1 = vertices[i + 1];

            if (i + 2 >= count) {
                break;
            }

            final float x2 = vertices[i + 2];
            final float y2 = vertices[i + 3];

            final float x3;
            final float y3;

            if (i + 4 >= count) {
                x3 = firstX;
                y3 = firstY;
            } else {
                x3 = vertices[i + 4];
                y3 = vertices[i + 5];
            }

            renderer.color(color);
            renderer.vertex(x1, y1, 0);
            renderer.color(color);
            renderer.vertex(x2, y2, 0);
            renderer.color(color);
            renderer.vertex(x3, y3, 0);


        }

    }
}

Usage:

    gdx_shape_renderer.begin(ShapeType.Filled);
    gdx_shape_renderer.setColor(fill_r, fill_g, fill_b, fill_a);
    gdx_shape_renderer.polygon(vertices);
    gdx_shape_renderer.end();

    gdx_shape_renderer.begin(ShapeType.Line);
    gdx_shape_renderer.setColor(border_r, border_g, border_b, border_a);
    gdx_shape_renderer.polygon(vertices);
    gdx_shape_renderer.end();


来源:https://stackoverflow.com/questions/16102692/libgdx-how-do-i-draw-a-filled-polygon-with-the-shaperenderer

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!