Kurs QBasic - część 6
Grafika - SCREEN, LINE, CIRCLE, PAINT, PSET
Ponieważ podstawowe polecenia mamy już za sobą, możemy się troszkę rozerwać i popracować nad grafiką. Poleceniem od którego musimy zacząć jest SCREEN x, który służy do ustawienia odpowiedniego trybu graficznego w którym program będzie pracował. Pod "x" można wpisać jedną z następujących wartości:
- 0 - tryb tekstowy (16 kolorów znaków)
- 1 - rozdzielczość 320*200, 16 kolorów tła, 4 kolory obiektów
- 2 - rozdzielczość 640*200, 2 kolory obiektów
- 7 - rozdzielczość 320*200, 16 kolorów obiektów
- 8 - rozdzielczość 640*200, 16 kolorów obiektów
- 9 - rozdzielczość 640*350, 16 kolorów obiektów
- 10 - rozdzielczość 640*350, 2 kolory obiektów
- 11 - rozdzielczość 640*480, 2 kolory obiektów
- 12 - rozdzielczość 640*480, 16 kolorów obiektów
- 13 - rozdzielczość 320*200, 256 kolorów obiektów
Z góry uprzedzam, że nie jestem pewny części z powyższych informacji, bowiem osobiście korzystam jedynie z kilku trybów. Standardowo kompilator ustawia tryb SCREEN 0, dzięki czemu możemy wyświetlać litery, cyfry i znaki w 16 możliwych kolorach (do zmiany koloru służy polecenie, o którym wspominałem na początku kursu - COLOR). Aby rozpocząć pracę w trybie graficznym, musisz umieścić polecenie SCREEN wraz z interesującym się trybem wyświetlania grafiki. Osobiście w poniższych przykładach będę się opierał na trybie 9. Skoro wybór trybu mamy już za sobą, czas przejść do kolejnego polecenia, którym jest LINE(x1,y1)-(x2,y2),kolor. Dzięki niemu na ekranie monitora pojawi się linia o początku w punkcie (x1,y1) i końcu (x2,y2), oraz kolorze "kolor". Zastosowanie dwóch poznanych wyżej poleceń przedstawię na krótkim przykładzie poniżej:
10 REM Prg6.1 - Zastosowanie polecen: SCREEN i LINE 20 CLS 30 SCREEN 9 40 LINE(100,100)-(540,250),14 50 SLEEP 5
Polecenie LINE można również wykorzystać do rysowania prostokątów, co przedstawia kolejny przykład:
10 REM Prg6.2 - Rysuje prostokąt 20 CLS 30 SCREEN 9 40 LINE(100,100)-(540,250),14, B 50 SLEEP 5
Jak widać, na koniec polecenia LINE wystarczyło dodać jedynie człon ,B. Powyższy prostokąt można w prosty sposób wypełnić kolorem:
10 REM Prg6.3 - Wypelniony prostokat 20 CLS 30 SCREEN 9 40 LINE(100,100)-(540,250),14, BF 50 SLEEP 5
Tym razem na koniec polecenia LINE dodałem człon ,BF. Ponieważ umiesz już rysować linie i prostokąty, możemy zająć się okręgami. Aby narysować okrąg należy posłużyć się poleceniem CIRCLE (x,y), promień, kolor, start, koniec. Polecenie rysuje okrąg o środku w punkcie "x i y", o promieniu "promień", kolorze "kolor" oraz na podstawie wartości start i koniec określa wycinki okręgu.
10 REM Prg6.4 - Okrag 20 CLS 30 SCREEN 9 40 CIRCLE (320, 150), 100, 10 50 SLEEP 5
Jak widać komputer narysował okrąg w punkcie (320,150) o promieniu 100 i kolorze 10. Często jednak to co powinno być okręgiem, tak naprawdę jest elipsą. Jest to spowodowane złym doborem rozdzielczości. Gdybym w przykładzie powyżej użyłbym SCREEN 12 okrąg byłby proporcjonalny zarówno w pionie, jak i w poziomie. W powyższym przykładzie nie skorzystaliśmy z rysowania wycinków okręgu. Spróbujmy to zrobić w poniższym przykładzie:
10 REM Prg6.5 - Wycinki okregu 20 CLS 30 SCREEN 9 40 CIRCLE (280, 180), 100, 10, -0.0001, -1.57 50 SLEEP 5
Jak widać, program narysował wycinek okręgu (a konkretniej pierwszą jego ćwiartkę). Wartości "start" i "koniec" mogą przyjmować wartości od 0 do 6.28. Wartości te wynikają ze wzoru na obwód okręgu: 2*pi=2*3.14=6.28. Dlaczego ja zastosowałem wartości ujemne ? Ponieważ wartości ujemne oznaczają, że dodatkowo chcemy narysować promienie wychodzące od środka okręgu do punktów "start" i "koniec". Jeżeli chodzi o zasadę rysowania wycinków, to polega ona na tym że program rozpoczyna wycinek w punkcie "start" (punkt 0 jest ułożony poziomo po prawej stronie okręgu), po czym porusza się przeciwnie do ruchu wskazówek zegara i kończy na punkcie "koniec". Nasuwa się pytanie, jak wypełnić okrąg i tym samym narysować koło. Sprawa jest troszkę trudniejsza, niż w przypadku prostokątu. Aby wypełnić okrąg musimy posłużyć się poleceniem PAINT (x,y), kolor_wypełnienia, kolor_krawędzi.
10 REM Prg6.6 - Wypelnianie obiektow 20 CLS 30 SCREEN 9 40 CIRCLE (320, 150), 100, 10 50 PAINT (320,150), 12, 10 60 SLEEP 5
Ponownie jak w przykładzie Prg6.4 zostaje narysowany okrąg o środku w punkcie (320,150), promieniu 100 i kolorze 10, po czym w linii 50 następuję wypełnienie obiektu w punkcie (320,150) o kolorze wypełnienia 12 i kolorze krawędzi 10. Wszystko w porządku, tylko co oznacza kolor krawędzi ? Otóż jest to numer koloru, który ogranicza obszar malowania. Jeżeli zamienisz wartość koloru_krawędzi (10) na dowolny inny kolor, cały ekran zostanie zamalowany. Polecenia PAINT można użyć do wypełniania dowolnych obiektów. Można go również użyć do pewnej sztuczki, co pokażę na poniższym przykładzie:
10 REM Prg6.7 - Nowe zastosowanie polecenia PAINT 20 CLS 30 SCREEN 9 40 PAINT (0,0), CHR$(85) 50 SLEEP 5
Współczynniki x i y nie są w tym przypadku istotne bowiem polecenie PAINT dotyczy całej możliwej powierzchni ekranu i właśnie dlatego wpisałem (0,0). Bardziej istotny jest fragment CHR$(85), który określa wzór wypełnienia. Numer w nawiasie informuje o wyglądzie wzoru wypełnienia i może przyjmować wartości od 0 do 255 (czyli tyle co 2 do potęgi 8). Aby wiedzieć jak wygląda wzór malowania, należy znać system dwójkowy. Liczba 85 (zapisana w systemie dziesiętnym) odpowiada liczbie 01010101 (zapisanej w systemie dwójkowym). Jedynka oznacza, że dana linia ma zostać wypełniona wybranym kolorem. Nasuwa się jednak pytanie - jakim kolorem, skoro żadnego nie wybierałem ? Na to pytanie odpowiem po zapoznaniu się z poniższym przykładem:
10 REM Prg6.8 - Nowe zastosowanie polecenia PAINT - zmiana koloru 20 CLS 30 SCREEN 9 40 PAINT (0,0), CHR$(0) + CHR$(85) 50 SLEEP 5
Jak widać, kolor zmienił się na zielony. Zostało to spowodowane dopisaniem fragmentu CHR$(0), który dodaje +1 do wartości koloru (tym samym wartość koloru = 2 co odpowiada kolorowi zielonemu ; jedynka odpowiadała kolorowi granatowemu). Wystarczy zatem dopisać CHR$(0) przed CHR$(x) w takiej ilości jaka jest nam potrzebna, aby otrzymać zamierzony kolor. Można również wykorzystać kilka kolorów i kilka wzorów wypełnienia, dzięki czemu uzyska się ciekawy efekt:
10 REM Prg6.9 - Nowe zastosowanie polecenia PAINT - zmiana koloru cz.2 20 CLS 30 SCREEN 9 40 PAINT (0, 0), CHR$(0) + CHR$(85) + CHR$(0) + CHR$(100) 50 SLEEP 5
W tym przypadku ciemny i jasny kolor zielony są malowane na przemian. Ostatnim poleceniem, o którym jedynie wspomnę będzie PSET (x,y),kolor, które zapala piksel w punkcie "x i y" o kolorze "kolor". Uważam że jest to proste polecenie i przykłady obrazujące jego użycie będą raczej zbędne.