PROGRAMOWANIE
WEBMASTER:
 Artyku造
 Kursy
 Skrypty
PHP:
 Artyku造
 Kursy
 Skrypty
VISUAL C/C++:
 Artyku造
 Kursy
 Kody 廝鏚這we
C++ BUILDER:
 Artyku造
 Kursy
 Komponenty
 Kody 廝鏚這we
 FAQ
DELPHI:
 Artyku造
 Kursy
 Komponenty
 Kody 廝鏚這we
 FAQ
JAVA:
 Artyku造
 Kursy
 Aplety
ASP:
 Artyku造
 Kursy
 Skrypty
VISUAL BASIC:
 Artyku造
 Kursy
 Kody 廝鏚這we
PASCAL:
 Artyku造
 Kursy
 Kody 廝鏚這we
ASSEMBLER:
 Artyku造
 Kursy
 Kody 廝鏚這we
O NAS [...]
 Ekipa portalu
 Reklama
REKLAMA

Pascal » Artyku造
Efekt prze廝oczysto軼i
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)

Piotr Horzycki
NEWSLETTER
Chcesz by� zawsze na bie膨co?
Zapisz si�!
WP.PL
LITERATURA
INNE [?]
Katalog WWW
Sponsor
On-Line: 4
stat4u
Wszystkie prawa zastrze穎ne © 2001-2002 Programik.com