Rendering order auf einem ismetrischen Grid

Eichelhäer

Bekanntes Mitglied
Hi,

ich bin gerade dabei eine Art rendering order für mein isometrisches Spielfeld zu erstellen. Dazu habe ich mir die ArrayList mit allen GameObjekten genommen und diese dann mit Collections.sort versucht zu sortieren. Allerdings klappt das nicht so ganz, denn mein Comparator liefert die falschen Werte. Ich versuche Punkte zu vergleichen bzw. bounding Boxen. Hier mal der Code:

Java:
Collections.sort(gameObjects, new Comparator<>() {
            @Override
            public int compare(GameObject o1, GameObject o2) {
                
                // Wenn y gleich ist dann vergleiche die x position
                
                if(o1.boundingBox.getBounds().y == o2.boundingBox.getBounds().getY()) {
                    return Double.compare(o1.boundingBox.getBounds().getX(),o2.boundingBox.getBounds().getX());
                }
                
                // sonst vergleiche mimmer die y position
                
                return Double.compare(o1.boundingBox.getBounds().getY(),o2.boundingBox.getBounds().getY());
            }
        });

Die GameObjekte haben unterschiedliche Größen so ist ein Gebäude z.B. 120x60 groß während ein Baum 40X40 groß ist.

Ich hoffe jemand kann mir da helfen.

MfG


Eichelhäer
 

KonradN

Super-Moderator
Mitarbeiter
Erst einmal wäre es super, wenn Du mehr Informationen geben könntest. Wann liefert Dein Comparator welche falschen Werte?

Was auffällt: Double mit == zu vergleichen ist in der Regel nicht, was man machen will. In der Regel werden minimale Abweichungen erlaubt. Das kann man z.B. prüfen über die Prüfung ob der absolute Wertes (Math.abs) der Differenz kleiner als die Schwelle Epsilon ist.

Hintergrund ist, dass Gleitkommazahlen eine begrenzte Genauigkeit haben und daher bei Berechnungen Ungenauigkeiten einfließen.

Dann noch zwei Hinweise zu Deinem Code:
a) Funktionale Interfaces bitte nie als innere Klasse implementieren. Das ist extrem unleserlich - auch daran zu erkennen, dass Du da Kommentare in den Code eingefügt hast. Mit Java 8 wurden dazu Lambda Expressions und Methodenreferenzen eingeführt. Damit hättest Du eine Methode schreiben können, die im Namen genau aussagt, was diese macht was dann den Nebeneffekt hat, dass da weitere Kommentare unnötig werden. Und wenn das nicht ausreicht, dann ist das eine Sache für ein JavaDoc Kommentar vor der Methode.

b) Comparatoren einfach über Comparator.comparing(..).thenComparing(...) aufbauen. Das ist sehr kurz und zugleich gut lesbar. (Aufpassen: statt comparing muss teilweise der Typ angegeben werden ... bei double wäre es comparingDouble(...) )
 

Eichelhäer

Bekanntes Mitglied
Danke für die Antwort. Ich glaube ich lese mich erstmal noch etwas mehr in Comparatoren ein. Im Grunde genommen liefert der Comparator keine falschen Werte die Darstellung ist nur eine falschen, d.h. ,dass die render order die ich damit erzielen wollte eine andere ist. so werden an verschiedenen stellen größerer y werte hinter kleineren gezeichnet und an wieder anderen nicht. Ich glaube es liegt nicht unbeding an dem ==, denn ich verwende ganzzahlen zum vergleich und die sind eindeutig ( war blos ein tippfehler mit dem getX() bzw. getY(), das sollte x bzw y heißen).

Könntest du bitte ein konkretes Beispiel zu deinem Comparatoraufbau zeigen bitte? Ich kenne diese Konstruktion nicht.
 

httpdigest

Top Contributor
Wenn dein Koordinatenursprung für y nicht "unten" sondern "oben" ist, wie es bei den meisten Window-Koordinatensystemen wie etwa für AWT oder Swing oder JavaFX der Fall ist, dann musst du nicht nur die y-Koordinate der Rechtecke berücksichtigen, sondern eben auch die Höhe (also bounds.getHeight()). Die Linie der höchsten Y Koordinate (y + height) definiert dann also die Zeichenreihenfolge und nicht die Linie der niedrigen Y-Koordinate (y) - weil höhe Y-Werte ja "weiter unten" im Window-Koordinatensystem sind.
 

KonradN

Super-Moderator
Mitarbeiter
Könntest du bitte ein konkretes Beispiel zu deinem Comparatoraufbau zeigen bitte? Ich kenne diese Konstruktion nicht.
Dein Sort Aufruf wäre etwas wie:

Java:
Collections.sort(
    gameObjects,
    Comparator.comparingDouble( o -> o.boundingBox.getBounds().getX() )
              .thenComparingDouble( o -> o.boundingBox.getBounds().getY() )
);

Wenn Du Dir die Dokumentation anschaust (https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Comparator.html), dann siehst Du, dass da bei comparingDouble eine ToDoubleFunction<T> als Parameter benötigt wird. Also eine Methode, die in Deinem Fall ein GameObject als Parameter bekommt und ein double zurück gibt. Und das ist dann hier der Lambda Ausdruck.
 

Eichelhäer

Bekanntes Mitglied
Ok danke. Und wie sähe dann die konkrete Implementierung für ein isometrisches Grid aus? Sorry, dass ich so direkt frage, aber ich sitze schon sehr lange daran.
 

Eichelhäer

Bekanntes Mitglied
Ok, ich habe es. Ich habe einfach den Mittelpunkt der BoundingBox des jeweils mittleren Tiles eines GameObjects genommen. Und anschließend dessen screeny werte verglichen. Das funktioniert wunderbar.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Game-Rendering Spiele- und Multimedia-Programmierung 5
T Java3D Rendering Problem Spiele- und Multimedia-Programmierung 7
E Active Rendering im FSEM auf ein JPanel? Spiele- und Multimedia-Programmierung 4
Steev Software Rendering Spiele- und Multimedia-Programmierung 3
Z JME - Rendering in BufferedImage Spiele- und Multimedia-Programmierung 14
S Spline Rendering? Spiele- und Multimedia-Programmierung 4
R Offscreen Rendering Spiele- und Multimedia-Programmierung 2
P Wie kann ich einem Programm hinter eine GUI verstecken? Spiele- und Multimedia-Programmierung 12
J (Libgdx) animation nur einmal in einem Event aufrufen Spiele- und Multimedia-Programmierung 1
B Programmieren wie der Befehl /ban in Minecraft geblockt wird aber nicht /ban mit einem Argument Spiele- und Multimedia-Programmierung 1
P selectedItem aus einem Methodenerstellten JPanel auslesen. Spiele- und Multimedia-Programmierung 5
O Problem beim Aufrufen des Spiels von einem Menü Spiele- und Multimedia-Programmierung 7
G Entity Verwaltung in einem 2D Spiel Spiele- und Multimedia-Programmierung 1
G Collision Detection in einem 2D Sandbox Game. Spiele- und Multimedia-Programmierung 2
E Einem A*-Pfad folgen Spiele- und Multimedia-Programmierung 27
G Auf einem Stick bewegen Spiele- und Multimedia-Programmierung 5
windl MP3-Tags von einem Inputstream auslesen Spiele- und Multimedia-Programmierung 5
U DPI von einem Bild definieren Spiele- und Multimedia-Programmierung 5
X Erklärung zu einem Tic Tac Toe Spiel Spiele- und Multimedia-Programmierung 1
C Hilfe bei einem Mosaikspiel Spiele- und Multimedia-Programmierung 16
M [JOGL] Maus über einem gezeichnetem Objekt abfragen? Spiele- und Multimedia-Programmierung 5
P Winkel von einem Punkt zum anderen berechnen Spiele- und Multimedia-Programmierung 9
X Kleines Problem mit Java Reflections und einem eigenen Eventhandler Spiele- und Multimedia-Programmierung 1
S Java3D: Primitives zu einem Objekt kombinieren Spiele- und Multimedia-Programmierung 7
Fl4sh1 Datum und Uhrzeit von einem Ereignis ausgeben lassen Spiele- und Multimedia-Programmierung 3
P Frage zu einem Projekt "Einarmiger Bandit" 3 Walzen / 9 Zeichnungen BLUEJ Spiele- und Multimedia-Programmierung 10
K Grundsätzlicher Spieleaufbau an (m)einem Beispiel Spiele- und Multimedia-Programmierung 4
S Problem mit Sichtfeld/Licht in einem Raster Spiele- und Multimedia-Programmierung 5
M Farbwerte für Flächen aus einem Bild erkennen Spiele- und Multimedia-Programmierung 3
A Drehen von einem Image Spiele- und Multimedia-Programmierung 4
F Bot updaten von einem Browser game Spiele- und Multimedia-Programmierung 7
W Java3D: Kanten die hinter einem Objekt liegen werden gezeigt Spiele- und Multimedia-Programmierung 2
B Reset bei einem Spiel Spiele- und Multimedia-Programmierung 16
C auf einem PC kein mp3 unter Java Spiele- und Multimedia-Programmierung 6
A Steuerung des Bewegungsflusses bei einem Netzwerkspiel Spiele- und Multimedia-Programmierung 18
R Mehrere Shader in einem Program Spiele- und Multimedia-Programmierung 8
B Generierung einer Wertetabelle aus einem Bild Spiele- und Multimedia-Programmierung 3
Z Kugeln aufgrund von Daten aus einem Array verschieben Spiele- und Multimedia-Programmierung 2
S Probleme mit JMenu in einem JFrame mit BufferStrategy Spiele- und Multimedia-Programmierung 2
K Kanten anzeigen lassen in einem Shape3D-Objekt Spiele- und Multimedia-Programmierung 4
A Interaktion von J3D in einem Applet Spiele- und Multimedia-Programmierung 4
N In einem Kasten springende Bälle programmieren...Hilfe Spiele- und Multimedia-Programmierung 7
H Speichern und Öffnen von einem Zeichenprogramm Spiele- und Multimedia-Programmierung 4
A Wie kann ich die Dateigröße aus einem tiff auslesen? Spiele- und Multimedia-Programmierung 2
hdi mehrere Threads/Tasks in einem synchronisieren -> TaskPoo Spiele- und Multimedia-Programmierung 36
N Farberkennung und -ersetzung in einem Bild Spiele- und Multimedia-Programmierung 2
F Umsetzung von einem Partikelsystem Spiele- und Multimedia-Programmierung 4
J Java3D Rotationsproblem bei einem 3D-Maennchen Spiele- und Multimedia-Programmierung 3
B Frage zur Spielsteuerung bei einem rundenbasiertes Spiel Spiele- und Multimedia-Programmierung 5
K Seitenlänge aus einem Würfel lesen Spiele- und Multimedia-Programmierung 3
K Einzelne Pixel in einem Bild lesen Spiele- und Multimedia-Programmierung 5
T Kollisionsabfrage von einem Stein mit einem Ball Spiele- und Multimedia-Programmierung 5
G Einen gif oder jpg Datei aus einem Graphics Objekt o. JFrame Spiele- und Multimedia-Programmierung 2
A 3D Gegenstand in einem 2D Koordinatensystem darstellen. Spiele- und Multimedia-Programmierung 3
K Hilfe bei Grafikeinbindung in einem Spiel Spiele- und Multimedia-Programmierung 6
D Image.getGraphics() in einem Frame Spiele- und Multimedia-Programmierung 4
G Bufferimage bei einem Frame Spiele- und Multimedia-Programmierung 4
I Zweite Kamera in einem SimpleUniverse Spiele- und Multimedia-Programmierung 6

Ähnliche Java Themen

Neue Themen


Oben