Ich wollte einige (gefüllte) Polygone mit libgdx für ein Android-Spiel zeichnen. es sollte nicht mit einer Grafik / Textur gefüllt werden. Ich habe nur die Scheitelpunkte des Polygons (geschlossener Pfad) und habe versucht, mit Gittern zu visualisieren, aber an einem Punkt ist das nicht die beste Lösung, denke ich.
Mein Code für ein Rechteck ist:
%Vor%Gibt es eine Funktion oder etwas, um gefüllte Polygone einfacher zu zeichnen?
Hier ist ein LIBGDX-Beispiel, das 2D Concave Poly zeichnet.
// Definieren Sie Klassenelemente für PolygonSprite PolygonSpriteBatch
%Vor%// Erzeuge Instanzen, 1x1-Größe Textur verwendet mit roten Pixel als Workaround, (x, y) Array von Koorden verwendet für die Initialisierung von Poly
%Vor%// zeichne und rotiere Poly
%Vor%Seit den letzten Aktualisierungen von LibGDX verwendet @Rus antwort veraltete Funktionen. Ich gebe ihm jedoch Punkte für die neue aktualisierte Version:
%Vor%Für gute Triangulationsalgorithmen, wenn Ihr Polygon nicht konvex ist, siehe den fast linearen Algorithmus von Toussaint (1991)
Effiziente Triangulation einfacher Polygone, Godfried Toussaint, 1991
Ich glaube, dass die ShapeRenderer-Klasse jetzt eine Polygonmethode für vertexdefinierte Polygone hat:
Sie können die ShapeRenderer
API mit Libgdx einfache, einfarbige Formen zeichnen.
Der Code, den Sie angegeben haben, ist eine sinnvolle Möglichkeit, auch Vollton-Polygone zu zeichnen. Es ist viel flexibler als ShapeRenderer
, ist aber ein bisschen komplizierter. Sie müssen glColor4f
verwenden, um die Farbe festzulegen, oder ein Usage.Color
-Attribut zu jedem Scheitelpunkt hinzufügen. Siehe das SubMeshColorTest-Beispiel für weitere Details zum ersten Ansatz und das MeshColorTexture-Beispiel für weitere Details der zweite Ansatz.
Eine weitere Möglichkeit, darüber nachzudenken, ist die Verwendung von Sprite-Texturen. Wenn Sie nur an einfachen Volltonfarben-Objekten interessiert sind, können Sie sehr einfache 1x1 Texturen einer einzelnen Farbe verwenden und das System über das Sprite ziehen lassen. Ein Großteil von Libgdx und die zugrunde liegende Hardware sind wirklich für das Rendern von Texturen optimiert, so dass Sie es vielleicht einfacher finden, es zu verwenden, selbst wenn Sie den Textur-Inhalt nicht wirklich ausnutzen. (Sie können sogar eine 1x1 weiße Textur verwenden und dann eine verwenden SpriteBatch
mit setColor
und draw()
um verschiedene Farbrechtecke einfach zu zeichnen.)
Sie können auch die verschiedenen Ansätze kombinieren und anpassen.
wollte nur meine verwandte Lösung mit dir teilen, und zwar für das Implementieren und Zeichnen einer walkZone mit scene2d . Ich musste im Grunde die verschiedenen Vorschläge der Beiträge anderer zusammenstellen:
1) Die WalkZone:
%Vor% 2) Die Screen
:
Sie können dann einen Listener in der gewünschten Stage
hinzufügen:
3) Die Implementierung:
Das an den WZ-Konstruktor übergebene Array besteht aus einer Menge von x, y, x, y ... Punkten. Wenn Sie sie gegen den Uhrzeigersinn setzen, funktioniert es (ich habe nicht anders herum überprüft, noch weiß, wie es genau funktioniert); Zum Beispiel erzeugt dies ein 100x100 Quadrat:
%Vor%In meinem Projekt funktioniert es wie ein Zauber, sogar mit sehr komplizierten Polygonen. Hoffe es hilft !!
Die meisten Antworten schlagen eine Triangulation vor, was gut ist, aber Sie können das auch mit dem Stencil Buffer tun. Es verarbeitet sowohl konvexe als auch konkave Polygone. Dies kann eine bessere Lösung sein, wenn sich Ihr Polygon stark ändert, da Sie sonst jeden Frame triangulieren müssten. Diese Lösung behandelt auch selbst schneidende Polygone, die EarClippingTriangulator
nicht enthält.
Um den Stencil Buffer zu verwenden, müssen Sie die Anzahl der Bits für den Stencil Buffer angeben, wenn Ihre App gestartet wird. Zum Beispiel, wie Sie das mit dem LWJGL2-Backend tun:
%Vor%Weitere Informationen zu dieser Technik finden Sie in einem der folgenden Links: