SFML 2.5 - Charakter Sprung simulieren

Spring!

Gerade am Anfang, als ich mich damals mehr und mehr mit der Spieleprogrammierung beschäftigt habe, fielen mir bestimmte Aufgaben oft schwer. Dazu gehörten vor allem Lösungen zu Problemen wo Physik und Mathematik gefragt war. Neben Kollisionsberechnung, dass berechnen von Aufschlagwinkeln oder auch das "In die Richtung des Mauszeigers" bewegen Problem, hatte ich auch Schwierigkeiten mit dem simulieren eines "realistischen" Sprungs. Dabei ist das alles so trivial, dass es im Nachhinein schon wehtut.

Das Ding mit der Gravitation

Also, mal angenommen wir haben einen Charakter in unserer Welt und viele andere dynamische Objekte. Wenn wir es uns einfacher machen wollen und wir später auch andere Bewegungen realisieren wollen, wäre es sinnvoll Gravitation auf alle dynamischen Objekte wirken zu lassen. Die Gravitation ist in dem Fall ganz einfach ausgedrückt, eine konstante Kraft die auf unsere ausgewählten Objekte wirkt. Oder noch einfacher: Unsere Sprites bewegen sich permanent nach unten.

Alles was wir jetzt für einen Sprung benötigen würden, wäre eine Beschleunigung/Kraft die in die entgegengesetzte Richtung, also nach oben, wirkt. In der Realität wird diese Kraft von unserer Muskulatur erzeugt und ermöglicht es verschiedenen Lebewesen zu springen.

Charakter konstant nach unten bewegen

Die erste Aufgabe ist es also, unseren Charakter ständig nach unten zu bewegen, bis er auf einen Widerstand trifft.

float gravity = 980;
// Die Beschleunigung nach unten
float dy = 0;

if(character.getPosition().y >= 0)
{
character.move(0, dy * frametime);
// Weiter beschleunigen => fällt immer schneller
dy += gravity*frametime;
}

Achtung: Boden!

Jetzt wo sich unter Charakter ständig nach unten bewegt, haben wir ein neues Problem: Er beachtet den Boden nicht und fällt ewig in die Tiefe. Wir brauchen also eine Kollisionsprüfung mit dem Boden. Da es hier nicht um Kollisionsprüfung gehen soll, sondern nur um den Sprung, nehmen wir mal an der Boden sei eben und fängt bei y = 556 an.

float gravity = 9.8;
float dy = 0;

// ... 

// Wenn Charakter auf Bodenhöhe ist
if(character.getPosition() >= 556)
{
// Die Beschleunigung stoppen
dy = 0;
}

Besiege die Schwerkraft!

Vielleicht auch interessant
HTML5 - Simples Tile System
HTML5 - Simples Tile System

Sehr einfaches aber nützliches System um kleine Spielwelten zu erstellen.

Um das ganze jetzt zu verbinden, benötigen wir eine Variable mit dem Sprungstatus und eine Taste die endlich den Sprung auslöst. Und so sieht dann alles vereint aus.

bool isJumping = false;
float gravity = 9.8;
float dy = 0;

// Wenn Taste 'w' gedrückt wurde und kein aktiver Sprung besteht
if(sf::Keyboard::isKeyPressed(sf::Keyboard::W) && !isJumping)
{
// Nach oben Beschleunigen
// Desto niedriger dieser Wert, desto höher der Sprung
dy = -400;
isJumping = true;
}

if(character.getPosition().y >= 0)
{
character.move(0, dy * frametime);
dy += gravity*frametime;
}

if(character.getPosition() >= 556)
{
dy = 0;
// Sprung beenden
isJumping = false;
}

Es springt!

Wir haben jetzt einen springenden Charakter. Natürlich gibt es in Spielwelten selten einen dauerhaft ebenen Boden. Man sollte deshalb Kollisionsprüfung verwenden um den Sprung logisch zu beenden, sobald der Boden berührt wird. Den Sprung einfach ab einer bestimmten Tiefe zu beenden, wie hier realisiert, wird nicht ausreichen. Aber das Prinzip bleibt das selbe.

Hinterlasse gerne einen Like oder Kommentar (~‾▿‾)~
Name Text