[C++] Gra w konsoli, miganie ekranu
Ostatnio zmodyfikowano 2016-11-10 00:55
Clarc Temat założony przez niniejszego użytkownika |
[C++] Gra w konsoli, miganie ekranu » 2016-11-09 20:05:47 Hejka o to mój kod: #include <iostream> #include<iomanip> #include <windows.h> #include <conio.h> using namespace std; int main() { int tab[ 12 ][ 12 ] = { 0 }; int orientacja, x = 1, y = 1; int ile_maszt; int i, a; unsigned char znak; HANDLE hOut; hOut = GetStdHandle( STD_OUTPUT_HANDLE ); SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY ); while( 1 ) { for( i = 0; i < 12; i++ ) { for( a = 0; a < 12; a++ ) { if(( i == y ) &&( a == x ) ) { SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY ); cout << setw( 3 ) << tab[ i ][ a ]; SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY ); } else cout << setw( 3 ) << tab[ i ][ a ]; } cout << "\n"; } znak = getch(); ClearScreen(); switch( znak ) { case 72: if( y == 1 ) y = 10; else y--; break; case 80: if( y == 10 ) y = 1; else y++; break; case 13: break; case 75: if( x == 1 ) x = 10; else x--; break; case 77: if( x == 10 ) x = 1; else x++; break; default: break; } } }
kod działa ale przejscia nie sa płynne,np u mnie widać jak ekran jest kasowanya dopiero potem jest wypisywana wierszami tablica. Jak można się za to zabrać żeby przejscia były płynne? |
|
pekfos |
» 2016-11-09 20:13:39 Nie czyść ekranu, tylko go nadpisuj. Konsola w systemie Windows jest za wolna, by ją czyścić w takich grach. Do tego, klawisze strzałek generują 2 kody - nie obsługujesz tego, więc gra musi się narysować 2 razy, zanim ruch zostanie wykonany. |
|
Clarc Temat założony przez niniejszego użytkownika |
» 2016-11-09 21:41:51 nadpisuj? możesz rozwinąć temat? słyszałem o czymś takim jak podwójne bofurowanie co o tym sądzisz? |
|
polepszacz |
» 2016-11-09 22:16:13 W tym kontekście nadpisywanie = wypełnienie spacjami całego ekranu roboczego. |
|
pekfos |
» 2016-11-10 00:55:40 W tym kontekście nadpisywanie = wypełnienie spacjami całego ekranu roboczego. |
Nie. Wypełnianie ekranu następnym stanem gry. Spacje to dalej będzie zauważalne czyszczenie. nadpisuj? możesz rozwinąć temat? słyszałem o czymś takim jak podwójne bofurowanie co o tym sądzisz? |
Przenieś kursor na początek i wypisz wszystko jeszcze raz. Jednak jeśli jakiś znak nie zostanie nadpisany, zostanie w tym miejscu jego stara wartość. Wypisz "12345", potem "abc" i wyjdzie "abc45", stąd powinieneś wypisać "abc ". W bardziej złożonych zastosowaniach jest to niewygodne i wtedy opłaca się już zastosować podwójne buforowanie o którym wspomniałeś. Tworzy się tablicę znaków i atrybutów pokrywającą cały ekran konsoli, z którą możesz robić co tylko sobie chcesz i potem, na żądanie, wypisać ją na ekran. Wtedy dopiero opłaca się robić czyszczenie 'ekranu' bo ekran nie jest od tego od razu czyszczony. A skoro masz już robić tablice znaków i atrybutów, możesz użyć do tego struktury CHAR_INFO i wypisywać cały bufor jednym wywołaniem WriteConsoleOutput(). Takie rozwiązanie jest już ciężkie do przebicia. Pamiętaj jednak, że wprowadzając własny, dodatkowy bufor, musisz zaimplementować wszystkie niezbędne operacje na nim. Nie możesz już ręcznie pisać po konsoli, by nie psuć efektu, a więc żegnaj cout, printf() i wszystko inne, co do tej pory stosowałeś, zamiast tego, pewnie twoim nowym najlepszym przyjacielem będzie funkcja sprintf() lub vsprintf(). Ewentualnie użyj gotowej biblioteki, np New Curses. Kurs New Curses, C++ |
|
« 1 » |