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.
Antworten:
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 :
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):
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
quelle
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.
quelle