Ich habe Probleme beim Sortieren von Akteuren in einem LibGdx Stage-Objekt. Wenn die Bühne gerendert wird, werden die Bilder in der Reihenfolge wiedergegeben, in der sie hinzugefügt wurden. Bühne verwendet ein Array, um die Akteure zu halten. Ich habe versucht, den ZIndex jedes Schauspielers zu setzen, aber es sortierte immer noch nicht. Dann habe ich versucht, ein Vergleichsobjekt wie folgt zu erstellen:
%Vor%und dann, wenn ich den tatsächlichen Vergleich machen möchte, habe ich:
%Vor%Es gibt mir den folgenden Fehler und kompiliert nicht:
%Vor%Ich habe keine Ahnung, was ich falsch mache. Kann mir das jemand erklären?
Sieht so aus, als würde Ihr Code Stage.getActors()
eine Array
von Actors
anstelle von List
zurückgeben.
Collections.sort()
Methode akzeptiert nur Listen.
Probieren Sie:
Aktualisierung beim Sortieren (nach Z-Index in der Frage) von @James Holloway: Der Z-Index wird von der Stufe außer Kraft gesetzt, um die interne Ordnung des Arrays zu sein. Das Setzen des Z-Index hat also keine Auswirkungen, es sei denn, Sie legen den Wert höher als die Länge der Liste fest und dann wird das Bild einfach über die Liste gesetzt (interne Bühne tut dies). Dies wird durch Sortieren nach Name oder ID gelöst.
Anstatt der angenommenen Antwort, mag ich es besser, mehrere "Ebenen" -Gruppen vorzubereiten und dann zu dieser Gruppe hinzuzufügen, in welcher Reihenfolge es mir gefällt.
%Vor% (Natürlich ist der addActor()
-Auftrag immer noch relevant für Elemente von bg
und zwischen Elementen von fg
, aber nicht zwischen einem Element von fg
und einem Element von bg
.)
Dieser Workflow funktioniert gut in einem Vererbungsszenario, in dem die Basisklasse geschützte Gruppenebenen besitzt ( this.bg
, this.fg
, ...) und diese der Reihe nach hinzufügt. Dann kann die abgeleitete Klasse diesen Ebenen Elemente hinzufügen, ohne sich um die Reihenfolge zu kümmern.
Wahrscheinlich nicht für alle Fälle geeignet, aber ich benutze LibGdx Actor.userObject zum Speichern meines Z-Index und dann basierend darauf eine automatische Sortierung. In deiner Bildschirm- oder Spielklasse:
%Vor%und dann fügen Sie Akteure hinzu, die die neue addActor-Methode verwenden (nicht stage.addActor):
%Vor%Dies vermeidet auch das Sortieren des Arrays bei jedem Render-Aufruf. Hoffe es hilft!
Ich habe einen Gleitwert verwendet, um meine Spieler zu sortieren. Größer der Wert höher der Index des Spielers. Hier ist mein Ausschnitt: -
%Vor%Meine Lösung funktioniert für mich in Schnelltests, aber es kann immer noch einige Fehler geben. Wenn Leute etwas entdecken, dann bitte schreien, aber das funktioniert gut für mich und ist ziemlich leicht.
Ich betreibe es nur auf meinen Karten (ich schreibe ein Kartenspiel), also passt es nur die Kartenklassen an, die auf der Bühne sind, und sie werden möglicherweise immer über anderen Dingen wie Tabellen / Labels usw. stehen.
Ich habe meiner Klasse eine lokale int zIndex
hinzugefügt, die im Vergleicher verwendet wird und am Anfang der Methode setZIndex steht.
Der Anfangsteil der Methode wird vom Original in der Actor-Klasse aufgehoben.
%Vor%EINFACHE LÖSUNG !! Ich schäme mich dafür, dass es so lange gedauert hat, bis es dazu gekommen ist ...
Erstellen Sie eine "ZStage" -Klasse, die Stage erweitert. Überschreiben Sie die Methode getActors. Bubble - Sortiere die Akteure basierend auf ihrem Y-Index, um ihre Renderreihenfolge zu erhalten.
public class ZStage erweitert die Phase {
%Vor%}
Ich habe alle meine Darsteller eine DepthActor
Klasse erweitern, die einen Tiefenwert enthält und implementiert Comparable<DepthActor>
:
Dann ist das Sortieren an Ort und Stelle trivial:
com.badlogic.gdx.utils.Sort.instance().sort( stage.getActors() );