Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

[Tutorial] FPS-unabhängige Bewegung

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
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 ;)

BeitragVerfasst am: 24.03.2007, 20:27    Titel: [Tutorial] FPS-unabhängige Bewegung Antworten mit Zitat

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:
  1. dt (gelesen delta t) - die Differenz zwischen der aktuellen Zeit und der letzten Messung
  2. 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 24.03.2007, 21:55    Titel: Antworten mit Zitat

missbilligen

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
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 24.03.2007, 22:01    Titel: Antworten mit Zitat

Hallo

Etwas ähnliches zum Thema gleichmässige Bewegung hatten wir hier schon mal.

Gruß
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Stormy



Anmeldungsdatum: 10.09.2004
Beiträge: 567
Wohnort: Sachsen - wo die schönen Frauen wachsen ;)

BeitragVerfasst am: 24.03.2007, 23:19    Titel: Antworten mit Zitat

PMedia hat Folgendes geschrieben:
missbilligen

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 24.03.2007, 23:21    Titel: Antworten mit Zitat

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 ?! zwinkern
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
steff



Anmeldungsdatum: 24.03.2007
Beiträge: 11

BeitragVerfasst am: 25.03.2007, 16:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz