Isometrische Kollisionserkennung

11

Ich habe einige Probleme beim Versuch, eine Kollision zweier isometrischer Kacheln zu erkennen.

Ich habe versucht, die Linien zwischen den einzelnen Punkten auf der Kachel zu zeichnen und dann nach Linienabschnitten zu suchen, aber das hat nicht funktioniert (wahrscheinlich aufgrund einer falschen Formel).

Nachdem ich mich heute eine Weile damit befasst habe, glaube ich, dass ich zu viel darüber nachdenke und es einen einfacheren Weg geben muss.

Ich suche nicht nach Code, sondern nur nach Ratschlägen, wie Überlappungen am besten erkannt werden können

Chris Crew
quelle
4
Was genau versuchst du zu tun? Erkennen, wenn sich die Maus über einer Kachel befindet, oder erkennen, ob sich zwei Einheiten überlappen? Wenn es das spätere ist, sollten Sie wirklich darüber nachdenken, Ihr "Spiel" von der "Grafik" zu trennen
John McDonald
Ich muss es schaffen, wenn die Seite eines sich bewegenden Isokachels auf ein sich nicht bewegendes Plättchen trifft und das sich bewegende Plättchen stoppt. Ich habe nur Probleme mit dem Kollisionstest. Ich könnte eine gebundene Box verwenden, aber ich brauche die Kollision, um genau zu sein.
Chris Crew

Antworten:

23

Ich komme gleich heraus und sage, dass ich nicht weiß, wie ich das in der Frage beschriebene Problem lösen soll (Kollisionserkennung zwischen isofliesenförmigen Rechtecken), aber ich kann Ihnen sagen, wie andere es in der Vergangenheit gelöst haben ::

In anderen Spielen wird die Spielwelt von der Bildschirmwelt getrennt . Wenn Sie anfangen, ist es üblich, sich vorzustellen, dass sie dasselbe sind, aber dann führt dies zu Problemen wie dem, das Sie beschreiben.

Die allgemeine Idee ist, dass die Spielwelt vollständig im Speicher gespeichert ist, hinter den Kulissen sind es nur Zahlen, Referenzen und Logik. Die Tatsache, dass Sie die Spielwelt isometrisch zeichnen, spielt keine Rolle. Ihre Spielwelt sollte nicht das Konzept einer Isometrie oder eines Quadrats haben oder auch nicht, wenn der Bildschirm als 3D gezeichnet wird. All dies wird erledigt, wenn Sie die Spielwelt auf den Bildschirm (auch bekannt als Bildschirmwelt ) zeichnen . Die Spielwelt sollte auf die einfachste Art und Weise gespeichert und gepflegt werden, die für das Spiel sinnvoll ist. Bei isometrischen Spielen ignorieren Sie normalerweise die Tatsache, dass es sich um eine ISO handelt, und speichern die Positionen stattdessen so, als ob Sie ein achsenausgerichtetes Gitter verwenden würden. Die meisten Spiele haben Methoden zum Konvertieren von Koordinaten zwischen den beiden Welten, ich nenne meine ScreenToWorld(x, y)undWorldToScreen(x, y). Die Konvertierung erfolgt häufig mit Matrix-Mathematik, kann aber auch auf andere Weise erfolgen. Sie verwenden ScreenToWorld, wenn Sie die Maus verwenden, und WorldToScreen, wenn Sie zeichnen.

Die Aufteilung der Spielwelt und der Bildschirmwelt bietet mehrere Vorteile . Einer der Vorteile ist, dass Kollisionserkennung und -bewegung alle in der Spielwelt stattfinden und daher normalerweise recht einfach sind, da Sie nicht mit einem schrägen Gitter oder verzerrten Koordinaten zu tun haben oder wo sich der Bildschirm befindet usw. In Ihrem Fall Sie würden es mit achsenausgerichteten Rechtecken und Quadraten zu tun haben. Sobald die Spielwelt aktualisiert wurde, zeichnen Sie eine Darstellung der Spielwelt auf den Bildschirm, Stichwort: Darstellung. Es mag zunächst kontraintuitiv erscheinen, aber Ihr Bildschirm ist nur eine Darstellung dessen, was in der Spielwelt vor sich geht. Dies ermöglicht Dinge wie dedizierte Server und terminalähnliche Clients.

FreeCiv ist tatsächlich ein großartiges Beispiel für all diese Dinge. Sie können dieselbe exakte Welt wie jede andere anzeigen: ein quadratisches Nord / Süd-Gitter, eine isometrische oder sogar eine hexadezimale. Jedes Spiel, das Sie ausführen, verfügt über einen dedizierten Server, der im Hintergrund ausgeführt wird, auch für Einzelspieler-Spiele. Daher ist der Client auch nur ein Anzeigeport, nichts weiter.

Lange Rede kurzer Sinn : die Spielwelt und Logik aus dem Bildschirm Welt vereinfacht die Spiellogik trennen, reduziert das Spiel <-> Anzeige Kopplung , und wiederum macht Kollisionserkennung zwischen „iso“ Fliesen leichter zu handhaben und leichter zu visualisieren.

John McDonald
quelle
Vielen Dank für die gut erläuterte Antwort. Ich habe die Logik in das, was gezeichnet wurde und was im Hintergrund passiert, getrennt, aber ich habe alles als schräges Gitter behandelt.
Chris Crew
1
Für Menschen der Zukunft; Grafiken sind eine Interpretation von Daten. Die vier Hauptteile eines Spiels: Logik, Daten, Eingabe, Ausgabe. Vermeiden Sie es, sie zusammenzufassen. Auch ausgezeichnete Antwort John, +1
Aarowaim
9

Johns Antwort ist ganz richtig, aber ich werde versuchen, es anders zu erklären:

Es gibt keine isometrische Kollisionserkennung.

Die Kollisionserkennung kümmert sich nicht darum, wie Ihre Projektionsmatrix / -transformation aussieht. Die Kollisionserkennung sollte keine Rolle spielen, wenn Sie überhaupt etwas rendern (schließlich können Objekte, die sich außerhalb des Bildschirms befinden, immer noch kollidieren, oder?)

Es ist eine philosophischere Frage: Kollidiert ein Baum, der in einen Wald fällt, immer noch mit dem Boden, wenn niemand da ist?

Konventionelle Weisheit würde sagen: Ja. Es ist egal, wie du es betrachtest. Dinge kollidieren im Weltraum, nicht im Sichtraum.

MarkR
quelle
2
+1 Gut ausgedrückt. "Es gibt keine isometrische Kollisionserkennung"
John McDonald
1
Danke, ich habe gerade gesagt, was du schon gesagt hast. Aber ein bisschen anders.
MarkR
0

Sie können versuchen, ein Array von Pixeln zuzuweisen, das eine Bitmap aller getRGB () -Werte jedes einzelnen Pixels erstellt. Vergleichen Sie dann die Werte mit einer if-Anweisung, da die Ränder der Kachel einen anderen Farbwert haben als der Wert der Kachel (Wasser, Sand, Gras). Das für ein grundlegendes isometrisches Gitter. Oder Sie können zwei Ebenen der Karte selbst haben. Eine Ebene, die wie ein grüner Bildschirm den Umriss jedes Repräsentanten eines kollidierenden Objekts zeichnet, und die andere Ebene ist die Karte selbst.

Sie erstellen nicht für jedes Pixel der Kartenebene ein Bitmap-Array, sondern möchten eine Reihe von Farben berechnen, die die Auswirkungen darstellen, die ein Objekt hat, wenn es den Rand des beibehaltenen Farbwerts kollidiert / schneidet. Entweder möchten Sie, dass die Werte an Wert verlieren oder die Geschwindigkeit zunimmt, mit der sich das Objekt bewegt. Jedes Objekt, das sich bewegt, ist nur ein Duplikat des Speichers, der an einer anderen Stelle gespeichert ist.

Ich würde mich mit pixelgenauer Kollision und dem Verständnis von Bitmap-Arrays befassen. Jedes Rechteck ist eine Grenze, die replizierende Daten enthält, ähnlich wie aufgedruckter Speicher. Jedes Ereignis wird ausgelöst, je nachdem, wo ein Objekt an einem Ort oder Vektor gerendert wird. Jeder Punkt auf dem Bildschirm befindet sich in einer 2D-Ebene, nur die Schattentiefe vermittelt die Illusion, dass sich das Objekt als 3D darstellt. Die Transformation von Formen in einem Versatz gibt den Eindruck, dass sich das Objekt in einem Winkel befindet. Es gibt einen Mittelpunkt, an dem die Kamera ihre Ansicht präsentiert. Alles wird um diesen Mittelpunkt herum getragen, wobei sich die Größe von ihm wegbewegt, wobei die Größe abnimmt oder die Größe zunimmt.

Олег Игоревич
quelle