2014-02-26 6 views
8

What i needGewölbtes benutzerdefiniertes Objekt in LIBGDX zeichnen?

ich vor kurzem habe in Libgdx suchen und scheinen eine Wand geschlagen zu haben, in dem Bild zu sehen, der blaue Punkt der Benutzer Finger darstellt, ist die Karte Generation es sich von selbst, wo ich scheinen, stecken zu bleiben, tut LibGDX bietet eine Methode zum dynamischen Zeichnen von gekrümmten Objekten? Ich könnte sie einfach selbst als Bilder erzeugen, aber dann ist das Bild bis zum Punkt der Lücke riesig gestreckt, damit der Finger 3 passt! Aber auch 1000er PX müssten groß sein, um das ganze Leveldesign unterzubringen.

Ist es so, dass ich Hunderte von Polygonen nahe zusammen zeichnen sollte, um eine gekrümmte Linie zu bilden? Auf einer Seite nicht ich brauche eine Möglichkeit zu bestimmen, wenn das Objekt von unten nach oben hat, so kann ich einen anderen "Chunk" der Karte generieren.

+1

Sie können eine 'PixMap' zur Laufzeit generieren, indem Sie sie selbst zeichnen, zum Beispiel basierend auf einer' CatmullRomSpline'. – noone

+0

Haben Sie jemals eine Lösung gefunden, die für Sie funktioniert hat? –

Antwort

0

Wie wäre es mit der Erstellung eines Satzes von gekrümmten Formen, die variabel zusammengefügt werden können. Wie die Lücke in der Mitte wird am oberen und unteren Ende jedes Bildes in der Mitte sein (mit der gleichen Krümmung am Ende und Anfangspunkte) ... Und zwischen den Start- und Endpunkten können Sie verrückt auf die Form.

Und schließlich können Sie diese Bilder zufällig zusammensetzen und eine endlose Welt bekommen.

Wenn Sie nicht jedes Mal in der Mitte anhalten möchten, könnten Sie auch wie drei Ein- und Ausstiegspunkte haben (links, Mitte, rechts) ... und nach einem Bild, das links endet, brauchen Sie natürlich um ein Bild hinzuzufügen, das links beginnt, aber möglicherweise an anderer Stelle endet ...

1

Sie brauchen nicht Hunderte von Polygonen, um eine Kurve wie Sie zeichnen zu machen. Sie könnten mit 40 Quads auf der linken und 40 auf der rechten Seite kommen, und es würde ziemlich glatt aussehen. Erhöhen Sie das auf jeder Seite auf 100 und es sieht fast perfekt glatt aus, und kein modernes Gerät wird Probleme damit haben, das mit 60 fps auszuführen.

Sie können die Mesh-Klasse verwenden, um für jede Seite ein prozedurales Mesh zu generieren. Sie können das Netz an einer Stelle halten, an der Kamera festhalten und seine Scheitelpunkte und UVs so ändern, dass es so aussieht, als würden Sie einen unendlich langen Korridor schwenken. Dies wird ziemlich viel Mathe im Voraus erfordern, sollte aber glatt Segeln, sobald Sie das haben.

Grundsätzlich könnte Ihr Level-Design auf einer Art von Gleichung basieren, die Y-Offset als Eingabe verwendet. Oder es könnte eine lange Reihe von Offsets sein, und Sie könnten eine Spline-Gleichung oder eine lineare Gleichung verwenden, um zwischen ihnen zu interpolieren. Die Ausgabe würde die UV- und X-Koordinaten sein, die verwendet werden können, um jeden der Eckpunkte Ihrer zwei Netze zu aktualisieren.

Sie können den Vertex-Shader verwenden, um die UV-Koordinaten effizient zu aktualisieren, indem Sie einen konstanten Offset-Uniform-Parameter verwenden, den Sie für jeden Frame aktualisieren. Auf diese Weise müssen Sie die UV-Daten nicht für jeden Frame auf die GPU übertragen.

Verwenden Sie für die Vertexpositionen die zugrunde liegende float[] Ihres Mesh und rufen Sie jeden Frame setVertices() auf, um sie zu aktualisieren. Info here.

Eigentlich könnte es besser aussehen, wenn Sie die UV-und die X-Positionen allein lassen, und nur die Y-Positionen nach oben scrollen. Halten Sie ein paar Quads Padding oben und unten auf dem Bildschirm, und bewegen Sie einfach das oberste Quad nach unten, nachdem es vom Bildschirm scrollt.

+0

Nun, das ist sicherlich aus einer höheren Perspektive für mich sinnvoll, aber ich denke, ich habe einige Möglichkeiten, mit GDX zu gehen, bevor ich beginnen kann, dies tatsächlich im Code zu implementieren, danke für die ausgezeichnete Antwort! – Broak

Verwandte Themen