Rozdział 16


Kolory

 

Podsumowanie

 

Uruchom program:

 

  10 FOR m=0 TO 1: BRIGHT m
  20 FOR n=1 TO 10
  30 FOR c=0 TO 7
  40 PAPER c: PRINT "        ";: REM 4 kolorowe spacje
  50 NEXT c: NEXT n: NEXT m
  60 FOR m=0 TO 1: BRIGHT m: PAPER 7
  70 FOR c=0 TO 3
  80 INK c: PRINT c;"      ";: REM 3 spacje
  90 NEXT c: PAPER 0
100 FOR c=4 TO 7
110 INK c: PRINT c;"      ";: REM 3 spacje
120 NEXT c: NEXT m
130 PAPER 7: INK 0: BRIGHT 0

 

 

Pokazuje on osiem kolorów (łącznie z białym i czarnym) oraz dwa poziomy jasności, które może wytworzyć ZX Spectrum na kolorowym ekranie telewizyjnym. (Jeśli twój telewizor jest czarno-biały, to zobaczysz jedynie różne odcienie szarości.) Oto ich lista; są one również wypisane ponad odpowiednimi klawiszami  cyfrowymi.

 

0 - czarny
1 - niebieski
2 - czerwony
3 - buraczkowy
4 - zielony
5 - jasnoniebieski
6 - żółty
7 - biały

 

Na telewizorze czarnobiałym numery te są uporządkowane w kolejności rosnącej jasności.

Aby używać tych kolorów poprawnie, musisz nieco zrozumieć, jak zbudowany jest obraz.

 

 

Obraz składa się z 768 pozycji (24 wiersze po 32 znaki), na których mogą być drukowane znaki, a każdy znak jest drukowany w kwadracie 8 x 8 punktów, jak te powyżej dla a. Powinno ci to przypomnieć grafikę definiowaną przez użytkownika z Rozdziału 14, gdzie mieliśmy 0 dla białych punktów i 1 dla czarnych punktów.

Pozycja znaku na ekranie posiada również skojarzone ze sobą dwa kolory: kolor tuszu będący kolorem czarnych punktów w naszym kwadracie i kolor papieru lub kolor tła, który jest używany dla białych punktów. Na początku każda pozycja posiada czarny tusz i białe tło, zatem wydruk pojawia się jako czarne litery na białym tle.

Pozycja znaku posiada również jasność (normalną lub podwyższoną) oraz coś, co jej mówi, czy ma migać, czy nie — mruganie jest wykonywane przez zamienianie koloru tuszu z kolorem papieru. To wszystko można przedstawić liczbami, zatem pozycja znaku posiada:

(i) kwadrat z 8 x 8 zer lub jedynek w celu zdefiniowania kształtu znaku, 0 to kolor tła, 1 to kolor tuszu,

(ii) kolory tuszu i papieru, każdy przedstawiony liczbą od 0 do 7,

(iii) jasność — 0: normalna, 1: podwyższona oraz

(iv) mruganie — 0: wyłączone, 1: włączone.

 

Zauważ, że skoro kolory tuszu i papieru pokrywają całą pozycję znaku, nie możesz mieć więcej niż dwa kolory w danym bloku 64 punktów. To samo dotyczy jasności i mrugania: odnoszą się one do całej pozycji znakowej, a nie do poszczególnych punktów. Kolory, jasność i mruganie na danej pozycji noszą nazwę atrybutów.

Gdy drukujesz coś na ekranie, zmieniasz układ punktów na tej pozycji; jest mniej oczywiste, niemniej również prawdziwe, że zmieniasz także atrybuty na tej pozycji. Na początku nie zauważasz tego, ponieważ wszystko jest drukowane czarnym tuszem na białym papierze (z normalną jasnością i bez mrugania), lecz możesz to zmienić za pomocą rozkazów INK, PAPER, BRIGHT i FLASH. Wypróbuj

 

PAPER 5

 

a następnie wypisz kilka rzeczy; wszystkie pojawią się na jasnoniebieskim tle, ponieważ w trakcie ich drukowania kolor papieru na używanych pozycjach jest ustawiany na jasnoniebieski (którego kodem jest 5).

Pozostałe działają w ten sam sposób, zatem po

 

      PAPER liczba pomiędzy 0 i 7

      INK liczba pomiędzy 0 i 7

      BRIGHT 0 lub 1

Traktuj 0 jak wyłączony,
a 1 jak włączony

lub

      FLASH 0 lub 1

 

dowolny wydruk na ekranie ustawi odpowiedni atrybut we wszystkich użytych pozycjach znakowych. Wypróbuj niektóre z nich. Powinieneś być teraz w stanie zrozumieć, jak działał program z początku rozdziału.

Istnieje więcej liczb, które możesz zastosować w tych poleceniach, a posiadają one mniej bezpośrednie efekty.

8 można użyć we wszystkich czterech poleceniach, a oznacza ono "przezroczysty" w tym sensie, że na użytej pozycji pozostanie stary atrybut. Przykładowo załóżmy, że wpisujesz

 

PAPER 8

 

Żadna z pozycji znakowych nigdy nie będzie miała ustawionego koloru papieru na 8, ponieważ takiego koloru nie ma; natomiast dzieje się to, że gdy na danej pozycji zostanie coś wypisane, to jej kolor papieru pozostanie taki sam, jak był poprzednio. INK 8, BRIGHT 8 i FLASH 8 działają w ten sam sposób na inne atrybuty.

9 można używać tylko z PAPER i INK, a oznacza ono "kontrast". Używany przez ciebie kolor (tuszu lub papieru) zostanie ustawiony na biały przy ciemnym drugim kolorze (czarny, niebieski, czerwony lub buraczkowy) lub na czarny, jeśli pozostały kolor jest jasny (zielony, jasnoniebieski, żółty lub biały).

Wypróbuj to wykonując

 

INK 9: FOR c=0 TO 7: PAPER c: PRINT c: NEXT c

 

Bardziej imponujący pokaz potęgi ekranu ZX Spectrum zobaczysz, gdy uruchomisz program z początku rozdziału, aby otrzymać kolorowe pasy, a następnie wykonując

 

INK 9: PAPER 8: PRINT AT 0,0;: FOR n=1 TO 1000: PRINT n;: NEXT n

 

Kolor tuszu jest tutaj zawsze kontrastowany ze starym kolorem papieru na każdej pozycji.

Kolorowa telewizja opiera się na raczej dziwnym fakcie, iż oko ludzkie potrafi jedynie widzieć w rzeczywistości trzy kolory — kolory podstawowe niebieski, czerwony i zielony. Pozostałe kolory są ich mieszaniną. Na przykład purpurowy uzyskuje się przez zmieszanie niebieskiego z czerwonym — to dlatego jego kod wynosi 3, czyli jest sumą kodów niebieskiego i czerwonego.

Aby zrozumieć, jak te wszystkie kolory do siebie pasują, wyobraź sobie trzy kwadratowe światła reflektorów o kolorach niebieskim, czerwonym i zielonym, świecące w ciemności na biały ekran, tak że nie całkiem się pokrywają. Gdy zachodzą na siebie, zobaczysz mieszankę kolorów, jak pokazuje ten program (czarne spacje uzyskasz w trybie G za pomocą klawiszy SHIFT i 8):

 

    10 BORDER 0: PAPER 0: INK 7: CLS
    20 FOR a=1 TO 6
    30 PRINT TAB 6; INK 1;"                                    ": REM 18 czarnych spacji
    40 NEXT a
    50 LET dane=200
    60 GO SUB 1000
    70 LET dane=210
    80 GO SUB 1000
    90 STOP
  200 DATA 2,3,7,5,4
  210 DATA 2,2,6,4,4
1000 FOR a=1 TO 6
1010 RESTORE dane
1020 FOR b=1 TO 5
1030 READ c: PRINT INK c;"            ";: REM 6 czarnych spacji
1040 NEXT b: PRINT : NEXT a
1050 RETURN

 

 

Istnieje funkcja ATTR, która podaje, jakie atrybuty znajdują się na danej pozycji ekranu. Jest to funkcja dosyć skomplikowana, dlatego przeniesiono ją na koniec tego rozdziału.

Istnieją dwa dalsze polecenie, INVERSE i OVER, które sterują nie atrybutami, lecz punktami pozycji znakowej, które są drukowane na ekranie. Używają one liczb 0 dla wyłączenia oraz 1 dla włączenia w taki sam sposób jak FLASH i BRIGHT, lecz tutaj nie ma już więcej możliwości. Jeśli wpiszesz INVERSE 1, to punkty pozycji znakowej będą drukowane w negatywie: punkty papieru zostaną zastąpione punktami tuszu i na odwrót. Tak więc a zostanie wydrukowane jako

 

 

Jeśli mamy czarny tusz i biały papier, to a pojawi się jako białe na czarnym tle — lecz wciąż będziemy mieli czarny tusz i biały papier na tej pozycji znakowej. Zmienią się punkty, a nie atrybuty.

 

Polecenie

 

OVER 1

 

włącza do działania szczególny rodzaj nadpisywania. Zwykle, gdy coś jest zapisywane na pozycji znakowej, to wymazuje kompletnie całą jej poprzednią zawartość, lecz teraz nowy znak po prostu zostanie dodany do starego (lecz zobacz na Ćwiczenie 1). Może być to szczególnie użyteczne przy wypisywaniu znaków złożonych, jak literki z akcentami, co wykonuje poniższy program, wypisując niemieckie znaki — literę 'o' z dwoma kropeczkami u góry, tzw. o umlaut. (Najpierw wpisz NEW.)

 

10 OVER 1
20 FOR n=1 TO 32
30 PRINT "o"; CHR$ 8;"""";
40 NEXT n

 

(Zauważ znak sterujący CHR$ 8, który cofa wydruk na poprzednią pozycję.)

 

Istnieje inny sposób używania INK, PAPER, itd., który prawdopodobnie będzie dla ciebie bardziej użyteczny od poleceń. Możesz umieszczać je jako elementy w poleceniu PRINT (zakończone ;), a wtedy będą wykonywały dokładnie to samo, co robiłyby użyte jako samodzielne polecenia z tym wyjątkiem, że ich efekt jest jedynie tymczasowy: trwa tylko do końca polecenia PRINT, które je zawiera. Stąd, jeśli wpiszesz

 

PRINT PAPER 6;"x";: PRINT "y"

 

to tylko x będzie na żółtym tle.

 

INK oraz reszta przy używaniu jako polecenia nie wpływają na kolor dolnej części ekranu, gdzie wpisuje się rozkazy oraz dane dla INPUT. Dolna część ekranu wykorzystuje kolor brzegu na swój kolor papieru i kontrastowy kod 9 na swój kolor INK, ma wyłączone mruganie i wszystko jest w normalnej jasności. Kolor brzegu możesz zmienić na dowolny z ośmiu normalnych kolorów (nie 8 i 9), używając polecenia

 

BORDER kolor

 

Gdy wpisujesz dane dla INPUT, to są przestrzegane reguły kontrastowego tuszu na papierze w kolorze brzegu; lecz możesz zmienić kolor wypisywanego tekstu, używając elementów INK i PAPER (i innych) w poleceniu INPUT tak samo, jakbyś używał ich w poleceniu PRINT. Ich efekt trwa albo do końca polecenia, albo do momentu wpisywania jakiś danych wejściowych, zależnie co zdarzy się wcześniej. Wypróbuj

 

INPUT FLASH 1; INK 1;"Jaka jest twoja liczba?";n

 

Istnieje jeszcze jeden sposób zmiany kolorów poprzez użycie znaków sterujących — jak znaki sterujące dla AT i TAB opisane w Rozdziale 15.

 

CHR$ 16 odpowiada INK
CHR$ 17
odpowiada PAPER
CHR$ 18
odpowiada FLASH
CHR$ 19
odpowiada BRIGHT
CHR$ 20
odpowiada INVERSE
CHR$ 21
odpowiada OVER

 

Każdy z nich wymaga kolejnego znaku, który poprzez swój kod zdefiniuje kolor: zatem (przykładowo)

 

PRINT CHR$ 16+CHR$ 9;...

 

ma ten sam efekt co

 

PRINT INK 9;...

 

Zwykle nie będziesz sobie robił kłopotu z używaniem tych znaków sterujących, ponieważ równie dobrze możesz używać elementów koloru. Jednakże jedną z użytecznych możliwości jest umieszczanie ich w programach: powoduje to wyświetlanie różnych partii programu w różnych kolorach, aby oddzielać je od reszty lub po prostu, aby ładnie wyglądały. Musisz je wstawiać za numerem wiersza, inaczej zostaną stracone.

Aby umieścić te znaki w programie, musisz wprowadzić je z klawiatury, w większości w trybie rozszerzonym za pomocą klawiszy cyfrowych.

 

Cyfry 0 do 7 ustawiają odpowiedni kolor — tuszu z klawiszem CAPS SHIFT i tła bez niego. Bardziej precyzyjnie, jeśli jesteś w trybie E i naciśniesz cyfrę (powiedzmy 6 dla żółtego; w każdym razie musi to być pomiędzy 0 a 7 — nie 8 lub 9), to zostaną wstawione dwa znaki: pierwszy CHR$ 17 jako PAPER i CHR$ 6 oznaczający "ustaw na żółty". Jeśli miałeś wciśnięty CAPS SHIFT w momencie naciśnięcia klawisza z tą cyfrą, to otrzymasz CHR$ 16 oznaczające "ustaw kolor tuszu" zamiast CHR$ 17.

Ponieważ są to dwa znaki, to możesz zaobserwować dziwne efekty, gdy je wymazujesz — musisz dwa razy naciskać DELETE, a po pierwszym razie często dostaniesz znak zapytania lub nawet mogą pojawić się dziwne rzeczy. Nie martw się; po prostu naciśnij DELETE jeszcze raz.

i również mogą się dziwnie zachowywać, gdy kursor przesuwa się przez znaki sterujące.

Wciąż w trybie rozszerzonym:

8 daje CHR$ 19 i CHR$ 0 dla normalnej jasności

9 daje CHR$ 19 i CHR$ 1 dla podwyższonej jasności

CAPS SHIFT z 8 daje CHR$ 18 i CHR$ 0 dla braku migotania

CAPS SHIFT z 9 daje CHR$ 18 i CHR$ 1 dla migotania

 

Istnieje jeszcze kilka w zwykłym trybie L:

CAPS SHIFT z 3 daje CHR$ 20 i CHR$ 0 dla zwykłych znaków

CAPS SHIFT z 4 daje CHR$ 20 i CHR$ 1 dla znaków w negatywie

 

W celu podsumowania, oto pełny opis górnego rzędu klawiatury:

 

E

SYMBOL

DEF FN

FN

LINE

OPEN #

CLOSE #

MOVE

ERASE

POINT

CAT

FORMAT

CAPS

tusz
niebieski

tusz
czerwony

tusz
purpurowy

tusz
zielony

tusz
jasnoniebieski

tusz
żółty

tusz
biały

wyłącz
FLASH

włącz
FLASH

tusz
czarny

NIC

papier
niebieski

papier
czerwony

papier
purpurowy

papier
zielony

papier
jasnoniebieski

papier
żółty

papier
biały

normalna
jasność

podwyższona
jasność

papier
czarny

G

DOWOLNY

wyjście
z trybu G

DELETE

NIC

wyjście
z trybu G

DELETE

K,L,C

CAPS

EDYCJA

CAPS
LOCK

normalny

negatyw

tryb G

DELETE

SYMBOL

!

@

#

$

%

&

'

(

)

_

NIC

1

2

3

4

5

6

7

8

9

0

 

Funkcja ATTR posiada postać

 

ATTR (wiersz, kolumna)

 

Jej dwoma argumentami są numery wiersza i kolumny, których użyłbyś w elemencie AT, a jej wynikiem jest liczba, która pokazuje kolory oraz dalsze atrybuty tej pozycji znakowej na ekranie telewizyjnym. W wyrażeniach możesz jej używać równie swobodnie jak innych funkcji.

Zwracana liczba jest sumą czterech następujących liczb:

128 pozycja znakowa mruga, 0 nie mruga

64 pozycja znakowa jest rozjaśniona, 0 nie jest rozjaśniona

8 x kod koloru tła

kod koloru tuszu

 

Na przykład, jeśli pozycja znakowa mruga, nie jest rozjaśniona, ma żółte tło i niebieski tusz, to te cztery liczby, które musimy do siebie dodać, mają wartość 128, 0, 8 x 6 = 48 i 1, co daje razem 177. Przetestuj to poleceniem

 

PRINT AT 0,0; FLASH 1; PAPER 6; INK 1;"A"; ATTR (0,0)

 

Ćwiczenia

1. Wypróbuj

 

PRINT "B"; CHR$ 8; OVER 1;"/";

 

Gdzie / przecięło B, pozostawiło biały punkt. W ten sposób działa nadpisywanie na ZX Spectrum: dwa punkty tła lub tuszu dają punkt tła, dwa różne dają punkt tuszu. Posiada to ciekawą własność, jeśli jeszcze nadpiszesz tym samym dwa razy, to otrzymasz to, co miałeś na początku. Jeśli wpiszesz teraz

 

PRINT CHR$ 8; OVER 1;"/";

 

to dlaczego otrzymasz z powrotem nienaruszone B?

 

2. Wpisz

 

PAPER 0: INK 0

 

— czyż nie jest dobrze, że nie wpływa to na dolną część ekranu?

Teraz wpisz

 

BORDER 0

 

i zobacz, jak komputer się o ciebie troszczy!

 

3. Uruchom ten program:

 

10 POKE 22527+RND*704,RND*128
20 GO TO 10

 

 

Nieważne jak on działa; zmienia kolory kwadratów na ekranie telewizyjnym, a RND powinno zagwarantować, że będzie się to odbywało przypadkowo. Przekątne pasy, które ukazują się w tym wzorze są manifestacją ukrytego wzorca w RND — wzorca, który sprawia, że jest to funkcja pseudolosowa, a nie naprawdę losowa.

 

4. Wpisz lub załaduj poleceniem LOAD znaki figur szachowych z Rozdziału 14, a następnie wpisz ten program, który narysuje szachownicę z rozstawionymi na niej figurami.

 

    5 REM Rysuj pusta szachownice
  10 LET bb=1: LET bw=2: REM niebieski i czerwony dla szachownicy
  15 PAPER bw: INK bb: CLS
  20 PLOT 79,128: REM brzeg
  30 DRAW 65,0: DRAW 0,-65
  40 DRAW -65,0: DRAW 0,65
  50 PAPER bb
  60 REM szachownica
  70 FOR n=0 TO 3: FOR m= 0 TO 3
  80 PRINT AT 6+2*n,11+2*m;" "
  90 PRINT AT 7+2*n,10+2*m;" "
100 NEXT m: NEXT n
110 PAPER 8
120 LET pw=6: LET pb=5: REM kolory białych i czarnych figur
200 DIM b$(8,8): REM pozycje figur
205 REM ustaw poczatkowe pozycje
210 LET b$(1)="rnbqkbnr"
220 LET b$(2)="pppppppp"
230 LET b$(7)="PPPPPPPP"
240 LET b$(8)="RNBQKBNR"
300 REM wyswietl szachownice
310 FOR n=1 TO 8: FOR m=1 TO 8
320 LET bc=CODE b$(n,m); INK pw
325 IF bc=CODE " " THEN GO TO 350: REM spacja
330 IF bc>CODE "Z" THEN INK pb: LET bc=bc-32: REM małe litery dla czarnych
340 LET bc=bc+79: REM zamien na grafike
350 PRINT AT 5+n,9+m;CHR$ bc
360 NEXT m: NEXT n
400 PAPER 7: INK 0

 

 


   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2018 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe