Metoda stałokrokowa vs metoda zmiennokrokowa - główna pętla gry
Ostatnio zmodyfikowano 2016-04-26 13:29
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 ? |
|
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. |
|
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 ?? int main() { float dt = 0.0f; float lastUpdateTime = clock() / CLOCKS_PER_SEC; float accumulator = 0.0f; const float TIME_STEP = 0.03; while( true ) { dt =( clock() - lastUpdateTime ) / CLOCKS_PER_SEC; lastUpdateTime += dt; accumulator += dt; grabInput(); while( accumulator > TIME_STEP ) { update(); accumulator -= TIME_STEP; } draw(); } }
|
|
pekfos |
» 2016-04-25 14:54:42 Te wartości są w różnych jednostkach. float lastUpdateTime = clock() / CLOCKS_PER_SEC;
|
Tak nie uzyskasz niecałkowitego wyniku. |
|
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 int main() { float dt = 0.0f; float lastUpdateTime = GetCurrentTime(); float accumulator = 0.0f; const float TIME_STEP = 3; int i = 0; while( true ) { i = 0; system( "CLS" ); dt =( GetCurrentTime() - lastUpdateTime ); lastUpdateTime += dt; 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 ?? |
|
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. |
|
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 :) |
|
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 : 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 ... |
|
« 1 » 2 |