10
votes

Libgdx: Comment puis-je dessiner un polygone rempli avec le Shaperender?

J'ai défini une forme à l'aide d'un tableau de sommets: xxx pré>

et je dessine ici ici: p>

shapeRenderer.polygon(floatNew);


0 commentaires

3 Réponses :


2
votes

Vous ne pouvez pas dessiner un polygone rempli avec le Shaperender. Jetez un coup d'œil à cela depuis le BugTracker
< BR> Vous pouvez également lire cela dans l'API.

Polygone vide public (float [] sommets)
Dessine un polygone dans l'avion X / Y. Les sommets doivent contenir au moins 3 points (6 flotteurs x, y). Le shaperender.shapetype est passé au début a être shaperenderer.shapetype.line.

<-a href="http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/grapicic/glutils/shaperenderer.html" rel="nofollow Noreferrer"> API Shaperender
Bien sûr, si c'est avec Shabetype.Line, vous venez d'obtenir les contours.
Vous devez le dessiner avec des triangles dans ce cas. Il devrait être possible de remplir au moins des triangles. de
Peut-être jetez peut-être un coup d'œil à cela depuis Stackoverflow: Polygone à dessin-polygone-avec-libgdx


0 commentaires

-2
votes

Modifier votre méthode de la classe Shaperender.java remplaçant la méthode du polygone () avec le code suivant: xxx

utilisation: xxx


2 commentaires

Si le correctif est-ce facile, pourquoi n'est-ce pas encore incorporé?


Parce que cela ne fonctionne pas pour des polys avec plus de 4 sommets.



8
votes

Actuellement, Shaperender prend en charge le dessin polygone (par ligne) mais ne remplit pas.

Ce code est la décollage du polygone sur les triangles, puis en tirant chaque triangle séparément. P>

Modifier Shaperenderer.java Comme ceci: P>

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 commentaires

Vous pouvez améliorer beaucoup votre réponse si vous avez ajouté des explications sur la raison pour laquelle le code que vous avez posté fonctionne.


C'est génial! Enfin, je l'ai trouvé, et cela correspond parfaitement à mes besoins - juste un exemple rapide avec un rendu de forme unique.