Impulsiertes Springen


12

Es gibt eine Sache, die mich verblüfft hat, und die ist, wie man einen "Faux-Impulsed" -Sprung in einem Platformer umsetzt. Wenn Sie nicht wissen, wovon ich spreche, dann denken Sie an die Sprünge von Mario, Kirby und Quote from Cave Story. Was haben Sie gemeinsam? Nun, die Höhe Ihres Sprungs hängt davon ab, wie lange Sie die Sprungtaste gedrückt halten.

Zu wissen, dass die 'Impulse' dieser Charaktere nicht wie in der Physik vor ihrem Sprung erzeugt werden, sondern in der Luft - das heißt, Sie können Ihren Finger sehr gut auf halber Höhe heben, und es wird aufhören, selbst wenn mit Abbremsen zwischen ihm und dem Punkt; Aus diesem Grund kann man einfach auf einen Sprung tippen und ihn für einen Weitsprung halten - ich bin fasziniert davon, wie sie ihre Flugbahnen als Bögen halten.

Meine aktuelle Implementierung funktioniert wie folgt:

Bildbeschreibung hier eingeben

Während die Sprungtaste gedrückt wird, wird die Schwerkraft ausgeschaltet und die Y-Koordinate des Avatars wird um den konstanten Wert der Schwerkraft verringert. Wenn beispielsweise die Anzahl der Z-Einheiten pro Tick sinkt, steigt die Anzahl der Z-Einheiten pro Tick.

Sobald der Knopf losgelassen wird oder das Limit erreicht ist, verlangsamt sich der Avatar um einen Betrag, der X Einheiten überdeckt, bis seine Geschwindigkeit 0 erreicht. Sobald dies der Fall ist, beschleunigt es, bis seine Geschwindigkeit der Schwerkraft entspricht. Wenn wir uns an das Beispiel halten, könnte ich sagen, dass es von 0 auf Z Einheiten / Tick beschleunigt, während es immer noch X Einheiten abdeckt.

Diese Implementierung bewirkt jedoch, dass die Sprünge zu diagonal sind. Wenn die Geschwindigkeit des Avatars nicht höher ist als die Schwerkraft, würde dies in meinem aktuellen Projekt zu schnell sein (es bewegt sich mit etwa 4 Pixel pro Tick und die Schwerkraft beträgt 10 Pixel pro Tick) eine Bildrate von 40 fps), macht es auch mehr vertikal als horizontal. Diejenigen, die mit Plattformspielern vertraut sind, würden bemerken, dass der Bogen des Charakters sie fast immer weiter springen lässt, selbst wenn sie nicht so schnell sind wie die Schwerkraft des Spiels, und wenn er nicht richtig gespielt wird, würde er sich als solcher erweisen sehr kontraintuitiv. Ich weiß das, weil ich bestätigen konnte, dass meine Implementierung sehr ärgerlich ist.

Bildbeschreibung hier eingeben

Hat jemand schon einmal versucht, eine ähnliche Mechanik zu entwickeln, und hat es vielleicht sogar geschafft? Ich würde gerne wissen, was hinter dieser Art von Plattformspringen steckt. Wenn Sie noch nie zuvor Erfahrungen damit gesammelt haben und es ausprobieren möchten, versuchen Sie bitte nicht, meine erläuterte Implementierung zu korrigieren oder zu verbessern, es sei denn, ich war auf dem richtigen Weg - versuchen Sie, Ihre Lösung aus zu erstellen kratzen. Es ist mir egal, ob Sie Schwerkraft, Physik oder so etwas verwenden, solange es zeigt, wie diese Pseudo-Impulse funktionieren, macht es den Job.

Außerdem möchte ich, dass die Präsentation eine sprachspezifische Kodierung vermeidet. Teilen Sie uns ein C ++ - Beispiel oder Delphi. So oft ich das XNA-Framework für mein Projekt verwende und C # -Stoffe nicht stört, habe ich nicht viel Geduld, um den Code anderer zu lesen, und ich bin es auch Bestimmte Spieleentwickler anderer Sprachen sind an dem interessiert, was wir hier erreichen. Halten Sie sich also bitte an den Pseudocode.

Danke im Voraus.


3
Haben Sie sich die folgende Frage und ihre Antwort (en) angesehen? gamedev.stackexchange.com/questions/29617/...
bummzack

@bummzack Dies ist auch sehr klar.
Mutoh

1
Mögliches Duplikat von Jump-Handling und Schwerkraft Es gibt zwar keine schönen Bilder, aber es ist die gleiche Frage.
MichaelHouse

Antworten:


8

Ich denke, Ihr Hauptproblem liegt hier:

Während die Sprungtaste gedrückt wird, wird die Schwerkraft ausgeschaltet und die Y-Koordinate des Avatars wird um den konstanten Wert der Schwerkraft verringert. Wenn beispielsweise die Anzahl der Z-Einheiten pro Tick sinkt, steigt die Anzahl der Z-Einheiten pro Tick.

Die Schwerkraft funktioniert so nicht. Google "gleichmäßig beschleunigte Bewegung" für die Details, aber in einfachen Worten, wie ein anderes Mitglied sagte, ist die Schwerkraft eine Beschleunigung, keine Geschwindigkeit.

Einfach ausgedrückt, während die Geschwindigkeit die konstante Änderungsrate der Position über die Zeit ist, ist die Beschleunigung die konstante Änderungsrate der Geschwindigkeit über die Zeit.

Ihre erste Aufgabe wäre es also, den Algorithmus für fallende Werte so zu ändern, dass nicht nur die Geschwindigkeit, sondern auch die Beschleunigung berücksichtigt wird. Anstatt von:

pos_y = pos_y + (velocity_y * time_difference)

du müsstest sowas machen

pos_y = pos_y + (velocity_y * time_difference) + (gravity_y * (time_difference ^ 2) / 2)
velocity_y = velocity_y + (acceleration_y * time_difference)

Auf diese Weise wird alles in eine Parabel fallen, was die physikalisch korrekte Bewegung ist.

Um nun das einfache Springen zu implementieren (wir kommen gleich darauf zu Ihrer genauen Frage), stellen Sie einfach velocity_yeinen gewünschten Wert ein. Solange das Vorzeichen für acceleration_yund Ihr Wunsch velocity_yverschieden sind, springt Ihr Objekt korrekt (Mit anderen Worten, Sie schalten die Schwerkraft nicht aus. Sie behalten es bei und stellen einfach die Geschwindigkeit des Objekts auf einen vordefinierten Wert ein).

Sie werden bemerken, dass velocity_yder Sprung umso höher ist , je größer er ist, wenn Sie mit dem Springen beginnen. Um den gewünschten Effekt zu erzielen, fügen Sie dem Sprung eine Art Beschleunigung hinzu (physikalisch bedeutet dies, dass Sie eine Kraft hinzufügen. Stellen Sie sich vor, Sie fügen dem Objekt eine kleine Rakete hinzu).

Dazu machen Sie dasselbe wie zuvor, aber jetzt sollten Beschleunigung und Geschwindigkeit dasselbe Vorzeichen haben. Sie tun dies, während die Taste gedrückt ist:

pos_y = pos_y + (velocity_y * time_difference) + (force_y * (time_difference ^ 2) / 2)
velocity_y = velocity_y + (force_y * time_difference)

4

Die Lösung besteht darin, die Verzögerung nicht zu verzögern. Wenn Sie einen Ball in die Luft werfen, bewegt er sich nicht mit konstanter Geschwindigkeit, bis er seine maximale Höhe erreicht, sondern verlangsamt sich ab dem Moment des Impulses.

Die Schwerkraft ist keine Geschwindigkeit, sondern eine Beschleunigung. Wenn ein Spieler also eine Geschwindigkeit von 20 Einheiten nach oben hat und die Schwerkraft -10 Einheiten beträgt, beträgt die Geschwindigkeit nach oben beim nächsten Tick 10 Einheiten, beim nächsten 0 Einheiten usw.

Der Grund, warum deine Sprünge so diagonal erscheinen, ist, dass die Geschwindigkeit deines Spielers konstant ist. Wenn Sie also buchstäblich eine Linie zeichnen, die dem Pfad des Spielers folgt, sehen Sie eine Linie mit der positiven oder negativen Steigung Ihres Schwerkraftwerts über der Änderung der x-Position.

Damit Ihr Spieler die Höhe Ihres Sprungs kontrollieren kann, sollte Ihrem Spieler eine Anfangsgeschwindigkeit auf Impuls gegeben, die Schwerkraft ausgeschaltet und ein spezieller Schwerkraftwert (weniger als die reguläre Schwerkraft) auf die Geschwindigkeit des Spielers angewendet werden. Sobald die Sprungtaste losgelassen wird oder die Geschwindigkeit des Spielers 0 erreicht, sollte die normale Schwerkraft angewendet werden.

Auf diese Weise sieht der Spieler während seines Sprungs eine schöne Kurve, unabhängig davon, ob er durch die normale Schwerkraft verzögert wird oder nicht.


2

Die kurze Geschichte ist: Sie werden irgendwo einen nicht-parabolischen Abschnitt in Ihrem Sprungbogen haben.

Beim Springen habe ich ein paar Ansätze ausprobiert:

  • Konstante Steigung: Dies scheint im Grunde das zu sein, was Sie versucht haben: Die positive Vertikalgeschwindigkeit wird fixiert, bis der Knopf losgelassen wird. An diesem Punkt setzt die normale Schwerkraft ein. Der Bogen ist beim Aufstieg diagonal, beim Fall jedoch normal. Dies sieht normalerweise in Ordnung aus und (was noch wichtiger ist) fühlt sich in Ordnung an, da es ziemlich einfach ist, die Höhe des Sprunges gut zu beurteilen.

  • Angehaltener Aufstieg: Hier beginnen Sie mit dem Aufstieg des Charakters an der Parabel maximaler Höhe, wobei Sie einen Anfangsimpuls anwenden. Wenn Sie die Taste loslassen, setzen Sie die vertikale Geschwindigkeit auf Null (oder eine kleine Aufwärtsgeschwindigkeit). Dies bedeutet, dass Ihre größten Sprünge eine garantierte Parabel sind und kleinere Sprünge sich eher wie ein großer Sprung anfühlen, als dass Sie langsamer werden.

  • Variabler Anfangsimpuls: Dies ist der Impuls, für den ich mich letztendlich entschieden habe: Durch Drücken von jump wird ein erster Aufwärtsimpuls angewendet, der für einen Sprung ausreicht, und anschließend wird über einen kurzen Zeitraum - das Sprungfenster - eine Aufwärtsbeschleunigung (viel größer als die Schwerkraft) angewendet, bis die Taste wurde losgelassen. Sobald das Sprungfenster geschlossen war, war die Bewegung parabolisch, und die Periode des variablen Anfangsimpulses war kurz genug, um nicht sonderbar auszusehen, aber lang genug, um einem erfahrenen Spieler genügend Spielraum für die Kontrolle der Sprunghöhe zu geben. Der Nachteil war, dass es nicht so einfach war, die Sprunghöhe zu beurteilen, da das Fenster viel kleiner war und nicht die Entsprechung zwischen Auslösemoment und Höhe aufwies. Wie es die meiste Zeit passierte, wollten Sie entweder einen Tipp oder einen vollen Sprung, also war das kein solches Problem.

Probieren Sie diese aus und sehen Sie, was sich am besten anfühlt.

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.