Jeu de course de voiture, voiture en mouvement rapide sur ordinateur plus rapide

StackOverflow https://stackoverflow.com/questions/2201241

  •  18-09-2019
  •  | 
  •  

Question

Je comprends pourquoi il fait cela, mais je ne pas vraiment avoir une idée de la façon d'empêcher cela. Ainsi, le scénario est, chaque image que je déplace la voiture par un certain de pixels prédéfinis. Ce qui se passe est quand je vais sur l'ordinateur lent ou plus rapide ... bien que je reçoive moins ou plus d'images par seconde pour que la voiture se déplace soit plus lent ou plus rapide. Je me demandais comment je pourrais empêcher cela.

Je soupçonne que j'aurais le même problème en utilisant une bibliothèque ... Ceci est ma première fois à faire des choses en temps réel comme ça.

Était-ce utile?

La solution

Je soupçonne que votre code actuel ressemble en quelque sorte comme celui-ci

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

Mais il devrait être comme ceci:

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

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

Vous devez mettre en place un événement de minuterie selon, bien sûr.

Autres conseils

voiture de se déplacer selon minuteries et non framerate. à savoir le modèle de voiture doit être indépendante de la représentation d'affichage.

Vous pouvez résoudre ce problème en utilisant des minuteries précis et mathématiques vecteur.

Alors, pour le bien de l'argument laisse suggérer votre code de dessin pourrait être appelé à tout moment, par exemple 1 seconde à part ou 3 seconde d'intervalle, soit 0,02 secondes d'intervalle.

Prendre la vitesse de déplacement de la voiture pour être de 40 pixels par seconde.

Par conséquent, le nombre de pixels, il doit se déplacer est. (TIME_NOW - LAST_FRAME_TIME) * 40px

Le mouvement devrait être contraint par un retard de temps « réel », à savoir votre voiture se déplace à la vitesse de pixel x par tranche de temps.

Lire l'horloge en temps réel, et déplacer la voiture une distance appropriée pour le temps écoulé. Cela peut sembler un peu « saccadé » si l'ordinateur est trop lent, mais rend la vitesse de la voiture indépendante de la vitesse du processeur.

Vous devez limiter le framerate aux cadres X par seconde (FPS 60 est le plus courant). Ceci est une caractéristique commune dans la plupart des cadres multimédias, y compris SFML. Pour SFML je regarde dans la méthode de fenêtre / de RenderWindow SetFramerateLimit (unsigned int limite) .

Vous devez fixer votre timestep. En gros, chaque image que vous déplacez la voiture une distance qui varie en fonction de combien de temps est en fait écoulé depuis le dernier appel de mise à jour. De cette façon, vous obtenez la vitesse correcte quel que soit le débit.

Vous devez enregistrer le temps avant que la voiture en mouvement et dessins.
Enregistrez le temps après tous les calculs.
Déplacez votre voiture en Npixels / seconde

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top