2010-02-04 6 views
5

Ich verstehe, warum es das tut, aber ich habe wirklich keine Ahnung, wie man das verhindert. Das Szenario ist also, bei jedem Frame verschiebe ich das Auto um bestimmte vordefinierte Pixel. Was passiert, wenn ich auf einen langsamen oder schnelleren Computer gehe ... Nun, ich bekomme weniger oder mehr Bilder pro Sekunde, so dass das Auto entweder langsamer oder schneller fährt. Ich habe mich gefragt, wie ich das verhindern könnte.Rennwagen Spiel, Auto bewegt sich schneller auf schneller Computer

Ich vermute, dass ich das gleiche Problem hätte, wenn ich irgendeine Bibliothek verwende ... Das ist das erste Mal, dass ich solche Sachen in Echtzeit mache.

+8

Drücken Sie die Turbo-Taste! –

+0

Mögliche Betrüger von http://stackoverflow.com/questions/622604/best-approach-for-game-animation – Macke

Antwort

12

Ich vermutet, Ihr aktueller Code irgendwie wie dieser so aussieht seine

// to be called every frame 
void OnEveryFrame() 
{ 
    MoveCar(); 
    DrawCarToScreen(); 
} 

Aber es soll:

// to be called - for example - 50 times per second: 
void OnEveryTimerEvent() 
{ 
    MoveCar(); 
} 

// to be called every frame 
void OnEveryFrame() 
{ 
    LockTimerEvents(); 
    DrawCarToScreen(); 
    UnlockAndProcessOutstandingTimerEvents(); 
} 

Sie müssen ein entsprechendes Timer-Ereignis eingerichtet, natürlich.

10

Auto nach Timern und nicht Bildrate bewegen. h. das Automodell sollte unabhängig von der Anzeigedarstellung sein.

+0

Würde der Timer die Zeit zwischen den einzelnen Frames berechnen, wenn ich das richtig verstehe? – DogDog

+0

@Apoc, ja. Du wirst ein viel konsistenteres Spiel haben, wenn du basierend auf der Zeit anstelle der Framerate gehst – Polaris878

0

Sie müssen die Zeit speichern, bevor Sie Auto und Zeichnungen bewegen.
Sparen Sie die Zeit nach allen Berechnungen.
Bewegen Sie Ihr Auto von Npixel/Sekunde

2

Die Bewegung sollte durch eine "echte" Zeitverzögerung eingeschränkt werden, d. H. Sie Auto wird mit der Geschwindigkeit von x Pixel pro Zeitscheibe bewegen.

2

Lesen Sie die Echtzeituhr und bewegen Sie das Auto für die verstrichene Zeit über eine angemessene Entfernung. Dies kann etwas "ruckartig" aussehen, wenn der Computer zu langsam ist, aber die Geschwindigkeit des Autos unabhängig von der CPU-Geschwindigkeit macht.

3

Sie können dies mit präzisen Timern und Vektormathematik lösen.

Also aus Gründen des Arguments lässt vorschlagen, dass Ihr Zeichencode zu jedem Zeitpunkt aufgerufen werden könnte, z. 1 Sekunde auseinander oder 3 Sekunden auseinander oder 0,02 Sekunden auseinander.

Nehmen Sie die Bewegungsgeschwindigkeit des Autos auf 40 Pixel pro Sekunde.

Daher ist die Anzahl der Pixel, die es verschieben sollte (TIME_NOW - LAST_FRAME_TIME) * 40px.

2

Sie müssen die Framerate auf X Frames pro Sekunde begrenzen (60 FPS ist am gebräuchlichsten). Dies ist ein häufiges Merkmal in den meisten Multimedia-Frameworks, einschließlich SFML. Für SFML würde ich in die Window/RenderWindow-Methode SetFramerateLimit(unsigned int Limit) schauen.

+0

Das behebt das Problem nicht, wenn die Framerates unter 60 gehen. – DogDog

1

Sie müssen fix your timestep. Grundsätzlich verschiebt jeder Rahmen, den Sie das Auto bewegen, eine Entfernung, die abhängig davon ist, wie viel Zeit seit dem letzten Aktualisierungsaufruf tatsächlich vergangen ist. Auf diese Weise erhalten Sie unabhängig von der Framerate die richtige Geschwindigkeit.