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