2010-02-04 9 views
5

Rozumiem, dlaczego to robi, ale tak naprawdę nie mam pojęcia, jak temu zapobiec. A więc scenariusz polega na tym, że każda klatka poruszam samochodem o pewne predefiniowane piksele. Co się dzieje, kiedy idę na wolnym lub szybszym komputerze ... cóż, dostaję mniej lub więcej klatek na sekundę, więc samochód porusza się wolniej lub szybciej. Zastanawiałem się, jak mogę temu zapobiec.Gra wyścigowa, samochód poruszający się szybciej na szybszym komputerze

Podejrzewam, że miałbym ten sam problem z używaniem jakiejkolwiek biblioteki ... Po raz pierwszy robię takie rzeczy w czasie rzeczywistym.

+8

Naciśnij przycisk Turbo! –

+0

Możliwe dupe http://stackoverflow.com/questions/622604/best-approach-for-game-animation – Macke

Odpowiedz

12

Podejrzewam aktualna kod wygląda jakoś tak jak to

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

Ale to powinno być tak:

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

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

Musisz skonfigurować według zdarzenie timera, oczywiście.

10

Poruszaj samochodem zgodnie z zegarami, a nie w trybie framerate. tj. model samochodu powinien być niezależny od reprezentacji wyświetlacza.

+0

Czy licznik czasu obliczał czas między każdą klatką, jeśli rozumiem poprawnie? – DogDog

+0

@Apoc, tak. Będziesz miał znacznie bardziej spójną grę, jeśli pójdziesz w oparciu o czas zamiast framerate – Polaris878

0

Musisz zaoszczędzić czas przed przeprowadzką samochodu i rysunkami.
Zapisz czas po wszystkich obliczeniach.
Przenoszenie samochodu przez Npixels/sekundę

2

Ruch powinien być ograniczony przez "rzeczywistą" zwłokę czasową, tzn. Samochód będzie poruszał się z prędkością x piksela na odcinek czasu.

2

Odczytaj zegar czasu rzeczywistego i przenieś samochód na odpowiednią odległość przez upływ czasu. Może to wyglądać nieco "nierówno", jeśli komputer jest zbyt wolny, ale sprawia, że ​​prędkość samochodu jest niezależna od prędkości procesora.

3

Możesz rozwiązać ten problem, używając precyzyjnych zegarów i matematyki wektorowej.

Tak więc, ze względu na argument, pozwala sugerować, że Twój kod rysunkowy może zostać wywołany w dowolnym momencie, np. 1 sekunda odstępu lub 3 sekundy od siebie lub 0,02 sekundy od siebie.

Prędkość poruszania się samochodu to 40 pikseli na sekundę.

Dlatego liczba pikseli, które należy przenieść to (TIME_NOW - LAST_FRAME_TIME) * 40px.

2

Należy ograniczyć klatek na sekundę do X klatek na sekundę (najczęściej jest to 60 klatek na sekundę). Jest to powszechna funkcja w większości frameworków multimedialnych, w tym SFML. Dla SFML zajrzałbym do metody Window/RenderWindow SetFramerateLimit(unsigned int Limit).

+0

To nie rozwiązuje problemu, gdy liczba klatek na sekundę spada poniżej 60. – DogDog

1

Musisz fix your timestep. Zasadniczo, każda klatka poruszasz samochodem na odległość, która zmienia się w zależności od tego, ile czasu upłynęło od ostatniej aktualizacji. W ten sposób uzyskasz poprawną prędkość niezależnie od szybkości odtwarzania.