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

[Dynamiczna gra] Odmierzanie czasu w tle

Ostatnio zmodyfikowano 2014-08-03 12:42
Autor Wiadomość
Dwunogalek
Temat założony przez niniejszego użytkownika
[Dynamiczna gra] Odmierzanie czasu w tle
» 2014-07-19 13:02:47
Witam,
Jakiś czas temu miałem problem z odmierzaniem czasu w swojej grze konsolowej w której podczas oczekiwania na klawisz program żyje swoim życiem.
Dzięki pomocy użytkownika: Alixir, między innymi przeanalizowaniu jego kodu i w pełni go zrozumieniu, udało mi się go zastosować
w sposób w jaki miało działać.

Tylko teraz mam kolejny problem.
Normalnie odmierzałem czas korzystając z zegara systemowego: time(NULL), odmierzając czas co 1 sekundę. Zauważyłem że kiedy w poniższym fragmencie różnicę dwóch czasów przyrównam do 0.5 przestaje działać, a zależy mi na przyśpieszeniu rozgrywki ?
W jaki sposób mam to zrobić skoro time(NULL) zwraca tylko liczbę całkowitą przez co nie mam możliwości brania niższych wartości niż 1 sekunda ?

Gdzieś widziałem sposób z clock() i CLOCKS_PER_SEC ale nie wiem jak się za to zabrać - ciężko mi idzie zrozumienie biblioteki time.h ;)

KOD (fragment)
C/C++
int main() {
    char znak;
    int count, prev_count = time( NULL );
   
    do
    {
        count = time( NULL );
        if(( count - prev_count ) == 1 )
        {
            /*animacja - przesuwanie elementow na tablicy 
                    niestety nastepuje po jednej sekundzie a chcialbym np. 0.5 co w tym sposobie nie dziala,
                    wiem jak to zwolnic w łatwy sposob ale odwrotnie nie mam pomyslu*/
        }
        prev_count = count;
       
        if( kbhit() )
        {
            //ruch po planszy
        }
    } while( znak != 'q' );
   
}

Będę wdzięczny chociaż za jakąś wskazówkę czy pomysł na inne rozwiązanie tego problemu :)
P-114012
rav_jarosz2
» 2014-07-19 13:18:17
Mógłbyś to zrobić za pomocą biblioteczki Allegro. Tam masz timery, które aktywują coś co określony czas. (Co ileś milisekund, albo ileś razy na sekundę). Robienie tego w konsoli będzie nieźle trudne.
http://cpp0x.pl/kursy/Kurs-Allegro-4-x-C++/Timery/70
P-114018
unkn9wn
» 2014-07-19 13:54:14
http://cpp0x.pl/kursy/Kurs-C++​/Biblioteka-time-h/321

jest i to czego szukasz

clock_t – zwraca czas od kiedy program został uruchomiony
Jeżeli nie ma dostępu do tej informacji funkcja zwróci wartość -1. Najwygodniej skonwertować czas który zwraca funkcja na sekundy używając CLOCKS_PER_SEC.
Przykład użycia
C/C++
#include <time.h>
#include <conio.h>
#include <iostream>

void czekaj( int sekundy )
{
    clock_t koniec_czekania;
    koniec_czekania = clock() + sekundy * CLOCKS_PER_SEC;
    while( clock() < koniec_czekania ) { }
}

int main()
{
    std::cout << "Program zamknie sie za:" << std::endl;
    for( int i = 5; i > 0; i-- ) {
        std::cout << i << std::endl;
        czekaj( 1 );
    }
    return 0;
}




P-114022
pekfos
» 2014-07-19 14:05:57
Zauważyłem że kiedy w poniższym fragmencie różnicę dwóch czasów przyrównam do 0.5 przestaje działać, a zależy mi na przyśpieszeniu rozgrywki ?
Jak chcesz osiągnąć 0.5, gdy odejmujesz od siebie 2 liczby całkowite?

Mógłbyś to zrobić za pomocą biblioteczki Allegro. Tam masz timery, które aktywują coś co określony czas. (Co ileś milisekund, albo ileś razy na sekundę). Robienie tego w konsoli będzie nieźle trudne.
Pchać allegro do gry konsolowej? Lista powodów, dla których można by to robić:

To by było na tyle..
P-114026
Dwunogalek
Temat założony przez niniejszego użytkownika
» 2014-07-20 21:26:02
Rzeczywiście korzystanie z timerów allegro raczej nie ma sensu.

Ale z clock_t skorzystam jak tylko rozgryzę "jak to działa" ;P

Dzięki za pomoc :)
P-114147
unkn9wn
» 2014-07-20 22:42:37
W sumie to funkcja

clock() zwraca czas od uruchomienia programu, a
clock_t to zmienna w której możesz przechować czas

no i ewentualnie warto wspomnieć że clock() zwraca w milisekundach

więc

tworzysz sobie pętlę w której sprawdzasz czy gra nie dobiegła końca (np.: zmienną typu bool),
wewnątrz tworzysz kolejną pętlę
C/C++
while( clock() - czasOdOstatniegoOdswiezenia >= juzCzas )
//// jezeli czas od uruchomienia programu minus czas od ostatniego odswiezenia jest większy(lub równy) niż czas jaki sobie ustalimy
{
    // działamy!!
    //...
    czasOdOstatniegoOdswiezenia = clock(); // zapisujemy sobie czas bieżącego odświeżenia
}

ot tyle
P-114151
pekfos
» 2014-07-21 12:59:14
no i ewentualnie warto wspomnieć że clock() zwraca w milisekundach
Nieprawda.
P-114159
1aam2am1
» 2014-07-31 15:03:42
clock() zwraca clock_t któtr jest czasem od uruchomienia programu
clock_t/CLOCKS_PER_SEC daje czas w sekundach od uruchomienia programu
P-114747
« 1 » 2
  Strona 1 z 2 Następna strona