Autor Wątek: Pętla kontrolowana przez czas - ruch skokowy zamiast płynnego  (Przeczytany 2768 razy)

Offline bingo009

  • Użytkownik

# Wrzesień 09, 2012, 17:40:30
Witam was serdecznie, otóż w mojej głównej pętli gry dałem sobie pętle kontrolowaną przez czas. Wsadziłem też do niej warunki ruchu gracza. I mam problem, bo gracz porusza się ruchem skokowym, zamiast płynnym. O co tutaj chodzi? Oto kod:
const int FPS = 60;
double starttime = 0;
double endtime = 0;
short int counts = 0;

a tu pętla(przed rozpoczęciem pętli głównej pobieram czas za pomocą funkcji al_get_time:
while( 1 )
{
    endtime = al_get_time();
    if( endtime - starttime >= 1.0 )
    {
        starttime = al_get_time();
        counts = 0;
        break;
    }
   
    if( counts == FPS ) break;
     
    //Time controlled code
    if( al_key_down( & key_state, ALLEGRO_KEY_RIGHT ) ) ++PLAYER0.x;
   
    if( al_key_down( & key_state, ALLEGRO_KEY_LEFT ) ) --PLAYER0.x;
   
    ++counts;
   
}

Proszę was, nie podawajcie innych rozwiązań, tylko pomóżcie mi udoskonalić moje rozwiązanie. Jak dostane inne rozwiązanie, to się nie naucze.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline _OskaR

  • Użytkownik

# Wrzesień 09, 2012, 18:00:15
Wystarczy, że zrobisz 60 iteracji w 0.02s. Zostaje 0.98s - w tym czasie masz FPS == counts i robisz breaka.
Lepiej chyba na początku pętli sprawdzać czy mija 1/60s - jak tak, to resetujesz timer i jedziesz ze swoją logiką, jak nie - czekasz.
« Ostatnia zmiana: Wrzesień 09, 2012, 18:09:40 wysłana przez _OskaR »

Offline bingo009

  • Użytkownik

# Wrzesień 09, 2012, 18:21:12
Można prosić o jakiś pseudokod? Nie mogę sobie coś tego wyobraźić.

Offline _OskaR

  • Użytkownik

# Wrzesień 09, 2012, 18:38:27
while...
{
    if(1/60s < currentTime)
    {
        resetTimer()
        urFunctions
    }
}
Trochę się to rozjedzie, jeśli dana iteracja będzie trwała więcej niż 1/60s.
« Ostatnia zmiana: Wrzesień 09, 2012, 18:47:31 wysłana przez _OskaR »

Offline bingo009

  • Użytkownik

# Wrzesień 13, 2012, 23:21:43
 Na forum dostałem już odp. Kod chyba jest podobny do twojego, ale dzięki za wyjaśnienie.

Offline bingo009

  • Użytkownik

# Wrzesień 18, 2012, 15:42:12
Późno pisane, ale już zrobione. W sumie taki sam sposób jak twój, dzięki za pomoc wielkie.