Okay, das ist ein Problem, das ich schon seit einiger Zeit herauszufinden versuche. Meins ist ein 2D-Plattformspiel mit einer Welt aus (normalerweise) unbeweglichen Kacheln und mobilen Sprites, die beide AABBs verwenden, um ihre Hitboxen darzustellen. Dieses Spiel ist aufgrund einiger Komplikationen beim Verschieben von Kachelebenen NICHT gitterbasiert.
Ich kann Kollisionen erkennen und die Tiefe der Kollision leicht herausfinden. Ich verwende die "Methode der flachsten Achse", um zu bestimmen, wie eine Kollision zwischen dem Sprite und der Kachel gelöst werden kann. Wenn das Sprite horizontal tiefer als vertikal ist, ist die aufzulösende Richtung entweder oben oder unten. Wenn das Sprite vertikal tiefer als horizontal ist, ist die aufzulösende Richtung entweder links oder rechts.
Das ist einfach genug und funktioniert ziemlich gut. Das heißt, bis ein Sprite mit mehr als einer Kachel kollidiert. Da von Natur aus jede Kollision separat überprüft werden muss, können unterschiedliche Kollisionen unterschiedliche Auflösungsrichtungen haben. Wenn beispielsweise ein Sprite versucht, über eine Reihe von Kacheln zu laufen, schneiden sie für einen Frame die nächste Kachel wie z dass die horizontale Tiefe kürzer als die vertikale Tiefe ist. Wenn die Kollision "links auflösen" lautet, wird sie zurückgeschoben und bleibt an der Ecke hängen.
Ich habe über dieses Problem schon seit einiger Zeit nachgedacht, und es sind mehrere Lösungen zu mir gekommen, aber alle haben Mängel. Ich könnte bestimmte Seiten als nicht erreichbar markieren, aber ohne eine gitterbasierte Engine ist die Bestimmung der "Nichterreichbarkeit" bemerkenswert komplex, insbesondere wenn sich bewegende Kachelschichten immer möglich sind.
Eine andere mögliche Methode wäre, Kollisionen vorherzusagen, bevor sie auftreten, und die Bewegung bis zum Punkt der Kollision "zurückzuarbeiten", nehme ich an, aber ich bin mir nicht sicher, wie die Mathematik dafür funktioniert.
Ich habe das Gefühl, dass mir etwas unglaublich Offensichtliches fehlt, zumal Spiele aus den 80ern dieses Problem bereits gelöst haben.