Wie kann ich feststellen, dass der Player in einem 2D-Plattformer zerdrückt ist?

19

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.

Bildbeschreibung hier eingeben

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:

Bildbeschreibung hier eingeben

IanLarson
quelle

Antworten:

34

Ich denke, Sie müssen die Bewegung der Box berücksichtigen. Das heißt, nur zerdrücken, wenn sich die Box in Richtung des Spielers bewegt.

Dies ähnelt anderen Problemen bei Plattformspielern, bei denen die Bewegung wichtig ist. Überprüfen Sie zB bei Plattformen, auf die Sie von unten springen können, nicht die Kollision, wenn sich der Spieler nach oben bewegt.

Ein Block kann den Spieler also nur dann von oben zerdrücken, wenn sich der Block nach unten bewegt. von unten nur, wenn sich der Block nach oben bewegt; nur von links, wenn sich der Block nach rechts bewegt, und so weiter.

congusbongus
quelle
13
+1 Bedenke, dass der Block hier agiert und nicht der Spieler. Wenn Sie also überprüfen, ob die Box den Spieler zermalmt, anstatt zu überprüfen, ob der Spieler zermalmt wird, sollte das Problem leichter zu lösen sein
Niels
Was ist, wenn sich die Blöcke nicht bewegen? Mir ist klar, dass ich in # 5 Pfeile auf die Blöcke gesteckt habe, aber das waren eigentlich zwei stationäre Blöcke.
IanLarson
Wenn Sie entscheiden, dass stationäre Blöcke nicht gequetscht werden sollen, stellen Sie einfach sicher, dass der Spieler nicht stecken bleibt und sich aus dem Weg bewegen kann.
congusbongus
Ich hasse es, von zwei Objekten zerquetscht zu werden, die sich tatsächlich voneinander entfernen , nur weil ich es dort pixel- und rahmengenau gemacht habe und der Entwickler faul war.
Nashorn
9

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.

Peter ist
quelle
1
Meinen Sie damit, dass zusätzliche Quetschkontrollpunkte "innerhalb" der Grenzen der Kollisionspunkte liegen? Das Problem dabei ist, dass die Kollisionsauflösung in jeder Achse auftritt, wenn einer der Kollisionspunkte "ausgelöst" wird, bevor das Objekt überhaupt die Chance hat, die inneren Quetschkontrollpunkte zu erreichen.
IanLarson
6

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 .

Graham
quelle
3
Kleiner Punkt - Sie wissen nicht, wie sein Sprite aussieht. Soweit wir wissen, könnte es genau so sein, wie es in den obigen Abbildungen dargestellt ist, sodass die Fälle 3 und 5 möglicherweise vollständig gültig sind.
Alex
1
Alex ist richtig. Ich habe eine Änderung vorgenommen, um dies zu klären. Ich bin damit einverstanden, dass es nichts Schlimmeres gibt als unbeständige Kollisionsboxen. Ich glaube, ich verstehe Ihren Punkt, dass Sie keine separaten Punkte für die verschiedenen Achsen verwenden. Wenn ich das tue, würde dies das obige Beispiel von acht Punkten auf vier in jeder Ecke ändern, richtig? Ich habe tatsächlich einige Tests in diesem Sinne durchgeführt (mit weniger als wünschenswerten Ergebnissen), aber ich zögere sehr, dies zu tun, da das "Trennen" der Ecken das von mir gesuchte Verhalten nahezu perfekt erzielt. Dies sind wirklich die einzigen Problemszenarien, in die ich geraten bin.
IanLarson
0

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".

Zamfi
quelle
0

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.

Superkatze
quelle
0

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.

Akkumulation
quelle
0

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:

  1. 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

  2. Wenn der Druck beim zweiten Mal bestätigt wird, fahren Sie mit dem Druck fort.

Nikaas
quelle