Odświeżanie konsoli

0

Hej,
mam kilka (raczej laickich) pytań.

Mam pewien program, w którym przeprowadzam symulację pewnego terenu (ruch zwierzat po pewnym terenie itp). W każdym razie mam sobie tablicę char zajmującą mi całą konsolę, w której sobie wyświetlam jak na mapie moją symulację. Odświeżam ją co 2 sekundy, korzystając z funkcji system("cls"). Jednak nie mam płynności - tablica ładuje się zbyt wolno, wiersz po wierszu (po rpstu wypisuje ją coutem). Czy jest jakiś prosty sposób, żeby tablica ładowała się natychmiastowo? Żeby "symulacja" była płynna?

I mam jeszcze drugie pytanie - chciałbym, aby moja mapka odświeżała się tak długo, aż użytkownik wciśnie jakiś klawisz - wtedy program wyświetla statystyki i ponownie oczekuje wciśnięcia klawisza, gdy to się stanie, ponownie wraca do pętli z odświeżaniem mapy. Użycie do tego funkcji kbhit() tak jak tutaj: http://4programmers.net/Forum/C_i_C++/193175-funkcja_sprawdzajaca_wcisniecie_klawisza będzie ok?

Dzięki ;)

0

nie znam się na tym za bardzo ale winapi ma coś do zmiany bufora konsoli... zapewne można wpisać tam wszystko zamiast bawić się cout'em... innej opcji nie widzę na szybsze wyświetlanie. Jeśli się na winapi zdecydujesz to ma też getasynckeystate co sprawdza czy dany klawisz jest wciśnięty. Niestety to rozwiązanie tylko na windowsa. Powodzenia.

0

Dzięki za odpowiedź. Z drugą częścią zadania poradziłem sobie w miarę bezboleśnie używając tego kbhit().

Więc nie będzie płynnie, bo po prostu tekst z cout jest wypisywany w takim tempie w konsoli, tak? Wie ktoś może, czy można ustawić tak, żeby tekst wyświetlał się szybciej? (Natychmiastowo najlepiej)?

0

no cout działa ze swoją prędkością...

0

nie odswierzaj za pomoca system("cls"). Bo pewnie co robisz to rysujesz mape od nowa. To jest blad. Po prostu rysuj te rzeczy ktore sie zmienily.

do poczekania na przycisk. kbhit bedize ok ale pamietaj ze to jest platform specific rozwiazanie.

Zastanow sie czy nie lepiej tego zrobic w jakies biblotece graficznej typu SDL

1

Dane zamiast coutem zapisujesz do bufora (możesz użyć strinsgstream, wtedy użycie będzie podobne do cout'a, ale sprintf bedzie szybciej). potem przesuwasz kursor do pozycji 0, 0 za pomocą SetConsoleCursorPosition() i wyświetlasz bufor za pomocą WriteConsole().
Taka namiastka doublebufferingu powinna poprawić twoje wyswietlanie

BTW mogliby dodać w WinAPI możliwosć ustawienia bezpośredniego adresu bufora konsoli...

2

Żeby była jasność cout to strumień danych wyjściowych domyślnie skojarzony z konsolą!
A to oznacza, że nie ma pełnej funkcjonalności konsoli, bo jej nie może mieć!
Trzeba skorzystać z jakiejś biblioteki. Najlepiej z NCURSES.

1 użytkowników online, w tym zalogowanych: 0, gości: 1