Witam
Zajmiemy się dzisiaj pewną prostym zadaniem bez, którego praktycznie nie da się zrobić jakichkolwiek efektów graficznych. Ta wspaniała rzecz nazywa się paletą kolorów.
Przypomnijmy sobie ile jest kolorów jest w trybie 13h.
(Teraz wszyscy krzyknęli 256! ;))
Ale czy na pewno? Czy nie da się uzyskać więcej?
Da się!
TEORIA
Pamiętacie, że każdemu kolorowi przyporządkowany jest jakiś numer (np. czarnemu-0, białemu-15). Zapisane to wszystko jest właśnie w palecie kolorów.
Każdy kolor zapisany jest z trzech podstawowych kolorów: czerwonego, zielonego, niebieskiego. Po zmieszaniu ich wychodzą inne kolory (powinniście się tego uczyć w wczesnych klasach podstawówki na plastyce)
np. po zmieszaniu
nie będę już więcej tłumaczył tylko pokażę jak to się robi.
procedure SetPal(n, r, g, b :byte);
begin
port[$3c8] := n;
port[$3c9] := r;
port[$3c9] := g;
port[$3c9] := b;
end;
Port zapewnia dostęp do gniazd wejścia/wyjścia. A prościej to dzięki nim możemy komunikować się z sprzętem zainstalowanym w naszym komputerze.
Procedura ta działa bardzo prosto. Pod adres $3c8 wgrywamy numer koloru, a pod $3c9 kolejno czerwony (Red), zielony (Green) i niebieski (Blue) kolor.
np.
port[$3c8] := 10;
port[$3c9] := 15;
port[$3c9] := 58;
port[$3c9] := 40;
Uzyskamy pod numerem 10 kolor jakiś tam. Czyli jeśli teraz zrobimy takie coś putpixel(100,100,10); To w pkt. 100x100 namaluje się pixel o zdefiniowanym wcześniej kolorze.
Możemy też napisać procedurę pobierającą składowe:
procedure GetPal(r, g, b,n:byte);
begin
port[$3c7] := n; {zwróćcie uwagę, że tu jest $3c7}
r := port[$3c9];
g := port[$3c9];
b := port[$3c9];
end;
JAK TO SIĘ JE
Dzięki możliwości ustawiania palety kolorów możemy umieszczać obok siebie ten sam kolor o różnych odcieniach (odcieni jednego koloru może być 64). np. Kolor czerwony od najciemniejszego do najjaśniejszego.
W przykładzie został użyty moduł graph13h z pierwszej cz. 'programisty'.
uses crt,graph13h;
var x,y:integer;
c,r,g,b:byte;
procedure SetPal(n, r, g, b :byte);
begin
port[$3c8] := n;
port[$3c9] := r;
port[$3c9] := g;
port[$3c9] := b;
end;
begin
init13h; {otwiera tryb13h}
for c:=0 to 63 do
setpal(c,c,0,0); {chcemy ustawić odcienie koloru czerwonego więc nie potrzebne są nam zielony i niebieski dlatego stawiamy przy nich 0}
for c:=0 to 63 do {Te dwie linijki rysują pionowe linie o kolorze} piline(0,199,c,c); {zdefiniowanym w palecie}
readln;
end13h; {zamyka tryb 13h}
end.
W procedurze piline zmienne podajemy w taki sposób:
y1, y2, x, c (kolor).
Po wykonaniu programu uzyskujemy taki obrazek:

Oczywiście możemy 'c' wstawić zamiast w red, w blue i green. Albo we wszystkie dzięki czemu otrzymamy odcienie szarości:
for c:=0 to 63 do
setpal(c,c,c,c);
Możemy robić też przejścia między kilkoma kolorami:
procedure ustaw;
var c:integer;
begin
for c:=1 to 80 do
begin
setcol(c,trunc(c*60/80),0,0);
setcol(c+80,63,trunc(c*60/80),0);
setcol(c+80+80,63,63,trunc(c*60/80));
end;
end;
Po zastosowaniu tej procedury uzyskamy taki wspaniały widok ;)

ZASTOSOWANIE
Praktycznie w każdym efekcie graficznym i grach. Dzięki palecie kolorów w przyszłym miesiącu zrobimy efekt rozmycia i wyostrzenia, a później
ognia.
Heniu