 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Stormy

Anmeldungsdatum: 10.09.2004 Beiträge: 567 Wohnort: Sachsen - wo die schönen Frauen wachsen ;)
|
Verfasst am: 24.03.2007, 20:27 Titel: [Tutorial] FPS-unabhängige Bewegung |
|
|
Hallo miteinander,
wie ich schon in Thread von Steff angekündigt habe, werde ich eine kleines Tutorial vorstellen, was sich mit fps-unabhängiger Bewegung beschäftigt. Viel Spaß beim Lesen!
Warum ist eine fps-unabhängig Bewegung wichtig?
Ja, gute Frage. Es gibt doch die achso "wunderbare" Lösung mit SLEEP. Das Problem dabei ist, dass jene Programme die mit Sleep arbeiten bei den verschiedenen Rechnern heutzutage unterschiedlich schnell laufen werden, da Hintergrundprogramme den Programmfluss ins Stocken bringen oder weil hauptsächlich der CPU unterschiedlich schnell ist.
Wir untersuchen diese Problematik an einem kleinen Beispiel in dem ein Kreis von einer Position aus durch seinen Richtungsvektor bewegt werden soll. Dabei soll der Kreis sich möglichst gleichmäßig bewegen.
Als ersten verwenden wir die Methode mit SLEEP:
Code: | OPTION EXPLICIT
TYPE Point2D
AS double X, Y
END TYPE
dim as Point2D Position, Vektor
Position = type<Point2D>(0,0)
Vektor = type<Point2D>(25,25)
screenres 640,480,32
do
cls
Position.X += Vektor.X
Position.Y += Vektor.Y
circle (Position.X, Position.Y), 15, RGB(255,255,0)
sleep 50
loop until MULTIKEY(1) |
So sollte man es nicht machen! SLEEP ruft intern die WinAPI auf und lässt Windows etwas Zeit seine Hintergrundprogramme auszuführen. Was wir im Bild sehen ist ein nach rechts unten zuckender Kreis. Das ist also nicht das Wahre. Aushilfe verschafft uns die TIMER-Funktion, die uns die vergangene Zeit seit dem Systemstart in Sekunden zurückgibt.
Hier nun die bessere Variante
Code: | OPTION EXPLICIT
TYPE Point2D
AS double X, Y
END TYPE
dim as Point2D Position, Vektor
dim as double dt, lastframe
Position = type<Point2D>(0,0)
Vektor = type<Point2D>(25,25)
screenres 640,480,32
dt = timer - lastframe
lastframe = timer
do
screenlock
cls
dt = timer - lastframe
lastframe = timer
Position.X += Vektor.X*dt
Position.Y += Vektor.Y*dt
Circle (Position.X, Position.Y), 15, RGB(255,255,0)
screenunlock
loop until MULTIKEY(1) |
Tja, was wurde hier gemacht? Was hat sich geändert? Es gibt nun zwei neue Variablen, die für die Speicherung der Zeit dienen:- dt (gelesen delta t) - die Differenz zwischen der aktuellen Zeit und der letzten Messung
- lastframe - die letzte Messung
Mittels dieser beiden Variablen können wir nun eine Bewegungsfunktion erzeugen, die nur von der Zeit abhängig ist. Dies tun wie in unserem Beispiel in diesen beiden Zeilen:
Code: | Position.X += Vektor.X*dt
Position.Y += Vektor.Y*dt |
Dadurch bezwecken wir, dass zB. Position.X innerhalb einer Sekunde um den Wert von Vektor.X vergrößert wird. Also verändert sich die Position jede Sekunde um 25 in X- und Y-Richtung.
Dadurch können Animationen besser koordinieren und müssen nicht mit solchen schwammigen Werten bei SLEEP arbeiten.
Abschlusswort:
Ich glaube, ich sollte euch mit meinem kleinen Beispiel gezeigt haben, wie schnell und einfach man fps-unabhängige Bewegungen erzeugen kann.
cya, Stormy _________________ +++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 24.03.2007, 21:55 Titel: |
|
|
Ich hab bei dem Titel gehofft, du erklärst uns, wiie man einfach mit Thrads realisiert, dass eine Animation auf einem lahmen Rechner mit einem schnellen Synchron bleibt (FrameSkipping)...
(Nich, dass ich das net könnte, aber das hätte ich bei dem Titel erwartet) |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 24.03.2007, 22:01 Titel: |
|
|
Hallo
Etwas ähnliches zum Thema gleichmässige Bewegung hatten wir hier schon mal.
Gruß
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
Stormy

Anmeldungsdatum: 10.09.2004 Beiträge: 567 Wohnort: Sachsen - wo die schönen Frauen wachsen ;)
|
Verfasst am: 24.03.2007, 23:19 Titel: |
|
|
PMedia hat Folgendes geschrieben: |
Ich hab bei dem Titel gehofft, du erklärst uns, wiie man einfach mit Thrads realisiert, dass eine Animation auf einem lahmen Rechner mit einem schnellen Synchron bleibt (FrameSkipping)...
(Nich, dass ich das net könnte, aber das hätte ich bei dem Titel erwartet) |
Gut möglich, dass man mit Threads Animationen realisieren kann. Ich selber habe mir Threads noch nicht so genau angesehen. Allerdings funktioniert meine Variante recht solide bisher. _________________ +++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 24.03.2007, 23:21 Titel: |
|
|
ich hatte bisher geglaub nach einem Screenlock könne man keine Standart GRX Befehle nutzen ?! da hätte ich mir das zwei-screen-buffern auch sparen können ?!  _________________
 |
|
Nach oben |
|
 |
steff

Anmeldungsdatum: 24.03.2007 Beiträge: 11
|
Verfasst am: 25.03.2007, 16:02 Titel: |
|
|
Hi!
@Stormy
Ist auf alle Fälle nützlich!
Bin derzeit noch beim Testen und Experimentieren!
BTW Herlichen Dank für Dein OpenGL tutorial. Ist wirklich gut gemacht.
Gruß
steff |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|