Gibt es einen bekannten Weg (oder ein wiederverwendbares Codebit) für die pixelgenaue Kollisionserkennung in XNA?
Ich gehe davon aus, dass dies auch Polygone (Kästchen / Dreiecke / Kreise) für einen ersten Durchgang, einen Schnelltest für Kollisionen, verwenden würde. Wenn dieser Test eine Kollision anzeigt, würde nach einer Kollision pro Pixel gesucht.
Dies kann kompliziert sein, da wir Skalierung, Rotation und Transparenz berücksichtigen müssen.
WARNUNG: Wenn Sie den Beispielcode aus dem Link der folgenden Antwort verwenden, beachten Sie, dass die Skalierung der Matrix aus gutem Grund auskommentiert ist. Sie müssen es nicht auskommentieren, damit die Skalierung funktioniert.
xna
2d
collision-detection
ashes999
quelle
quelle
Antworten:
Ich sehe, dass Sie die Frage als 2d markiert haben, also werde ich fortfahren und meinen Code ausgeben:
Bearbeiten : Während dieser Code fast selbsterklärend ist, habe ich mich schlecht gefühlt, weil ich keine Kommentare hatte, also habe ich einige hinzugefügt;) Ich habe auch die bitweisen Operationen entfernt, da sie im Grunde das tun, was die Color.A-Eigenschaft auf kompliziertere Weise tut ;)
quelle
Bounds
?CollidesWith(Sprite other, bool calcPerPixel = true);
:)Auf dem App Hub gibt es ein sehr altes Beispiel, das Sie durch die 2D-Kollisionserkennung von einfachen Begrenzungsrahmen bis hin zu pixelgetesteten Sprites mit gedrehten und skalierten Sprites führt. Es wurde vollständig auf 4.0 aktualisiert. Die ganze Serie ist eine Lektüre wert, wenn Sie mit dem Thema noch nicht vertraut sind.
http://xbox.create.msdn.com/en-US/education/catalog/tutorial/collision_2d_perpixel_transformed
Ich fand Riemer Grootjans Ansatz auch in seinem 2D-Shooter-Spiel interessant. http://www.riemers.net/eng/Tutorials/XNA/Csharp/series2d.php
(Es dauert eine Weile, bis er dahin kommt ... http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series2D/Coll_Detection_Overview.php ... aber vielleicht möchten Sie mitmachen, um das zu sehen Problem, das er löst)
Ich warne Sie jedoch davor, dass Riemers Sample nicht XNA 4.0 ist und Sie möglicherweise ein wenig arbeiten müssen, um es zum Laufen zu bringen. Es ist jedoch keine schwierige oder mysteriöse Arbeit.
quelle
Ich empfehle, eine Schwarz-Weiß-Kollisionskarte zu erstellen. Programmieren Sie es so, dass die schwarzen Pixel Kollisionspunkte sind. Geben Sie dem Charakter auch eine Kollisionskarte. Verwenden Sie bei der Verarbeitung von Karten einen Algorithmus, der große Quadrate schwarzer Pixel in Kollisionsrechtecke umwandelt. Speichern Sie diese Rechteckdaten in einem Array. Sie können die Funktion Rechteck-Schnittpunkte verwenden, um nach Kollisionen zu suchen. Sie können die Kollisionskarte auch mit der Textur transformieren.
Dies ähnelt der Verwendung einer Kollisionsmatrix, ist jedoch fortgeschrittener und Sie können sie transformieren! Überlegen Sie, ob Sie ein Tool zur Erstellung von Kollisionskarten erstellen möchten, wenn Sie es benötigen. Wenn Sie es schaffen, teilen Sie den Code bitte mit anderen!
quelle