Kollision-Reaktion in einem 2D-side-scroller-Spiel, ähnlich wie "Mario"
Wurde erheblich belästigt mich in den letzten paar Wochen. In dieser Zeit hab ich schon online recherchieren, auch das Lesen von Büchern in der "Computer" an den Grenzen, um zu versuchen, eine Antwort zu finden, aber ich hatte noch nicht viel Glück.
Programmierte ich ein 2D-level-editor für side-scroller-video-Spiele. Jetzt will ich schalten Sie es in einen Spiel wo ich einen Spieler, der laufen und springen erkunden der level, ähnlich wie bei "Mario".
Ist die Sache, die wirklich, gebe mir Mühe, ist die Kollision-Reaktion (nicht-Erkennung: ich weiß schon, wie zu sagen, wenn zwei Blöcke kollidieren). Hier sind einige Szenarien, die ich zu veranschaulichen, so dass Sie sehen können, meine Probleme (die schraffierten Blöcke sind der Boden, der Pfeil ist der geschwindigkeitsvektor der Spieler, die gestrichelten Linien sind die projizierten Weg des Spielers).
Sehen diese Kollision Lösungsszenarien Bild:
http://dl.dropbox.com/u/12556943/collision_detection.jpg
Davon ausgehen, dass die geschwindigkeitsvektoren in den Szenarien (1) und (2) gleich sind (gleiche Richtung und Größe). Doch in Szenario (1), die Spieler auf die Seite des Blocks, und in Szenario (2), der Spieler landet auf der Oberseite des Blocks. Dies ermöglicht mir, zu dem Schluss, dass die Bestimmung der Kollision Antwort ist nicht nur abhängig von der Geschwindigkeit Vektor der Spieler, sondern auch die Spieler, die relative position zu der Kollision blockieren. Das führt mich zu meiner ersten Frage: kennt man den geschwindigkeitsvektor und die relative position des Spielers, wie kann ich feststellen, aus welcher Richtung (entweder Links, rechts, oben oder unten) der Spieler eine Kollision mit dem block?
Einem anderen problem, das ich habe, ist, wie zu bestimmen, die Kollision Antwort, wenn der Spieler kollidiert mit mehrere Blöcke in dem gleichen Rahmen. Zum Beispiel davon ausgehen, dass in Szenario (3), der Spieler kollidiert mit beiden Blöcken gleichzeitig. Ich gehe davon aus, dass ich bin zu haben, um eine Schleife durch jeden block, den der Spieler kollidiert mit und passen Sie die Reaktion entsprechend aus jedem block. Um es zusammenzufassen, dies ist meine zweite Frage: wie gehe ich mit Kollision Antwort, wenn der Spieler kollidiert mit mehreren Blöcken?
Bemerken, dass ich nie offenbart die Sprache, ich bin Programmierung in; dies ist, weil ich würde es vorziehen, für Sie nicht wissen (nichts persönliches, aber :] ). Ich bin mehr daran interessiert, in pseudo-code als Sprache gesehen-spezifischen code.
Dank!
- Verwenden Sie eine Kachel-basierte Welt (ähnlich dem 2D-Mario-Spiele)? Dein Bild führt mich zu glauben, dass Sie sind, aber ich bin mir nicht sicher.
- Ja, ich habe ein 2D-array speichert den Typ jedes einzelnen Blocks in der Ebene.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, die Art und Weise XNA Beispiel-Plattform-Spiel Griffe Kollisionen könnte gut für Sie arbeiten. Ich stellte diese Antwort auf eine sehr ähnliche Frage anderswo auf Stack Overflow aber relais es hier auch.
if(abs(overlap.y) < abs(overlap.x)) { position.y += overlap.y; } else { position.x += overlap.x; }
XNA-version von dieser Logik ist in
player.cs
imHandleCollisions()
Funktion, wenn Sie daran interessiert sind, greifen Ihren code, um zu sehen, was Sie speziell tun es.Also, was macht diese ein wenig komplizierter ist die Konstante Schwerkraft der Einstellung Ihrer Spieler-position. Wenn Ihr Spieler springt auf der Spitze von einem block sollte Sie nicht springen, Sie landen sollte, auf der Oberseite des Blocks und dort zu bleiben. Allerdings, wenn der Spieler trifft einen block auf der linken oder rechten sollten Sie nicht nur dort bleiben die Schwerkraft zieht Sie nach unten. Ich denke, das ist in etwa Ihre Frage auf einem hohen Niveau.
Ich denke, Sie werden wollen, trennen Sie die zwei Kräfte der Schwerkraft und der Spieler Geschwindigkeit von collision detection/response-Algorithmus. Mit der Geschwindigkeit der Spieler, wenn Sie kollidieren mit einem block, unabhängig von der Richtung bewegen Sie einfach die position des Spielers an den Rand der Kollision, und subtrahieren die gleiche und entgegengesetzte Vektor der Spieler die Geschwindigkeit, da dies nicht zu tun, würde dazu führen, dass Sie kollidieren doch wieder mit dem Objekt. Sie möchten berechnen Sie den Schnittpunkt und legen Sie die position des Spielers gibt es auf dem block.
On a side note, die Sie variieren können, dass wirklich große Kraft, durch welche Art von block die Spieler kollidierte mit, so dass für interessante Antworten wie die Spieler brechen kann durch den block, wenn Sie laufen schnell genug (sprich die Spieler die velocity - > als die Kraft, die der block)
Dann gelten weiterhin die Konstante Kraft der Schwerkraft, um die position des Spielers und auch weiterhin tun Ihre normale Berechnung, um zu bestimmen, ob der Spieler erreicht hat. Stock.
Ich denke, durch die Trennung dieser beiden Konzepte, die Sie haben eine wirklich einfache straight-forward collision-response-Algorithmus, und Sie haben eine ziemlich einfache Schwerkraft-Boden-Algorithmus. So können Sie variieren die Schwerkraft, ohne zu wiederholen collision-response-Algorithmus. Sagen Sie zum Beispiel eine Wasser-Ebene, Raum, Ebene, etc und Kollisionserkennung Antwort, ist alles das gleiche.
Ich dachte über diese für eine lange Zeit, vor kurzem.
Ich bin mit der Trennung von Achse-theorem, und so, wenn ich erkannt, dass eine Kollision fuhr ich zu Projekt das Objekt auf der normierte geschwindigkeitsvektor und verschieben Sie das Objekt durch diese Distanz in der Richtung der negativen geschwindigkeitsvektor. Vorausgesetzt, das Objekt kam aus einem sicheren Ort zu dieser Lösung wird das Objekt platzieren, an einem sicheren Ort-post-Kollision.
Vielleicht nicht die Antwort, die Sie suchen zu bekommen, aber hoffentlich werde weisen Sie in die richtige Richtung?