Jak zdefiniować kolor w trybie graficznym

fatalbomb

Czasami może zajść potrzeba zmiany kolorów. Powiedzmy, że wkurza nas domyślny "szarawy" kolor jasnoczerwony (#12), i chcemy ustawić taki, do jakiego przyzwyczailiśmy się pod windozą. Służy do tego polecenie SetRGBPalette. Aby móc go używać, musimy mieć tryb VGA, najlepiej VGAHi (tak testowałem).
Jeżeli chcemy wymusić ładowanie VGAHi niezależnie od tego, co komputer wykrył, to piszemy kod tak:

Kopiuj
uses crt, graph;
var 
  Gd, Gm : Integer;
begin
 Gd := VGA; { Zamiast normalnie używanego Detect }
 Gm := VGAHi;
 InitGraph (Gd, Gm, '');
 { Tu dalszy ciąg programu... }
end.

Składnia polecenia jest taka:

Kopiuj
SetRGBPalette (ID_koloru, R, G, B);

Tu kilka słów wyjaśnienia. Pod ID_koloru nie wpisujemy numeru koloru takiego jak w SetColor, tylko wybieramy z tej listy:

(Numer koloru -> co wpisać)
0 -> 0
1 -> 1
2 -> 2
3 -> 3
4 -> 4
5 -> 5
6 -> 20
7 -> 7
8 -> 56
9 -> 57
10 -> 58
11 -> 59
12 -> 60
13 -> 61
14 -> 62
15 -> 63

Oczywiście 0 to czarny, 1 to niebieski, 9 to jasnoniebieski, 15 to biały rozjaśniony itd.

Co do składowych RGB, to są to liczby 6-bitowe z zakresu 0..63. Jeżeli wolimy posługiwać się wartościami znanymi z Windows, to po prostu robimy dzielenie przez 4.

Teraz, aby ustawić "windowsowy" czerwony, piszemy:

Kopiuj
SetRGBPalette (60, 63, 0, 0);

Lub operując czymś bardziej znanym:

Kopiuj
SetRGBPalette (60, 255 div 4, 0, 0);

Tak samo możemy zdefiniować wszystkie kolory. Pamiętajmy jednak, że kolor #0 jest zwyczajowo kolorem tła, i tu ciekawy efekt: jak ustawimy czarny jako biały poleceniem w stylu SetRGBPalette (0, 63, 63, 63), to będziemy mieć również białe obwódki dookoła ekranu.

Powyższy kod przydaje się nie tylko do definiowania palety. Załóżmy, że program ma coś narysować, co długo trwa, a nie jest wskazane żeby użytkownik widział poszczególne etapy, choćby ze względów estetycznych. Na przykład wyświetlanie bitmapy. W tym celu można napisać ten fragment tak:

  1. Wyczernienie wszystkiego (ustawienie wszystkich kolorów palety na 0, 0, 0).
  2. Procedury rysowania.
  3. Ponowne przedefiniowanie palety.

Ponadto, kod w stylu:

Kopiuj
for X := 0 to 63 do 
begin
  SetRGBPalette (60, X, 0, 0);
  Delay (100);
end;

Pozwala na efekt płynnej zmiany koloru (w tym przypadku płynne rozjaśnianie czerwonego od czerni do pełnej czerwieni). Przydaje się to między innymi do gier (chociaż do gier polecałbym raczej tryb 13h z 256 kolorami, ale to już inna bajka).

1 komentarz

fajna rzecz...