Top-Down-RPG-Bewegung mit Korrektur?


27

Ich würde hoffen, dass wir alle Zelda: A Link to the Past gespielt haben. Bitte korrigieren Sie mich, wenn ich mich irre, aber ich möchte diese Art von 2D-Bewegung von oben nach unten mit einem Hauch von Korrektur emulieren. Es ist in anderen Spielen gemacht worden, aber ich denke, dass dieser Verweis am einfachsten ist, sich darauf zu beziehen. Die Art der Bewegung und Korrektur, von der ich spreche, ist:

  • Schwimmende Bewegung, die nicht auf fliesenbasierte Bewegungen wie Pokémon und andere Spiele beschränkt ist, bei denen Sie mit einem Fingertipp auf das Bewegungsfeld ein Feld in diese Hauptrichtung bewegen. Diese Schwimmbewegung sollte in der Lage sein, eine diagonale Bewegung zu erreichen.
  • Wenn Sie nach Westen gehen und zu einer Wand kommen, die nach Nord-Ost- / Süd-West-Art diagonal verläuft, werden Sie zu einer Süd-West-Bewegung korrigiert, auch wenn Sie weiterhin links (West) auf dem Controller gedrückt halten. Dies sollte für beide Diagonalen funktionieren und in beide Richtungen korrigieren.
  • Wenn Sie ein paar Pixel davon entfernt sind, eine Tür oder einen Flur zu betreten, werden Sie korrigiert, indem Sie durch die Halle oder den Flur gehen, dh wenn Sie gegen eine Ecke stoßen, werden Sie in die Halle / Tür gedrückt.

Ich habe nach effizienten Wegen gesucht, um dies zu erreichen, und hatte kein Glück. Um klar zu sein, ich spreche von der Bewegung der menschlichen Figur, nicht von der Bewegung eines NPC. Stehen ihre Ressourcen für diese Art von Bewegung zur Verfügung? Gleichungen oder Algorithmen in einem Wiki erklärt oder so?

Ich verwende das XNA Framework. Gibt es irgendetwas, das dabei hilft?

Antworten:


23

Nun, der erste Punkt ist einfach. Sie speichern und bearbeiten die Position des Zeichens einfach in Welt- oder Pixelkoordinaten anstelle von kachelbasierten Koordinaten. Wenn Sie ein Problem damit hatten, könnte dies an einer verwirrenden Auswahl der Darstellung für Ihre Welt und Ihren Kachelbereich liegen. Vielleicht sollten Sie also weitere Details dazu posten / eine separate, spezifische Frage stellen.

Für den zweiten Punkt wäre der direkteste Ansatz, den (normalisierten) Bewegungsvektor des Spielers zu nehmen und ihn zum normalen Vektor der Wand hinzuzufügen und dann zu renormalisieren. Das Vorzeichen der Komponenten des resultierenden Vektors gibt an, wie sich die Wand auf die Bewegung des Spielers bezieht, während der Vektor selbst angibt, in welche Richtung sich der Spieler jetzt bewegen darf.

Für den dritten Punkt sollten Sie unter der Annahme, dass Sie Kollisionsrechtecke sowohl für die Wand als auch für den Player haben, bestimmen können, wie viel des Kollisionsrechtecks ​​des Players mit dem Kollisionsrechteck der Wand in Kontakt steht. Wenn sich der Spieler zum Beispiel nach rechts bewegt und auf eine vertikale Wand stößt, vergleichen Sie die Ausdehnung der Y-Achse der Kollisionsrechtecke - wenn die Ausdehnung des Spielers die Ausdehnung der Wand um einen bestimmten Schwellenwert übersteigt, sagen wir 75% der Y-Achse des Spielers Achsausdehnung, dann "betrügen" Sie den Spieler in Richtung der Tür.

Ich habe hier eine ganze Reihe von Annahmen getroffen, wie Ihr Objektmodell in Ihrem Code aussieht und welche Techniken Sie gewählt haben - hauptsächlich aufgrund der Allgemeingültigkeit Ihrer Frage. Ich habe versucht, aus dem gleichen Grund einfache (wenn auch nicht optimale) Ansätze vorzuschlagen. Wenn Sie in dieser Frage oder in einer neuen Frage genauere Informationen angeben können, kann ich versuchen, weitere Details oder eine bessere Idee anzugeben.


Ja, das Herumschweben des Charakters war kein Problem. Nur um sicherzustellen, dass die Leute sahen, dass es eine Anforderung war. Sie gaben mir die Schlüsselantwort: Fliesen mit Vektoren! Ich kann nicht glauben, dass ich nicht daran gedacht habe. Vielen Dank.
Corey Ogburn

In Zelda gab es nur einen Winkel, in dem sie sich befinden konnten, so dass die Berechnung von Normalenvektoren nicht erforderlich war, es war nur ein Sonderfall im Code.
BlueRaja - Danny Pflughoeft

Ich verstehe nicht, wie Sie einer Kachel einen Vektor geben. Wie würde das aussehen?
Test

Eine Kachel enthält vermutlich bereits Daten wie ihre Grafik, ob sie nun passierbar ist oder nicht usw. Dies ist nur ein weiteres Feld. Zum Beispiel: struct Tile {vector2 normal; ...} Der Wert des Normalen sollte mit den Daten kommen, die die Kachel definieren
Josh

@JoshPetrie Dies wieder aufnehmen. Wäre es nicht notwendig, dass eine Kachel, mit der in mehrere Richtungen kollidiert werden kann, mehrere Vektoren hat? Ich bin nicht sicher, ob ich verstehe, wie eine Kachel einen einzelnen Vektor haben könnte.
Test

4

Eine mögliche Antwort für den zweiten Punkt ist die Projektion des Bewegungsvektors des Spielers entlang des Wandvektors unter Verwendung eines Punktprodukts (ab * normalisiert (b)). Sie erhalten dann einen Vektor, der angibt, wie weit der Spieler in Richtung der Wand bewegt werden soll. Wenn Sie den Spieler um diesen Vektor bewegen, erhalten Sie einen „Schlitten“ entlang der Wand. Hat in einem früheren Spielprojekt gut für mich funktioniert.


3

Tolle Antwort für Josh, aber ich werde ein paar Vorschläge hinzufügen: - Weitere Informationen zum Rutschen an Wänden finden Sie in meiner Frage. - Aufgrund dieser Antwort habe ich es geschafft, dass es wirklich gut funktioniert. - Wenn ich mich nicht irre, kann Link beim Aufwärtsgehen des Bildschirms leichter auf das nächstgelegene horizontale Gitterquadrat ausgerichtet werden. Auf diese Weise sind Sie beim Erreichen der Türen mit größerer Wahrscheinlichkeit richtig aufgestellt (möglicherweise falsch). - Stellen Sie sicher, dass die Kollisionsbox Ihres Charakters viel kleiner als die Breite der Tür ist, damit Sie leicht durch Türen gelangen.


Oder ist die Kollisionsbox vielleicht ein Kreis?
Oskar Duveborn

2

Zur Korrektur von Eingangstüren können Sie das Kollisionsobjekt für die Tür etwas größer als das Bild der Tür machen. Dies würde zu demselben Effekt führen, den Josh vorgeschlagen hat, ohne jedoch die Nähe zum Kollisionsrechteck der Wand berechnen zu müssen.

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.