2010-02-04 10 views
5

Capisco perché lo fa, ma non ho davvero idea di come impedirlo. Quindi lo scenario è, ogni fotogramma sposto l'auto da un certo numero di pixel predefiniti. Quello che succede è quando vado su un computer lento o più veloce ... beh ottengo meno o più fotogrammi al secondo, quindi l'auto si muove più lentamente o più velocemente. Mi stavo chiedendo come potrei evitarlo.Gioco di auto da corsa, macchina che si muove più veloce su computer più veloce

Sospetto che avrei lo stesso problema con qualsiasi libreria ... Questa è la prima volta che faccio cose del genere in tempo reale.

+8

Premere il pulsante Turbo! –

+0

Possibile dupe di http://stackoverflow.com/questions/622604/best-approach-for-game-animation – Macke

risposta

12

Ho il sospetto che il codice corrente sembra un po 'come questo

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

ma dovrebbe essere simile a questo:

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

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

È necessario impostare un evento timer in base, ovviamente.

10

Sposta l'auto in base ai timer e non al framerate. cioè il modello di auto dovrebbe essere indipendente dalla rappresentazione del display.

+0

Il timer calcolerebbe il tempo tra ogni frame se ho capito bene? – DogDog

+0

@Apoc, sì. Avrai un gioco molto più consistente se vai in base al tempo invece del framerate – Polaris878

0

È necessario risparmiare tempo prima di spostare auto e disegni.
Salva l'ora dopo tutti i calcoli.
spostare l'auto da Npixels/secondo

2

Il movimento dovrebbe essere vincolato da un "vero" tempo di ritardo, vale a dire la vostra auto si muoverà alla velocità di x pixel per intervallo di tempo.

2

Leggere l'orologio in tempo reale e spostare l'auto a una distanza appropriata per il tempo trascorso. Questo potrebbe sembrare un po '"a scatti" se il computer è troppo lento, ma rende la velocità della macchina indipendente dalla velocità della CPU.

3

È possibile risolvere questo problema utilizzando timer precisi e matematica vettoriale.

Quindi, per il gusto dell'argomento, lasciamo pensare che il codice del disegno possa essere richiamato in qualsiasi momento, ad es. 1 secondo di distanza o 3 secondi di distanza o 0,02 secondi di distanza.

Portare la velocità di spostamento dell'automobile a 40 pixel al secondo.

Di conseguenza, il numero di pixel che deve essere spostato è (TIME_NOW - LAST_FRAME_TIME) * 40px.

2

È necessario limitare il framerate a X fotogrammi al secondo (60 FPS è il più comune). Questa è una caratteristica comune nella maggior parte dei framework multimediali, incluso SFML. Per SFML guarderei nel metodo Window/RenderWindow SetFramerateLimit(unsigned int Limit).

+0

Questo non risolve il problema quando i frame rate vanno sotto i 60. – DogDog

1

È necessario fix your timestep. Fondamentalmente, ogni fotogramma si sposta l'auto a una distanza che varia in base a quanto tempo è effettivamente trascorso dall'ultima chiamata di aggiornamento. In questo modo, ottieni la velocità corretta indipendentemente dal framerate.