Wie sortieren Sie Actors in einer libgdx Stage?

7

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?

    
Lokiare 21.04.2013, 09:51
quelle

7 Antworten

10

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:

%Vor%

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.

    
Ezhil V 21.04.2013, 09:57
quelle
15

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.

    
mdup 09.07.2013 21:07
quelle
0

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!

    
Diego Schvartzman 11.04.2015 07:22
quelle
0

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%     
Rakesh Yadav 31.12.2015 06:45
quelle
0

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%     
Russ Wheeler 03.01.2016 14:34
quelle
0

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%

}

    
Kevin R 15.04.2017 19:22
quelle
0

Ich habe alle meine Darsteller eine DepthActor Klasse erweitern, die einen Tiefenwert enthält und implementiert Comparable<DepthActor> :

%Vor%

Dann ist das Sortieren an Ort und Stelle trivial:

com.badlogic.gdx.utils.Sort.instance().sort( stage.getActors() );

    
EntangledLoops 02.05.2017 20:00
quelle

Tags und Links