PyGame: Ungleichmäßige (flüssige) Bewegung erzeugen?
Hallo,
Wenn ich meinen Charakter in Pygame bewege, dann bewegt er sich gleichmäßig (2px). Als Graph würde das dann so aussehen:
Ich möchte jedoch, dass er sich zuerst schnell bewegt und dann langsamer wird.
In etwa so:
Wäre das in Pygame möglich?
Danke im Vorraus!
Die X-Achse stellt die Zeit dar, und die Y-Achse die Bewegung.
1 Antwort
Warum nicht.
Ich kenn mich mit pygame nicht aus, aber du musst bestimmt die Position des Objektes updaten, also dessen Koordinaten.
Ich nehme einfach mal an dein Objekt soll sich (wie in den ersten GTA games) in x und y Richtung gleichermaßen bewegen können. (springen wäre aus der Bildebene heraus)
Somit brauchst du eine Richtung und eine Geschwindigkeit.
Du musst also für jedes Zeitfensterchen eine neue Position berechnen und das aus einer Richtungsinformation und einer Geschwindigkeit.
Angenommen du drückst nur nach rechts, musst du nur die x Koordinate entsprechend der Geschwindigkeit anpassen.
Um die Geschwindigkeit zu berechnen musst du dir den Startzeitpunkt merken. Damit kannst du die Funktion, welche die Geschwindigkeit beschreibt, füttern. Die Geschwindigkeit ist hier nur abhängig von der Zeit.
Eine Funktion, die deiner Gezeichneten nahe kommt, wäre
f(t) = t**(1/4) also die 4. Wurzel aus der Zeit t
Das ist aber absolut. Wir brauchen aber eine Schrittweite die immer kleiner wird. Also brauchen wir die Ableitung von f....
Somit ist (solange du nach rechts drückst) x += 1/(4*t**(3/4)) ein Anfang der sich noch optimieren lässt.
Nur wozu braucht man sowas? Als Simulation von Wasser? Ohne es gespielt oder ausprobiert zu haben würde ich, um schnell voran zu kommen die Richtungstaste schnell hintereinander drücken.
Also kurzum als abstrakter Python Code:
def loop: #wird für jeden Frame aufgerufen
if button_right_get_pressed: #wird einmalig bei Tastendruck aufgerufen
timestamp = time.now()
direction = (1,0)
elif button_left_get_pressed:
timestamp = time.now()
direction = (-1,0)
#elif andere_Richtungen:
#für alle möglichen Tastenkombination ergänzen
#direction ist bspw (0.5,0.5) für rechts-oben
else:
timestamp = None
if timestamp:
t = time.now() - timestamp
step = 1/(4*t**(3/4))
pos.x += direction[0] *step
pos.y += direction[1] *step
Ich hoffe ich habe möglichst wenig Denkfehler drin.