Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

01.02.2016, 10:46

C++ SFML Flüssige Charakter Bewegung

Wie man schon lesen kann möchte ich eine flüssige Charakter Bewegung hinbekommen.
Ich habe das schon probiert wie in diversen Foren, Tutorials,... erklärt.
Jedoch wirkt die Bewegung bei mir immer hackig, da der FPS Wert stark schwankt.(zwischen ca.400 und ca.1000)
Und durch diesen Wert wird die mit Geschwindigkeit/FPS berechnete Geschwindigkeit sehr abgehakt.

Wie geht ihr das mit der Bewegung an ?

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

01.02.2016, 10:52

Du solltest VSYNC anschalten: sf::Window::setVerticalSyncEnabled()

Dann hast du eine Beschränkung durch die Wiederholrate deines Monitors und es schwankt nicht mehr so stark. Das Phänomen was du beschreibst ist durchaus bekannt, große Framerate-Sprünge sind halt auch mit Time-Based Rendering nicht sauber zu handlen.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

3

01.02.2016, 11:15

Grundsätzlich sollte die Bewegung unabhängig von der Framerate sein. Dein Charakter hat eine bestimmte Geschwindigkeit (bspw. 10 m/s) und das Spiel läuft mit einer bestimmten Framerate (bspw. 60 F/s) Dividiert man nun die Geschwindigkeit v (m/s) durch die Framerate FPS, erhält man einen Wert, mit dem man weiterrechnen kann (in diesem Beispiel ~ 0,1667 m/F). Alternativ zur Division (v/FPS) kann man auch eine Multiplikation mit dem multiplikativ Inversem der Framerate (v * 1/FPS = 10 m/s * 1/(60 F/s) ~= 10 m/s * 0,01667 s/F = 0,1667 m/F) durchführen und kommt zum gleichen Ergebnis. Letzteres ist dabei die Zeit, die "in einem Frame" vergangen ist, also der zeitliche Abstand zwischen 2 Frames.
In Spielen multipliziert man also seine Geschwindigkeiten mit der seit dem letzten Frame vergangenen Zeit (in Sekunden), um die Geschwindigkeit für den Aktuellen Frame zu erhalten, also die Distanz, die in diesem Frame zurückgelegt werden muss.

Und VSYNC anzuschalten ist nur ein Workaround, da das Problem wieder auftreten kann, wenn das Spiel zu langsam läuft.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

4

01.02.2016, 11:24

Grundsätzlich sollte die Bewegung unabhängig von der Framerate sein. Dein Charakter hat eine bestimmte Geschwindigkeit (bspw. 10 m/s) und das Spiel läuft mit einer bestimmten Framerate (bspw. 60 F/s) Dividiert man nun die Geschwindigkeit v (m/s) durch die Framerate FPS, erhält man einen Wert, mit dem man weiterrechnen kann (in diesem Beispiel ~ 0,1667 m/F). Alternativ zur Division (v/FPS) kann man auch eine Multiplikation mit dem multiplikativ Inversem der Framerate (v * 1/FPS = 10 m/s * 1/(60 F/s) ~= 10 m/s * 0,01667 s/F = 0,1667 m/F) durchführen und kommt zum gleichen Ergebnis. Letzteres ist dabei die Zeit, die "in einem Frame" vergangen ist, also der zeitliche Abstand zwischen 2 Frames.
In Spielen multipliziert man also seine Geschwindigkeiten mit der seit dem letzten Frame vergangenen Zeit (in Sekunden), um die Geschwindigkeit für den Aktuellen Frame zu erhalten, also die Distanz, die in diesem Frame zurückgelegt werden muss.

Und VSYNC anzuschalten ist nur ein Workaround, da das Problem wieder auftreten kann, wenn das Spiel zu langsam läuft.


Genau das hatte ICh ja eigentlich schon aber wenn nun die Framerate um einiges höher ist als der Durchschnitt wird die Aktuelle Bewegung viel größer.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

01.02.2016, 11:42

Wenn du es richtig gemacht hast nicht. Die Framerate steigt -> das Ergebnis der (ersten) Division wird kleiner und die Anzahl der Schritte nimmt zu -> die zurückgelegte Distanz bleibt gleich.
Oder um es anhand von Beispielen zu zeigen:
  • 1 FPS -> 10 (m/s) * 1/(1 (F/s)) = 10 ; 10 (m/F) * 1 (Frames) = 10 (m)
  • 2 FPS -> 10 * 1/2 = 5 ; 5 * 2 = 10
  • 3 FPS -> 10 * 1/3 = 3,33... ; 3,33... * 3 = 10
  • ...
  • 50 FPS -> 10 * 1/50 = 1/5 ; 1/5 * 50 = 10
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

8

02.02.2016, 16:39

Danke für die vielen Ratschläge hat jetzt auch hingehauen.

Werbeanzeige