Wie lässt man einen Charakter springen?

44

Ich mache gerade ein Spiel in C # mit Direct X 9.0. Das Remake des Spiels ist Donkey Kong NES. Ich habe fast alles abgeschlossen, aber ich habe Probleme mit der Physik von Marios Sprung. Ich habe Variablen für die Y- und X-Koordination deklariert.

Ich habe mich gefragt, ob es dafür eine einfache Methode gibt. Ich habe hoch und niedrig nach einer Antwort gesucht, aber die Antworten, die ich gefunden habe, sind entweder irrelevant / oder verwenden eine andere Programmiersprache wie XNA.

Ich habe momentan eine Bool-Variable gesetzt, um zu prüfen, ob W gedrückt wurde. Dadurch wird ein Code ausgelöst, der ihn zum Springen bringt. Ich habe herumgespielt wie.

  if (jump == true)
    {

        Playerypos -=  vel;
        Playerxpos +=  vel;
    }

Was nicht so gut funktioniert hat. Ich habe hoch und tief nach einer Antwort gesucht und jetzt bin ich verzweifelt, ob mich jemand auf eine einfache Lösung hinweisen könnte. Das wäre toll. Sehr geschätzt für alle Antworten.

Sarah
quelle
5
Antworten mit einer anderen Programmiersprache sollten kein Problem darstellen. Der Algorithmus ist von Interesse, nicht die spezifische Implementierung ... es sei denn, Sie möchten einfach kopieren und einfügen, ohne etwas zu verstehen, was ich sicherlich hoffe, dass Sie es nicht sind! Algorithmen aus anderen Programmiersprachen lesen und anpassen zu können, ist eine sehr gute Fähigkeit.
ccxvii

Antworten:

84

Erstens verwendet XNA auch C #, so dass es sich um dieselbe Programmiersprache handelt. Auch wenn die zugrunde liegende API einige Unterschiede zu DirectX aufweist, hat dies nichts mit Springen zu tun. Daher sollten hier dieselben Lernprogramme oder Antworten gelten. Es gibt auch zahlreiche Möglichkeiten, dies in Abhängigkeit von vielen Faktoren zu implementieren. Was ich im Folgenden beschreiben werde, ist nur eine der Möglichkeiten.

Grundlegende physikalische Anforderungen

Zunächst benötigen Sie einige grundlegende physikalische Variablen und Berechnungen für Ihre Aktualisierungsschleife. Insbesondere müssen Position, Geschwindigkeit und Schwerkraft definiert sein, und Ihre Aktualisierungsschleife sollte ungefähr so ​​verfahren (Kollisionserkennung und Reaktion sind der Einfachheit halber weggelassen):

float positionX, positionY;     // Position of the character
float velocityX, velocityY;     // Velocity of the character
float gravity = 0.5f;           // How strong is gravity

void Update(float time)
{
    positionX += velocityX * time;      // Apply horizontal velocity to X position
    positionY += velocityY * time;      // Apply vertical velocity to X position
    velocityY += gravity * time;        // Apply gravity to vertical velocity
}

Sprung in fester Höhe

Der einfachste Weg, einen Sprung zu realisieren, der immer die gleiche Höhe hat, egal wie lange Sie die Taste drücken, besteht darin, die vertikale Geschwindigkeit einmal zu ändern. Dies lässt den Charakter aufsteigen, während die Schwerkraft automatisch dafür sorgt, dass er niedergeschlagen wird:

void OnJumpKeyPressed()
{
    velocityY = -12.0f;   // Give a vertical boost to the players velocity to start jump
}

Wichtig Sie möchten nicht in der Lage sein, einen Sprung zu starten, wenn sich Ihr Charakter nicht auf dem Boden befindet. Daher müssen Sie einen Check hinzufügen.

Variabler Höhensprung

Spiele wie Mario und Sonic haben jedoch einen variablen Sprung, dessen Höhe davon abhängt, wie lange Sie den Knopf drücken. In diesem Fall müssen Sie die Sprungtaste drücken und loslassen. Sie könnten etwas hinzufügen wie:

void OnJumpKeyReleased()
{
    if(velocityY < -6.0f)       // If character is still ascending in the jump
        velocityY = -6.0f;      // Limit the speed of ascent
}

Tweaking all diese Werte (dh die Zahlen wie 0.5, -12.0foder -6.0f) in dem obigen Code Sie das Gefühl von Ihrem Sprung ändern können, wie hoch er springt, wie vielen Schwung hält er auch nach dem Sprung Taste loslassen, wie schnell fällt ihm, etc .

Wichtig Rufen Sie diese Funktionen nicht bei jedem Frame auf. Rufen Sie sie nur einmal auf, wenn die Taste gedrückt oder losgelassen wird. Sonst fliegt dein Charakter anstatt zu springen.

Arbeitsbeispiel

Ich habe soeben ein kurzes Beispiel für die oben beschriebenen Techniken erstellt, die Sie hier in Ihrem Browser ausprobieren können (drücken Sie die Maustaste, um zu springen, lassen Sie sie in der Mitte los, um die Höhe des Sprungs zu steuern). Es ist in JS, aber wie ich bereits erwähnt habe, ist die Sprache in diesem Fall irrelevant.

http://jsfiddle.net/LyM87/

David Gouveia
quelle
11
Nutzen Sie auch die Gelegenheit, um diesen fantastischen Artikel mit Informationen zu diesem Thema zu veröffentlichen: Der Leitfaden zur Implementierung von 2D-Plattformern . Und auch dies: Sonic Jumping .
David Gouveia
2
Der Artikel beschreibt eine andere Art des Variablenspringens als in Ihrer Antwort. Es fordert dazu auf, die Schwerkraft zu unterdrücken oder den Impuls weiter hinzuzufügen, während die Taste gedrückt gehalten wird. Normalerweise mache ich, was David in seiner Antwort sagt, aber gibt es irgendwelche Gedanken zu den Methoden des Artikels?
Jeff
@ Jeff Das hat auch meine Aufmerksamkeit erregt, und genau deshalb habe ich erwähnt, dass es mehrere Möglichkeiten gibt, es zu implementieren. Der erste Artikel beschreibt zwei zusätzliche Möglichkeiten, um dasselbe Problem zu behandeln, während der von mir beschriebene Weg auf dem zweiten Artikel basiert. Ich weiß nicht, wie sie miteinander verglichen werden, obwohl sie ziemlich einfach zu implementieren sind. Letztendlich habe ich mich für diese Methode entschieden, weil sie einfacher zu erklären war und weder einen Timer noch den Umgang mit mehreren Impulsen mit abnehmender Größe erforderte.
David Gouveia
Die Antwort kann je nach Spiel und Anzahl der gewünschten Animationen variieren. Metroid verwendet einen konstanten Geschwindigkeitssprung: / Abstieg, maskiert ihn jedoch mit hochwertiger Animationsarbeit, damit er im Zenit glatt und "gekrümmt" aussieht. Viele andere Plattformer verwenden Sprünge mit variabler Geschwindigkeit, die mehr Arbeit erfordern, damit sie gut funktionieren.
Sean Middleditch
1
das war sehr hilfreich, 5 Jahre später :) und diese Geigensache ist sehr cool - ich sollte JS lernen!
Flüssigkeit
1

Wie in der Physik. Nur in dem Moment, in dem Sie drücken jump keyund der Charakter auf dem Boden ist, addieren Sie die Geschwindigkeit nach oben (dies wird als Impuls bezeichnet), aber lassen Sie den Charakter die ganze Zeit durch die Schwerkraft fallen.

Wenn Sie nicht möchten, dass der Charakter jedes Mal springt, wenn er auf den Boden trifft - weil Sie gedrückt halten jump key-, fügen jump key is being pressedSie eine Variable hinzu , die Sie löschen jump key, und setzen Sie sie anschließend. Pseudocode:

if jump being key pressed == false && jump key just pressed
   add y velocity 
   jump being key pressed = true

if jump key released
   jump being key pressed = false

decrease velocity by gravity
check for collisions // to not penetrate ground ...

Wenn ich Ihren Weg benutzt habe:

if jump key not pressed
     jump height = 0            // imaginary height donkey would travel without gravity

if jump key pressed
     // going up
     if jump height < maximal height donkey might jump
         jump height += 5
         donkey.y    += 5        // 
     // going down
     else if jump height < 2 * maximal height donkey might jump
         jump height += 5
         donkey.y    -= 5

Wie sich donkey.ydas ändern wird, liegt in Ihrer Vorstellungskraft. Die Geschwindigkeit sollte kleiner werden. Je höher der Esel in der Luft ist, desto besser sieht er aus.

user712092
quelle