Wie finde ich den Aufprallpunkt bei der 2D-Kollisionserkennung pro Pixel?


7

Ich erstelle einen Plattformer und habe die Kollisionserkennung pro Pixel implementiert. Dies hat jedoch 2 Hindernisse verursacht, die ich noch nicht herausgefunden habe. Das erste Hindernis, um das es bei dieser Frage geht, ist, dass ich nicht weiß, wie ich den Aufprallpunkt effizient finden kann (mein anderes Problem wird wahrscheinlich eine andere Frage in diesem StackExchange sein).

Ich habe meinen Charakter mit einer bestimmten Geschwindigkeit in Pixel fallen oder springen lassen. Das heißt, in jedem Frame kann das Zeichen beispielsweise um 4 Pixel fallen oder um 4 Pixel springen. Wenn der Charakter fällt und ein Objekt schneidet, sollte der Charakter auf diesem Objekt landen (und umgekehrt, wenn er springt und ein Objekt trifft, sollte er wieder fallen). Wenn ein Zeichen beispielsweise zum Beispiel 4 Pixel fällt und dadurch 3 Pixel in ein Objekt eingefügt werden, hören sie auf zu fallen, befinden sich jedoch nicht an der richtigen Stelle. Das Zeichen sollte beim ersten Pixel des Aufpralls anzuhalten scheinen.

Wie kann ich den Aufprallpunkt effizient finden? Ich habe nur eine vage Idee, nur die Umrisspixel zu vergleichen, auf Kollision zu testen und sie um eins nach oben oder unten zu erhöhen, bis es zu einer Kollision kommt, aber es scheint kompliziert zu sein, sie abzubrechen.

Wenn Sie die Plattform kennenlernen möchten, entwickle ich mit XNA für Windows Phone 7.


3
Verwandte, wahrscheinliche Betrogene (in Bezug auf Antworten): gamedev.stackexchange.com/questions/2942/…
Tetrad

@ Tetrad, danke. Ich hoffe, Sie können verstehen, warum ich nicht daran gedacht habe, nach einer Frage zu Raketen- und Geländekollisionen zu suchen: P Es ist nicht ganz das Spiel, das ich entwickle
Bob,

Haben Sie über Box2D-Physik nachgedacht?
user712092

Möglicherweise treten Probleme auf, die als Tunneling bezeichnet werden .
user712092

Wenn Sie dies noch nicht getan haben, fügen Sie Ihren Suchanfragen "Sweep" hinzu. Dynamische Kollisionserkennungsalgorithmen verwenden häufig einen Sweep-Parameter, um den frühesten Kollisionspunkt zu erhalten.
Sam Hocevar

Antworten:


5

Ich habe zuvor einen wirklich guten Artikel gelesen, in dem beschrieben wurde, wie die Kollisionserkennung in früheren Sonic-Spielen implementiert wurde.

Dieser Artikel wäre eine hervorragende Referenz für diesen Thread gewesen, aber ich kann ihn im Moment einfach nicht finden. Wenn ich das tue, werde ich meinen Beitrag aktualisieren. In der Zwischenzeit werde ich versuchen, es aus dem Gedächtnis zu nehmen!

Ich glaube, diese Technik ist sehr interessant und könnte Ihre Probleme lösen, ohne auf eine Physik-Engine umsteigen oder die Kollision pro Pixel vollständig loslassen zu müssen.

Im Grunde , was der Artikel beschrieben wurde eine Kachel-basierte Plattform - Engine , wo jede Kachel Typ pro Pixel hatte Kollisionsdaten wie folgt aus :

Fliese

Aber dein Charakter hatte nur eine begrenzte Anzahl von Kontaktpunkten. Zum Beispiel erinnere ich mich in dem Artikel, dass es nur 3 Pixel in der Nähe von Sonic's Kopf gibt (eines links vom Sprite, eines in der Mitte und eines rechts), die zur Kollisionserkennung beim Springen verwendet werden, 3 Pixel in der Nähe von Sonic's Füßen Erkennen Sie Kollisionen mit dem Boden und 2 in der Nähe der Mitte auf jeder Seite, um Kollisionen mit Wänden zu erkennen.

Ich mache nur ein kurzes Modell von dem, woran ich mich erinnere. So etwas wie (verlasse dich nicht auf die Genauigkeit meiner Pixelplatzierung, ich habe sie nur erfunden):

Sonic

Auf diese Weise müssen Sie nur anhand dieser einzelnen Punkte (welche von der Situation abhängen, z. B. Springen oder Fallen) auf Kollision prüfen. Im Falle einer Kollision müssen Sie das Sprite nur anhand dieser Punkte anpassen. Wenn beispielsweise einer der oberen Punkte mit einem blockierten Pixel in der Deckenplatte kollidierte, mussten Sie das Sprite nur herunterfahren, bis dieser Punkt nicht mehr kollidierte.

Bearbeiten

Dies ist zwar immer noch nicht der Link, den ich ursprünglich gelesen habe, aber er erwähnt auch die Kollisionspunkte (benannte Sensoren ) und sollte viele Informationen geben. Lesen Sie auch die anderen Abschnitte des Handbuchs!

http://info.sonicretro.org/SPG:Solid_Tiles


Das lässt mich daran denken, als ich jünger war, wie 8 Jahre alt, und einige Spiele mit Multimedia Fusion machen. Wir haben diese "Sensoren" als Balken unten, oben und nach Zeichen verwendet. und es hat alles sehr gut geschafft!
Gustavo Maciel

2

Zunächst einmal würde ich mich aus offensichtlichen Leistungsgründen nicht für eine pixelgenaue Kollisionserkennung in einem mobilen 2D-Plattformspiel entscheiden. Diese Art von Überprüfungen ist CPU-intensiv. Wenn Sie keine umfassende Überprüfung durchführen, um getrennte Objekte zu filtern, wirkt sich dies sicherlich negativ auf Ihr Spiel aus.

Ich würde Begrenzungsrahmen und / oder Kugeln verwenden (abhängig von den Formen Ihrer Entitäten). Die Erkennungsqualität wäre gut genug. Sie können sogar mehr als eine Form verwenden, um eine Entität zu modellieren. Tests zwischen diesen Formen sind einfach und Sie können Aufprallpunkte kennen und Entitätspositionen festlegen.

Wenn Sie jedoch nicht alles selbst implementieren möchten, möchten Sie möglicherweise Box2DX (C # -Port von Box2D) verwenden und nur den Kollisionserkennungsteil der Bibliothek verwenden.


Danke für den Link zu Box2D, ich werde mich darum kümmern. Was die Leistung angeht, sind meine Sprites sehr klein und "old school", aber vergrößert, sodass es nicht zu viele Pixel gibt, gegen die man sie testen kann. Ich überprüfe auch zuerst Begrenzungsrechtecke und mache nur pro Pixel, wenn sich die Grenzen schneiden. Ich mache pro Pixel, weil die Pixel so groß sind (vergrößert werden), dass es nicht gut aussieht, wenn sie nicht richtig interagieren.
Bob
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.