Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Metoda stałokrokowa vs metoda zmiennokrokowa - główna pętla gry

Ostatnio zmodyfikowano 2016-04-26 13:29
Autor Wiadomość
aaadam
Temat założony przez niniejszego użytkownika
Metoda stałokrokowa vs metoda zmiennokrokowa - główna pętla gry
» 2016-04-25 11:35:40
Witam, napisałem już kilka prostych gierek. Ale coraz bardziej chcę się w tym kierunku rozwijać, na portalu warsztad dg czy jakoś tak znalazłem artykuł o pętli stałokrokowej.
Artykuł bardzo mi się spodobał(http://temporal.pr0.pl/devblog/download/arts/fixed_step/fixed_step.pdf). Chciałem się dowiedzieć co sądzicie o takim podejściu pisania pętli głównej gry. I w jednym momęcie kodu napisane jest : "lastUpdate += dt; //podmiana" ta zmienna lastUpdate nigdzie póżniej nie jest uzywana to po co ona ?
P-147630
pekfos
» 2016-04-25 12:52:14
Chciałem się dowiedzieć co sądzicie o takim podejściu pisania pętli głównej gry.
To dobra metoda.
P-147631
aaadam
Temat założony przez niniejszego użytkownika
» 2016-04-25 14:32:03
coś jest źle ale nie mogę znaleźć przyczyny, ktoś pomoże ??

C/C++
int main()
{
   
   
    float dt = 0.0f; //czas od ostatniej aktualizacji
    float lastUpdateTime = clock() / CLOCKS_PER_SEC; //czas ostatniej aktualizacji
    //przykladowa funkcja GetCurrentTime() pobiera
    //nam od systemu aktualny czas w sekundach
    float accumulator = 0.0f;
    const float TIME_STEP = 0.03; //krok czasowy, a zarazem czas trwania ramki
   
   
    while( true )
    {
       
        dt =( clock() - lastUpdateTime ) / CLOCKS_PER_SEC; //obliczenie czasu od ostatniej klatki
        lastUpdateTime += dt; //podmiana
        accumulator += dt;
       
        grabInput();
        while( accumulator > TIME_STEP )
        {
            update();
            accumulator -= TIME_STEP;
        }
        draw();
    }
   
}
P-147634
pekfos
» 2016-04-25 14:54:42
C/C++
clock() - lastUpdateTime
Te wartości są w różnych jednostkach.

C/C++
float lastUpdateTime = clock() / CLOCKS_PER_SEC;
Tak nie uzyskasz niecałkowitego wyniku.
P-147635
aaadam
Temat założony przez niniejszego użytkownika
» 2016-04-25 15:13:44
nie ogarniam jak to ma byc poprawnie ?? męczę się z tym już 2 godziny....
 TIME_STEP =3 tym razem

C/C++
int main()
{
   
   
    float dt = 0.0f; //czas od ostatniej aktualizacji
    float lastUpdateTime = GetCurrentTime(); //czas ostatniej aktualizacji
    //przykladowa funkcja GetCurrentTime() pobiera
    //nam od systemu aktualny czas w sekundach
   
   
   
    float accumulator = 0.0f;
    const float TIME_STEP = 3; //krok czasowy, a zarazem czas trwania ramki
    int i = 0;
    while( true )
    {
        i = 0;
        system( "CLS" );
        dt =( GetCurrentTime() - lastUpdateTime ); //obliczenie czasu od ostatniej klatki
        lastUpdateTime += dt; //podmiana
        accumulator += dt;
       
        grabInput();
        while( accumulator > TIME_STEP )
        {
            i++;
            update();
            accumulator -= TIME_STEP;
        }
        draw();
        cout << endl << "i " << i;
        Sleep( 1000 );
    }
   
}


teraz gdy zwiekszam sleepa to wzieksza mi sie zmienna za kazdym obiegiem petli ,czyli w petli update po staremu musze dzialać na timerach ??
P-147637
pekfos
» 2016-04-25 15:27:35
To do niczego nie prowadzi. Skoro tak ci się spodobał tamten artykuł, przeczytaj go ponownie, najlepiej ze zrozumieniem.
P-147640
aaadam
Temat założony przez niniejszego użytkownika
» 2016-04-25 15:29:53
dobra zrobię sobie przerwę, wieczorem jeszcze siąde do tego :)
P-147641
aaadam
Temat założony przez niniejszego użytkownika
» 2016-04-26 11:20:58
przeczytałem kilka artykułów na temat pisania gier i doszedłem do wniosku, że nie do końca dobrze je pisałem... mianowicie na stałe wprowadzałem 30 lub 40 klatek na sekunde i przesuwałem obiekty po przez dodawanie stałych wartosci (przesuwanie pixelowe). A właśnie czytam że powinno się  przesuwać za pomocą czastu np :
C/C++
void CObject::Update( float dt )


{
   
   
    m_Position += m_Velocity * dt;
   
   
}
 
i moje pytanie :  podejście czasowe jest lepsze czy takie ustawianie klatek na sekunde też jest spoko? w sumie jeżeli podczas renderingu zawiesi mi się na chwile gra to może dojsć do ekspolzji fizyki. W sumie chyba sam sobie odpowiedziałem ...
P-147678
« 1 » 2
  Strona 1 z 2 Następna strona