2012-04-04 8 views
0

Ich bin das Skelett für das typische Bubbleshooter-Spiel in XNA machen, und ich Probleme mit meinem Kollisionserkennungsalgorithmus mit, die im Bild erklärten hereÄrger mit Rectangles überlappende statt berührend XNA 4.0

Je Wenn sich die kollidierende Rechteckposition im Moment der Kollision befindet, wird der kollidierenden Blase eine neue Position zugewiesen.

Das Problem tritt auf, wenn ich eine Blase schieße und this passiert im Moment der Kollision. Ich habe das Debug Schritt für Schritt ausgeführt, und der Moment, wenn die Kollision passiert, ist genau wie das Bild, so dass mein Algorithmus fehlschlägt.
Ich habe versucht, die Bilder direkt zu posten, aber es scheint, ich kann nicht, da ich noch ein neuer Benutzer hier bin. Das tut mir leid.

Gibt es eine Weise, die ich erkennen kann genauwenn die Grenzen der Rechtecke einander berühren?

Antwort

1

Sie können eine Kollision pro Pixel führen stattdessen wird hier erklärt:

Click here

+0

Ich denke, das ist was ich brauche. Vielen Dank! – Sebastialonso

+0

@Sebastialonso Willkommen. – idish

+0

Es hat funktioniert ** genau ** wie ich es brauche zu arbeiten. Du solltest eine Medaille bekommen. Danke noch einmal. – Sebastialonso

0

Also, wenn ich verstehe, Ihr Problem ist, dass Sie den genauen Zeitpunkt der Kollision verpassen?

Ich vermute, dass Sie auf diskrete Weise Kollisionen berechnen, dh. selbst wenn Ihr Algorithmus 60 Mal pro Sekunde läuft, ist es nur 60 Mal, wenn eine Sekunde in eine Unendlichkeit Augenblicke unterteilt werden könnte.

Die einfache (und schlechte) Lösung besteht darin, dass sich Ihre Objekte langsamer bewegen.

Die gute eine impliziert, was passiert zwischen die Frames. Sie benötigen eine Art Richtungsvektor und die Objektgeschwindigkeit. Mit diesen beiden Werten können Sie bestimmen, wo und wann die Kollision stattgefunden hat.

Sie benötigen auch die verstrichene Zeit zwischen den Bildern. Dies ist der Zweck des GameTime-Objekts: Es hat eine Eigenschaft "ElpasedGameTime", die eine Eigenschaft "TotalElapsedMilliseconds" hat.

MSDN-Dokumentation auf Gametime Klasse: http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.gametime.elapsedgametime.aspx

Einig Lesematerial auf Wikipedia über Kollisionserkennung: http://en.wikipedia.org/wiki/Collision_detection#A_posteriori_.28discrete.29_versus_a_priori_.28continuous.29

"A priori" und "A posteriori" Erkennung: dass die Schlüsselwörter sind Sie fehlen könnten.

+0

Ja, das habe ich schon probiert. Mit der Zeit versuchend, konnte ich eine diskrete Kollision statt eines Kontinuums analysieren. Ich denke auch, dass es eine wirklich * schmutzige * Implementierung ist, und ich werde es als letzte Ressource betrachten. Ich denke, ich werde pro Pixel Kollision versuchen. Vielen Dank! – Sebastialonso

0

Ich habe keine Zeit, es jetzt zu testen, aber Sie sollten versuchen, die Anzahl der Kollisionen pro Frame auf 1 zu begrenzen. Mit einem Zähler, wenn es den Update-Teil entdeckt, blockiert eine andere Kollision für den gleichen Rahmen. Auf diese Weise, wenn Ihr Projektil seine der untere Teil, der Code für

Teil wird in diesem gleichen Rahmen ausgeführt werden, bevor das Projektil Zeit ein weiteres Rechteck der Textur zu treffen hat. Obwohl dies nur eine Vermutung ist. Viel Glück mit Ihrem Spiel! Kollisionen sind immer mühsam zu implementieren.

+0

Ja, ich hatte mir auch über dieses Thema Gedanken gemacht. Ich werde Ihren Rat in Betracht ziehen. Vielen Dank! – Sebastialonso

+0

Kein Problem. Ich sah das gleiche Problem in einer Brickbreaker Art von Spiel, wo der Ball Zeit hatte, viele Steine ​​in einer Sekunde zu treffen, weil die Kollisionen nicht begrenzt waren. Diese Lösung hat den Zweck erfüllt und es ist einfacher zu implementieren als das gesamte Kollisionssystem für ein Pixel pro Pixel zu ändern. (Obwohl Pixel pro Pixel viel genauer ist) – phadaphunk