Graj帷 w Jazz Jack Rabbit nie mo積a nie ulec
ciekawym efektom graficznym. Bo nie w ka盥ej grze z okresu <
1998 wida� takie rzeczy. Szczeg鏊nie zainspirowa豉 mnie transparencja...
Transparencja to po prostu przezroczysto嗆. Chodzi mi o wy鈍ietlanie
jakiego� obrazka na tle innego, z tym, 瞠 wy鈍ietlany obrazek b璠zie
nieco prze鈍itywa�.
Okazuje si�, 瞠 tak瞠 i my mo瞠my zrobi� taki efekt, co wi璚ej to
wcale nie jest trudne.
Paleta
Tutaj b璠� nam potrzebne wszystkie odcienie jakiego� koloru, np.
czerwonego. Naj豉twiej by這by zrobi� tak:
For i := 0 To 255 Do SetCol(i, i Div 4, 0, 0);
Ale taka paleta to marnotrawstwo! Pami皻ajmy bowiem, 瞠 karta VGA
pozwala na wy鈍ietlenie do 64 odcieni danego koloru, a nie 256.
Dlatego te� do stworzenia tego i wielu innych efekt闚 (np. bump
mapping) wystarczy taka paleta:
For i := 0 To 63 Do SetCol(i, i, 0, 0);
Tym sposobem mamy jeszcze 192 kolory do dyspozycji. Mo瞠my je po鈍i璚i�
na np. napisy, czy te� na t這, kt鏎e nie musi by� wype軟ione odcieniami
tylko jednego koloru.
Zmienne, sta貫, typy
Najwa積iejszy jest w tym efekcie bufor ramki. Co to oznacza? Wiele
gier wykorzystuje t� technik�. A wszystko po to, aby do minimum
ograniczy� bezpo鈔ednie zapisywanie do pami璚i karty. Dzi瘯i temu
unikniemy migotania obrazu, a sam program b璠zie znacznie szybszy.
Type
ScreenArray = ^ScreenType;
ScreenType = Array[0..63999] Of Byte;
Var
Screen : ScreenArray;
Potrzebne s� jeszcze dwie dodatkowe tablice. W pierwszej b璠zie
t這, w drugiej za� przezroczysty obrazek. Pierwsza tablica b璠zie
tego samego typu, co bufor ramki, tak wi璚 piszemy:
Var
Image1 : ScreenArray;
Druga tablica b璠zie wymaga豉 odr瑿nego typu. B璠zie on podobny
do bufora ramki, z tym, 瞠 b璠zie mia� rozmiar szeroko軼i nak豉danego
obrazka pomno穎nej przez jego wysoko嗆 i ca豉 ta liczba musi by�
zmniejszona o jeden. Przyk豉dowo obrazek b璠zie mia� rozmiar 128x128:
Type
Image2Array = ^Image2Type;
Image2Type = Array[0..16383] Of Byte; { 16383 = 128 x 128 - 1 }
Var
Image2 : Image2Array;
Potrzebne b璠� jeszcze liczniki:
Var
i, x, y : Word;
oraz par� tymczasowych zmiennych:
Var
TempCol : Byte;
LX, LY : Word;
Inicjalizacja
Najpierw tworzymy w pami璚i konwencjonalnej wszystkie tablice, pisz帷:
New(Screen);
New(Image1);
New(Image2);
S� one po這穎ne poza standardowym segmentem danych programu, tak
wi璚 bez tych trzech instrukcji komputer si� zawiesi.
Teraz trzeba wyzerowa� wszystkie tablice, aby unikn望 "zaszumionego"
ekranu:
FillChar(Screen^[0], 64000, 0);
FillChar(Image1^[0], 64000, 0);
FillChar(Image2^[0], SizeOf(Image2^), 0);
Nast瘼nie musimy zapisa� w Image1 t這, za� w Image2 nak豉dany obrazek.
Nie b璠� bawi� si� w prezentowanie sposob闚 na za豉dowanie pliku
BMP, PCX, czy GIF, ale wygeneruj� obrazki w programie.
For x := 0 To 319 Do
For y := 0 To 199 Do Image1^[320 * y + x] := x Xor y;
For i := 0 To 16383 Do Image2^[i] := Random(10) + 40;
Tak by這by najpro軼iej i chyba najlepiej.
Oczywi軼ie przed u篡ciem instrukcji Random trzeba j� zainicjalizowa�
poprzez instrukcj� Randomize i sprawdzi�, czy program u篡wa modu逝
CRT.
G堯wna p皻la
Teraz najlepsze! Musimy stworzy� p皻l� Repeat..Until, a w niej umie軼i�,
co nast瘼uje:
1. Wyczy軼i� bufor ramki
2. Umie軼i� w buforze ramki t這
3. Nanie嗆 przezroczysty obrazek:
a) wpisa� do zmiennej TempCol kolor piksela z t豉, na kt鏎y ma by�
naniesiony piksel z drugiego obrazka
b) obliczy� nowy kolor metod�:
- pomno篡� warto嗆 zawart� w TempCol przez kolor aktualnie nak豉danego
piksela
- podzieli� wynik przez 63
- je瞠li wykorzystuje si� tylko pierwsze 64 kolory, to podzieli� wynik
przez 4
- finalny punkt - do bufora ramki
4. Przenie嗆 zawarto嗆 bufora ramki na ekran
Uff. Nie wiem, czy zrozumiale t逝macz�, ale na pewno da si� co�
z tego wyci庵n望.
Efekt latarki
W tytule wspomnia貫m o latarce. No wi璚, spos鏏 tworzenia takiego
efektu jest bardzo podobny do przedstawionego wy瞠j algorytmu. Wystarczy
tylko:
1 .W tablicy Image2 umie軼i� obrazek przypominaj帷y ciemniej帷� po
brzegach kul�
2. Nie przenosi� t豉 do bufora ramki
To wystarczy, aby uzyska� zupe軟ie inny efekt!
Nak豉dany obrazek mo積a odczyta� z pliku, mo積a go tak瞠 wygenerowa�
w programie metod� cieniowania Phonga (Phong shading). Procedura
jest zawarta w kodzie 廝鏚這wym.
Kod 廝鏚這wy do artyku逝:
Transparencja (7,30 KB)