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

[SFML 2.2] Pętla stałokrokowa - jak zrobić

Ostatnio zmodyfikowano 2015-08-11 10:57
Autor Wiadomość
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:
C/C++
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 = 0.03; //krok czasowy, a zarazem czas trwania ramki
//fizyki w sekundach; tutaj 30 milisekund, czyli
//ok. 30 aktualizacji na sekundę
while( true )
{
    dt = GetCurrentTime() - lastUpdateTime; //obliczenie czasu od ostatniej klatki
    lastUpdate += dt; //podmiana
    accumulator += dt;
    GrabInput(); //<-- zbieranie wejscia z klawiatury, myszki, sieci, itp.
    while( accumulator > TIME_STEP )
    {
        UpdateGame( TIME_STEP ); //<-- aktualizacja fizyki i logiki gry
        accumulator -= TIME_STEP;
    }
    RenderGame();

Starałem się znaleźć odpowiedniki funkcji GetCurrentTime() i stworzyłem takie coś:
C/C++
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;
   
    //tutaj są zdarzenia
   
    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.
P-136037
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ą.
C/C++
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();
    }
}
P-136040
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
P-136050
« 1 »
  Strona 1 z 1