Angenommen, Ihre Sprites belegen Gruppen von Kacheln, bei denen es sich um Rechtecke handelt (wenn sie beliebige Gruppen belegen, können Sie im allgemeinen Fall die Kacheln überhaupt nicht richtig zeichnen), besteht das Problem darin, dass zwischen den Elementen keine Beziehung zur Gesamtreihenfolge besteht und Sie daher nicht sortieren können Sie verwenden eine Sortierung, die zu O (nlogn) -Vergleichen führen würde.
Beachten Sie, dass für zwei beliebige Objekte A und B entweder A vor B (A <- B), B vor A (B <- A) oder in beliebiger Reihenfolge gezeichnet werden kann. Sie bilden eine Teilordnung. Wenn Sie sich selbst einige Beispiele mit 3 überlappenden Objekten zeichnen, werden Sie feststellen, dass das 1. und das 3. Objekt sich möglicherweise nicht überlappen und somit keine direkte Abhängigkeit haben. Ihre Zeichenreihenfolge hängt vom 2. Objekt ab, das zwischen ihnen liegt - je nachdem, wie Wenn Sie es platzieren, erhalten Sie unterschiedliche Zeichenreihenfolgen. Fazit: Traditionelle Sorten funktionieren hier nicht.
Eine Lösung besteht darin, den Vergleich (von den Dani erwähnt) zu verwenden und jedes Objekt mit dem anderen Objekt zu vergleichen, um deren Abhängigkeiten zu bestimmen und einen Abhängigkeitsgraphen (der eine DAG sein wird) zu bilden. Führen Sie dann eine topologische Sortierung im Diagramm durch, um die Zeichenreihenfolge zu bestimmen. Wenn nicht zu viele Objekte vorhanden sind, ist dies möglicherweise schnell genug O(n^2)
.
Eine andere Lösung besteht darin, einen (zum Ausgleichen - Pseudo- ) Quad-Baum zu verwenden und die Rechtecke aller Objekte darin zu speichern.
Durchlaufen Sie dann alle Objekte X und überprüfen Sie mithilfe des Quad-Baums, ob sich Objekte Y in dem Streifen über dem Objekt X befinden, der ganz links beginnt und mit der ganz rechten Ecke von Objekt X endet - für alle diese Objekte Y, Y < - X. So müssen Sie immer noch ein Diagramm erstellen und topologisch sortieren.
Aber du kannst es vermeiden. Sie verwenden eine Liste von Objekten Q und eine Tabelle von Objekten T. Sie iterieren alle sichtbaren Slots von kleineren zu größeren Werten auf der x-Achse (eine Zeile), wobei Sie auf der y-Achse zeilenweise gehen. Befindet sich an diesem Steckplatz eine untere Ecke eines Objekts, gehen Sie wie oben beschrieben vor, um Abhängigkeiten zu ermitteln. Wenn ein Objekt X von einem anderen Objekt Y abhängt, das teilweise darüber liegt (Y <- X), und jedes Y bereits in Q ist, addiere X zu Q. Wenn es ein Y gibt, das nicht in Q ist, addiere X zu T und bezeichnen Y <- X. Jedes Mal, wenn Sie Q ein Objekt hinzufügen, entfernen Sie Abhängigkeiten von Objekten, die in T anstehen. Wenn alle Abhängigkeiten entfernt werden, wird ein Objekt von T nach Q verschoben.
Wir gehen davon aus, dass Objekt-Sprites nicht aus ihren Schlitzen unten, links oder rechts herausschauen (nur oben, wie Bäume in Ihrem Bild). Dies sollte die Leistung für eine große Anzahl von Objekten verbessern. Dies wird wieder O(n^2)
der Fall sein , jedoch nur im schlimmsten Fall, der Objekte mit seltsamer Größe und / oder seltsame Konfigurationen von Objekten umfasst. In den meisten Fällen ist es O(n * logn * sqrt(n))
. Wenn Sie die Höhe Ihrer Sprites kennen, können Sie das Problem beheben sqrt(n)
, da Sie nicht den gesamten Streifen oben überprüfen müssen. Abhängig von der Anzahl der Objekte auf dem Bildschirm können Sie versuchen, den Quad-Baum durch ein Array zu ersetzen, das angibt, welche Slots belegt sind (sinnvoll, wenn viele Objekte vorhanden sind).
Sie können diesen Quellcode auch auf Ideen überprüfen: https://github.com/axel22/sages/blob/master/src/gui/scala/name/brijest/sages/gui/Canvas.scala