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:

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:

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:

SetRGBPalette (60, 63, 0, 0);

Lub operując czymś bardziej znanym:

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:

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).

FAQ

1 komentarz

fajna rzecz...