Święta w ASCII Art
Transkrypt
Święta w ASCII Art
Podstawy Informatyki 1 mgr inż. Tomasz Jaworski Święta w ASCII Art Czym jest ASCII Art? ASCII-Art to sposób tworzenia bardzo prostych rysunków w programach komputerowych, w których pracuje się z tekstem (np. edytory, programy pocztowe, itp.). Rysunki te są układane za pomocą zwykłych znaków ASCII, stawianych na obszarze o stałej szerokości kolumn (stałej ilości znaków w każdym wierszu) oraz o stałej wysokości znaków (tym samym stopniu pisma). Tego typu sposób tworzenia grafiki, a raczej jej symbolizowania, nosi nazwę semigrafiki. Pierwotnie rysunki ASCII-Art tworzono w programach pracujących w trybie tekstowym, z czasem zaczęto tworzyć je również w programach pracujących w http://koolinus.wordpress.com/2008/12/25/merry-christmas-2008-edition/ trybie graficznym, wykorzystując fonty o stałym kroju pisma. ASCII-Art były początkowo tworzone z myślą o wydrukowaniu ich na drukarkach znakowych a nie graficznych. Obecnie stosowane są również np. w sygnaturkach programów pocztowych. Jednym z przykładów prostych ASCII-Art mogą być emotikony. Źródło: http://pl.wikipedia.org/wiki/ASCII-Art Jako przykład tego typu “sztuki”, posłużyć może poniższy napis „Podstawy Informatyki”. ______ _ _ _____ __ _ _ _ | ___ \ | | | | |_ _| / _| | | | | (_) | |_/ /__ __| |___| |_ __ ___ ___ _ | | _ __ | |_ ___ _ __ _ __ ___ __ _| |_ _ _| | ___ | __/ _ \ / _` / __| __/ _` \ \ /\ / / | | | | || '_ \| _/ _ \| '__| '_ ` _ \ / _` | __| | | | |/ / | | | | (_) | (_| \__ \ || (_| |\ V V /| |_| | _| || | | | || (_) | | | | | | | | (_| | |_| |_| | <| | \_| \___/ \__,_|___/\__\__,_| \_/\_/ \__, | \___/_| |_|_| \___/|_| |_| |_| |_|\__,_|\__|\__, |_|\_\_| __/ | __/ | |___/ |___/ Do jego utworzenia wykorzystano znaki \ / | - ( ) V ‘ ` < >, dostępne z klawiatury. Rysunki ASCII Art można wyświetlać również w konsoli systemowej, za pomocą funkcji printf. Jednak natura tej funkcji nakłada pewne ograniczenia. Możliwy jest jeden kolor oraz brak zarządzania współrzędnymi (np. autor chce narysować losowe gwiazdki w różnych miejscach ekranu). W tym celu można wykorzystać funkcje systemowe (dla Windows a), aby wyświetlać dowolny napis pod dowolnie wybranymi współrzędnymi oraz w kolorze. Wyświetlanie tekstu na współrzędnych i w kolorze Konsola tekstowa systemu Windows pozwala na wyświetlanie tekstów za pomocą funkcji putc/puts/printf itd... Tekst ten wyświetlany jest w domyślnym kolorze (szary na czarnym tle) oraz na współrzędnych określanych przez aktualną pozycję kursora. Wykorzystując funkcje z Windows API (ang. Application Programming Interface) możliwe jest dowolne ustawianie kursora w oknie konsoli oraz zmiana koloru wyświetlanych znaków oraz ich tła. Poniżej przedstawiono przykład funkcji która, korzystając z API konsoli systemu Windows, wyświetla tekst w dowolnym punkcie tej konsoli. Przykład: #include <windows.h> void gotoxy(int x, int y) { HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); COORD position = {x, y}; SetConsoleCursorPosition(hStdout, position); } int main(void) { gotoxy(35, 2); // kolumna 35, wiersz 2 printf("Witaj!"); return 0; } Współrzędne znaków na ekranie: Wiersz (y) Kolumna (x) x=0;y=0 x=1;y=0 x=2;y=0 x=3;y=0 ... x=0;y=1 x=1;y=1 x=2;y=1 ... ... x=0;y=2 x=1;y=2 x=2;y=2 ... ... ... ... ... ... ... A kolor? #include <windows.h> #define #define #define #define #define #define #define #define #define CZARNY NIEBIESKI ZIELONY CZERWONY JASNOSC MORSKI PURPUROWY BRAZOWY SZARY 0 1 2 4 8 (NIEBIESKI + ZIELONY) (CZERWONY + NIEBIESKI) (CZERWONY + ZIELONY) (CZERWONY + NIEBIESKI + ZIELONY) #define #define #define #define #define #define JASNY_NIEBIESKI JASNY_ZIELONY JASNY_CZERWONY TURKUSOWY ROZOWY ZOLTY (JASNOSC (JASNOSC (JASNOSC (JASNOSC (JASNOSC (JASNOSC + + + + + + NIEBIESKI) ZIELONY) CZERWONY) AQUA) PURPUROWY) ZOLTY0 #define BIALY (JASNOSC + SZARY) void print(int x, int y, int kolor_znaku, int kolor_tla, const char* tekst) { HANDLE uchwyt_konsoli = GetStdHandle(STD_OUTPUT_HANDLE); // ustawienie kursora COORD position = {x, y} ; SetConsoleCursorPosition(uchwyt_konsoli, position); // zapamietanie aktualnego koloru WORD stary_kolor; CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo(uchwyt_konsoli, &info); stary_kolor = info.wAttributes; // ustawienie nowego koloru, wyswietlenie tkstu i przywrócenie koloru SetConsoleTextAttribute(uchwyt_konsoli, kolor_znaku + 16*kolor_tla); puts(tekst); SetConsoleTextAttribute(uchwyt_konsoli, stary_kolor); } Oraz przykład wykorzystania funkcji print Wyświetla on tekst pod zadanymi współrzędnymi x,y oraz w kolorze, wybranym przez programistę. int main(void) { print(25, 5, JASNY_NIEBIESKI, CZARNY, "niebieski"); print(18, 5, JASNY_ZIELONY, CZARNY, "zielony"); print(10, 5, JASNY_CZERWONY, CZARNY, "czerwony"); return 0; } wynik: Czyszczenie ekranu zadanym kolorem void clrscr(int kolor_tla) { HANDLE uchwyt_konsoli = GetStdHandle(STD_OUTPUT_HANDLE); COORD coord = {0, 0}; DWORD count; // pobranie informacji o oknie konsoli CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo(uchwyt_konsoli, &info); // wypelnienie okna pustymi znakami (spacjami) FillConsoleOutputCharacter(uchwyt_konsoli, ' ', info.dwSize.X * info.dwSize.Y, coord, &count); // ustawienie jednego koloru/tla dla kazdego znaku konsoli FillConsoleOutputAttribute(uchwyt_konsoli, 16*kolor_tla, info.dwSize.X * info.dwSize.Y, coord, &count); // ustawienie kursora w punkcie 0,0 SetConsoleCursorPosition(uchwyt_konsoli, coord); } Przykład użycia Poniższy przykład czyści ekran losowo wybranymi kolorami z częstotliwością 10Hz int main(void) { for(int i = 0; i < 10; i++) { clrscr(rand()); Sleep(100); } return 0; } Animacja - opóźnienia czasowe Ideą animacji jest wyświetlanie sekwencji obrazów z szybkością dobraną tak, aby widz miał wrażenie płynności ruchu. Sprowadza się to do wyświetlania obrazów statycznych z zadaną częstotliwością, np. 30fps (ang. frames per second). Zakładając, że programista chce wyświetlać 5 obrazów na sekundę (5fps), czas przerwy pomiędzy kolejnymi obrazami to 1/5 sekundy lub 1/5x103 milisekundy. Wykorzystanie funkcji Sleep pozwala na uzyskanie przerwy czasowej, o długości zależnej od parametru tej funkcji. Prototyp: void Sleep(unsigned int milliseconds); Parametr milliseconds to długość przerwy czasowej w milisekundach. Jedna sekunda to 1000ms; 1 minuta to 60,000ms. Sleep – przykład Poniższy przykład wyświetla liczby z zakresu 0 – 99, przy czym przerwy czasowe pomiędzy wyświetleniem kolejnych to 500ms (0,5 sek). int main(void) { int licznik; for (licznik = 0; licznik < 100; licznik++) { printf("%d \n", licznik); Sleep(500); } return 0; } I w końcu... Zadanie świąteczne Wyświetl na ekranie konsoli kolorową choinkę z animacjami świeczek, gwiazdek, itd.. Warunek zaliczenia: choinka ma być ładna ;-) Jeśli rysowanie choinki wydaje się zbyt trudne (zdolności plastyczna na poziomie gry Wisielec), to animowany napis Wesołych Świat też będzie mile widziany. Do napisów polecam narzędzie konsolowe FIGLET lub jego implementację w postaci serwera WWW: http://asciiset.com/figletserver.html Powodzenia oraz Wesołych Świąt!!