Ich weiß genau, wie man erkennt, ob zwei oder mehr 2D-Objekte kollidieren, aber ich bin daran interessiert, wie man entscheidet, ob nach einer Kollision gesucht wird. In früheren Projekten ließ ich einfach jedes Objekt mit jedem anderen Objekt vergleichen (ich weiß, O (n ^ 2) Dummheitsgrad) und es entstand ein weniger flüssiges Gameplay.
Verschiedene Foren begrüßen die Größe von Quadtrees, B-Trees und jeder anderen Art von Baum oder Struktur, die Sie sich vorstellen können.
Was ist die effizienteste Struktur, um zu bestimmen, ob eine Kollision überprüft werden soll?
2d
collision-detection
data-structure
Mike Cluck
quelle
quelle
Antworten:
Bei einem 2D-Spiel ist ein einheitliches Raster fast immer der richtige Weg, es sei denn, die 2D-Objekte sind auf einer Seite Ihrer Karte sehr stark verteilt. Die Speicherkomplexität ist unkompliziert (proportional zu den Abmessungen Ihrer Karte) und weist bei einer angemessenen Verteilung eine Nachschlagzeit von O (1) und einen Durchschnitt von log (numberOfObjects / (Zeilen * Spalten)) ^ 2 Schnittpunkttests auf pro Zelle gemacht. Möglicherweise möchten Sie nur Zellen überprüfen, in denen sich ein Objekt bewegt hat, wodurch die statische Geometrie wesentlich effizienter wird. Es ist einfach, ein einheitliches Raster im laufenden Betrieb zu ändern (viel weniger schmerzhaft als bei baumbasierten Lösungen), und es ist einfacher zu implementieren. Das einzige Mal, wenn ich sagen würde, dass es nicht in einem 2D-Spiel verwendet werden soll, ist, wenn der Speicherbedarf eines einheitlichen Gitters zu groß wird (z. B. eine Raumsimulation, bei der die Ebenen spärlich, aber enorm sind).
quelle
2D-Physik-Engines wie Box2D und Chipmunk verwenden häufig eine räumliche Hash-Map
Weitere Informationen finden Sie unter http://chipmunk-physics.net/release/ChipmunkLatest-Docs/#CollisionDetection . Die Chipmunk-Demos enthalten einen wirklich guten räumlichen Hash-Visualizer, der deutlich macht, wie ihre Technik funktioniert.
quelle
Wenn Ihre Welt im Vergleich zu anderen eine sehr "lange" Dimension hat (nennen Sie sie X), können Sie die Objekte in einer geordneten Liste behalten, die Sie während der Bewegung neu sortieren können. Kollisionserkennung bedeutet dann, nur nach Objekten zu suchen, die Überlappung in der X-Achse.
Eine andere Möglichkeit besteht darin, aktive / passive Listen von Objekten zu führen und sich nicht um die passiven Objekte zu kümmern (die sich überhaupt nicht bewegen).
Wenn es sich um mittelgroße Objekte handelt, die für den Spieler auf dem Bildschirm sichtbar sind, ist wahrscheinlich alles gegen alles nicht schlecht.
Davon abgesehen bin ich bei Darcy, ein einheitliches Gitter ist gut.
quelle