Ich überprüfe die Kollision für einen Platformer-Charakter, wie in # 1 gezeigt. Die roten Punkte sind die Pixel, die markiert sind, und die grauen Linien geben die Achsen an, zu denen sie gehören. Ich mag die Ergebnisse, die ich erhalte, wenn ich die Kollision auf diese Weise überprüfe (im Vergleich zum Begrenzungsrahmen). Alles funktioniert genau so, wie ich es gerne hätte, bis auf ein Problem: die Erkennung von Quetschungen.
In den folgenden Bildern steht das hellblaue Kästchen für den Boden, das orangefarbene Kästchen für ein Objekt und die Pfeile für die Bewegungsrichtung.
Die einfache Lösung zum Erkennen, wann der Spieler niedergeschlagen ist, besteht darin, zu prüfen, ob die Kollisionspunkte auf den gegenüberliegenden Seiten beide ausgelöst haben. Wenn dies der Fall ist, wird der Spieler niedergeschlagen. In # 2 sehen Sie ein normales Crush-Szenario. Der Spieler ist am Boden und die oberen Kollisionspunkte schneiden sich mit dem fallenden Objekt. Dies löst einen Schwarm aus.
# 3, 4 und 5 präsentieren problematische Szenarien. In # 3 bewegt sich der Spieler auf das Objekt zu, das sich nach oben bewegt. Ein rechter Kollisionspunkt trifft auf das Objekt, verursacht eine Kollision und stoppt den Spieler.
Wenn sich das Objekt weiter nach oben bewegt und der Spieler sich weiter nach rechts bewegt (wie in # 4 gezeigt), löscht das Objekt den rechten Kollisionspunkt des Spielers und der Spieler bewegt sich nach rechts. Nachdem dies geschehen ist, schneidet das Objekt nun einen oberen Kollisionspunkt, was zu einem unerwünschten vertikalen Quetschen führt.
Ein ähnliches Szenario ist in # 5 dargestellt. Zwei Objekte sind so weit voneinander entfernt, dass die unteren Kollisionspunkte gelöscht werden und der Spieler fallen kann, aber nicht so weit, dass die seitlichen Kollisionspunkte gelöscht werden und ein unerwünschtes horizontales Quetschen verursacht wird.
Ich habe mir Gedanken über eine Lösung gemacht, aber nichts, was ich mir ausgedacht habe, hat besonders gut funktioniert. Deshalb frage ich mich, ob jemand da draußen eine Idee oder einen Einblick in die Lösung dieser Probleme hat.
Um eine gewisse Verwirrung zu beseitigen, befänden sich die roten Kollisionspunkte innerhalb des Sprites und die grauen Linien wurden nur verwendet, um die relevante Achse für jeden Kollisionspunkt zu kennzeichnen. Wenn das Sprite des Charakters beispielsweise ein einfaches grünes Quadrat wäre, würden die Kollionspunkte ungefähr so aussehen:
Die "Crush Test" -Punkte müssen sich in dem grauen Feld befinden, das in Bild 1 gezeigt wird - dh töten Sie den Player nur, wenn Sie einen Treffer auf eines der Pixel dort feststellen.
quelle
Als jemand, der mit 80eren platformers aufwachsen, ist mein erster Kommentar , dass die Kontaktstellen müssen auf dem Sprit genau sein, nicht überall außerhalb. Es gab nur wenige Erfahrungen, die frustrierender waren als zu sterben, wenn eine Waffe / ein Brecher / ein Feind eindeutig mehrere Pixel von Ihrem Charakter entfernt war - und diese Art von Erfahrung ist das, was die Leute davon abhält, zu spielen.
In diesem Sinne fliegt die Idee, getrennte Punkte für horizontale und vertikale Kollisionen zu haben, einfach nicht. Ihre Fälle 3 und 5 existieren also nicht.
Wie bereits erwähnt, müssen Sie bei der Kollisionserkennung die Bewegungsrichtung berücksichtigen, und Sie müssen zwei Bewegungsachsen berücksichtigen. Wenn ein Brecher herunterfällt, sollte der Spieler nicht in der Lage sein, vorwärts zu gehen - er sollte wie eine Wand wirken. Wenn sich also horizontale und vertikale Erkennungspunkte an derselben Stelle befinden, können Sie Fall 4 nicht erhalten, selbst wenn Sie der Mischung die Bewegungsrichtung hinzufügen.
Der sich aufwärts bewegende Brecher sorgt für zusätzliche Komplexität. Wenn es so schnell ist, dass der Spieler keine Chance hat zu entkommen, dann OK. Aber wenn es langsamer ist, wird der Spieler erwarten können, über die ansteigende Plattform zu rennen und von der anderen Seite zu springen. Das Sprite des Spielers steigt auf dem Brecher nach oben und die Quetscherkennung erfolgt an der Decke .
quelle
Sie könnten das Objekt "härter" machen als den Boden, was bedeutet, dass der Spieler bei einer Kollision "in den Boden" gedrückt "wird, anstatt" in "das sich bewegende Objekt gedrückt" zu werden.
Dies setzt voraus, dass der Spieler nicht in der Lage ist, sich selbst in Objekte oder in den Boden zu "stoßen".
quelle
Wenn Sie Überlappungen von Objekten erkennen können, ohne auf deren Anzeige warten zu müssen, besteht eine einfache Möglichkeit darin, Bewegungen für den Player und andere Objekte unabhängig voneinander pixelweise zu verarbeiten und anschließend separate Kollisionsprüfungen durchzuführen. Wenn sich der Spieler frei bewegt und durch eine solche Bewegung mit seinem Objekt kollidieren würde, ziehen Sie ihn zurück. Wenn es infolge der Bewegung des Objekts zu einer Kollision mit einem Objekt kommt, prüfen Sie, ob sich der Spieler in dieselbe Richtung wie dieses Objekt bewegen kann. Wenn ja, bewegen Sie den Player. Wenn nicht, behandeln Sie die "Crush" -Situation angemessen (Beschädigung oder Tötung des Players und / oder Rückwärtsbewegen des kollidierenden Objekts, abhängig vom Kontakt).
Übrigens, wenn nur eine begrenzte Anzahl von Kombinationen von Formen kollidieren kann, kann es nützlich sein, "Kollisionserkennungs" -Bitmaps vorab zu berechnen, so dass, wenn ein Pixel im ersten Sprite mit Versatz (x1, y1) und im zweiten gesetzt ist Bei Offset (x2, y2) der Sekunde wird das Pixel bei Offset (x1-x2, y1-y2) in der Kollisionskarte festgelegt. Eine solche vorberechnete Kollisionskarte ermöglicht es, Kollisionen zwischen den beiden Sprites zu erkennen, indem der Zustand eines einzelnen Pixels in der Kollisionskarte überprüft wird.
quelle
Es braucht zwei Objekte, um einen Spieler zu vernichten. Ihre Quetscherkennung sollte prüfen, ob sich der Spieler zwischen zwei Objekten befindet, wobei der Abstand zwischen ihnen der Größe des Spielers entspricht und die Entfernung abnimmt.
quelle
Ich finde weiter so weit zu arbeiten. Es erfordert keine "externen" Informationen über die Brecherbewegung und löst das Problem der falsch positiven Ergebnisse. Wenn ein falsches Positiv erkannt wird, wird es als Kollision behandelt (und das ist es tatsächlich):
Die Idee ist: Warum überprüfen, ob sich der Brecher bewegt, wenn es uns wirklich interessiert, ob sich der Charakter bewegt? Beide können antworten, wenn der Crush durch die eigene Bewegung des Charakters oder der Crush durch die Bewegung des Crusher-Objekts falsch positiv ist.
Wenn sich der Charakter bewegt und zerquetscht ist (Kollisionen auf den gegenüberliegenden Seiten für das eingehende Bild), überprüfen Sie die letzten Bild- / Iterationskoordinaten erneut auf Zerquetschung:
Wenn dies nicht noch einmal bestätigt wird, liegt es an der Bewegung des Charakters und der Charakter sollte genau wie bei einer Kollision zu den letzten Frame- / Iterationskoordinaten zurückgebracht werden
Wenn der Druck beim zweiten Mal bestätigt wird, fahren Sie mit dem Druck fort.
quelle