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

[SFML 2.0] Jednakowe tempo gry

Ostatnio zmodyfikowano 2012-09-24 19:29
Autor Wiadomość
wojownik266
Temat założony przez niniejszego użytkownika
[SFML 2.0] Jednakowe tempo gry
» 2012-09-24 12:45:58
Witam. Jak zrobić coś takiego w SFML 2.0 aby gra działała w jednakowym tempie na każdym komputerze? Przykład mile widziany.
P-65466
DejaVu
» 2012-09-24 14:45:31
W tutorialu SFML 1.6 na ich stronie jest przykład.
P-65467
yoogi
» 2012-09-24 15:02:14
Pobaw się czasem :) lub VSync
P-65468
AlfaLeporis
» 2012-09-24 15:30:40
Proponuję pobawić się pętlą stałokrokową. Za jakiś czas opublikuję pełny kurs SFML2, a tym czasem daje wycinek z przykładowym kodem:

C/C++
//Tworzymy zegar dzięki któremu będziemy mogli odmierzać czas
sf::Clock clock;

//Zmienna wskazująca ile czasu minęło od ostatniej aktualizacji logiki
float accumulator = 0;

//Zmienna wskazująca, co jaki czas ma następować aktualizacja logiki
float TIME_STEP = 0.03f;

//Pętla główna
while( window->isOpen() )
{
    //Pobieray czas ostatniej klatki, zapisujemy go do zmiennej i resetujemy zegar
    accumulator += clock.restart().asSeconds();
   
    //Obsłuż urządzania wejściowe
    input();
   
    //Jeżeli czas od ostatniej aktualizacji logiki jest większy niż ten ustalony, rozpoczynamy aktualizację
    if( accumulator >= TIME_STEP )
    {
        //Zaktualizuj logikę gry
        logic();
       
        //Usuń z akumulatora czas, aby móc ponownie zacząć liczyć
        accumulator -= TIME_STEP;
    }
   
    //Wywołaj draw dla obrazków i tekstu...
    draw();
   
    //... i wszystko wyświetl
    window.display();
}

Ogólnie rzecz biorąc, zasada jest taka że aktualizujemy logikę co jakiś czas a nie tyle ile jest klatek, w tym przypadku będzie to ~30 razy na sekundę (dokładniej to 33.3(3)). Co każdy przebieg aktualizujemy czas w zmiennej akumulatora - jeżeli będzie on większy niż ten ustawiony w TIME_STEP - aktualizuje się logikę oraz resetuje się akumulator. Działa równie dobrze na szybkim i wolnym sprzęcie :)
P-65469
wojownik266
Temat założony przez niniejszego użytkownika
» 2012-09-24 16:27:18
Czekam z niecierpliwością na pierwszą lekcje tego kursu. A tak przy okazji to z ilu lekcji będzie się on składał? Pytam z czystej ciekawości.
P-65474
anonim
» 2012-09-24 16:36:05
Odnośnie kursu. Czy SFML2 różni się wiele od 1.6 (poza zmianą nazw funkcji)?
P-65475
hincu
» 2012-09-24 17:02:05
sfml 2.0 jest wydajniejsze od 1.6, jest podzielona na wiecej klas ( co jest plusem ) innych roznic raczej nie ma

mozesz uzyc metody void setFramerateLimit (unsigned int fps);   sluzy ona do przypisania maksymalnej liczby fps   z timerami nie musisz sie bawic :P


    if( TIME_STEP >= limitczasowy )
    {
        Input();
        logic();
        Draw();    
        TIME_STEP.Reset();   // resetuje timer
    }


ten kod mi sie nie podoba... wystarczy wykonac taki kod
P-65476
anonim
» 2012-09-24 17:20:51
Czyli jeśli ustawię SetFramerateLimit to nie muszę się martwic o to, żeby gra chodziła na wszystkich komputerach tak samo?
P-65477
« 1 » 2
  Strona 1 z 2 Następna strona