PyGame: Ungleichmäßige (flüssige) Bewegung erzeugen?


02.04.2022, 22:30

Die X-Achse stellt die Zeit dar, und die Y-Achse die Bewegung.

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

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.