[SFML 2.2] Pętla stałokrokowa - jak zrobić
Ostatnio zmodyfikowano 2015-08-11 10:57
executor1909 Temat założony przez niniejszego użytkownika |
[SFML 2.2] Pętla stałokrokowa - jak zrobić » 2015-08-11 00:01:54 Pewien miły użytkownik przysłał mi ciekawy artykuł o pętli stałokrokowej. Problem polega na tym, że kod napisany jest w starym SFML i niektóre funkcje nie działają. Oto kod: float dt = 0.0f; float lastUpdateTime = GetCurrentTime();
float accumulator = 0.0f; const float TIME_STEP = 0.03;
while( true ) { dt = GetCurrentTime() - lastUpdateTime; lastUpdate += dt; accumulator += dt; GrabInput(); while( accumulator > TIME_STEP ) { UpdateGame( TIME_STEP ); accumulator -= TIME_STEP; } RenderGame();
Starałem się znaleźć odpowiedniki funkcji GetCurrentTime() i stworzyłem takie coś: sf::Clock clock; sf::Time time = clock.getElapsedTime(); float dt = 0.0f; float LastUpdateTime = time.asSeconds(); float accumulator = 0.0f; const float TIME_STEP = 1 / 60; while( true ) { time = clock.getElapsedTime(); dt = time.asSeconds() - LastUpdateTime; LastUpdateTime += dt; accumulator += dt; while( accumulator > TIME_STEP ) { okno.clear( sf::Color::Green ); aktualizujpolozenie(); okno.draw( postac ); accumulator -= TIME_STEP; } okno.display(); }
Niestety po włączeniu pokazuje się białe tło i nic nie działa. W czym tkwi błąd? EDIT: Coraz bardziej zastanawiam się, czy dobrze rozumiem tą pętlę. Nie bardzo wiem, gdzie powinny być zdarzenia i inne funkcje, co prawdopodobnie wyraźnie widać :D Na razie testuję tą pętlę na wcześniej napisanym i działającym prostym programie, więc nie zrobiłem jeszcze klasy gry z jej stanami, itp. Zależy mi na razie tylko na samej pętli. |
|
Lora |
» 2015-08-11 00:38:10 W pętli stałokrokowej powinny się znajdować wszystkie funkcje aktualizujące logikę gry. Za to funkcję rysujące mają znajdować się za nią. void render() { sf::Clock clock; sf::Time timeSinceLastUpdate = sf::Time::Zero; sf::Time TimePerFrame = sf::seconds( 1.f / 40.f ); while( okno.isOpen() ) { timeSinceLastUpdate += clock.restart(); while( timeSinceLastUpdate > TimePerFrame ) { events(); updateLogic(); timeSinceLastUpdate -= TimePerFrame; } okno.clear(); drawEverything(); okno.display(); } }
|
|
executor1909 Temat założony przez niniejszego użytkownika |
» 2015-08-11 10:57:28 Dziękuje bardzo za odpowiedź. Przeniosłem zdarzenia do pętli, a funkcje clear(), draw() i display() za nią i wszystko działa poprawnie! :D |
|
« 1 » |