art6









Sprajty w Visual Basicu cz.1






Sprajty w Visual Basicu
Część 1: najprostsza animacja sprajtowa

Animacja sprajtowa jest to chyba jedynym w VB sposobem wyświetlania i przemieszczania
obiektu graficznego o kształcie innym niż prostokąt po wielokolorowym tle. Poniższy
tekst oraz dołączony do niego program przykładowy zawierają wszystko co potrzebujesz
wiedzieć do tworzenia własnych, prostych animacji sprajtowych.

FUNKCJA BitBlt

Operowanie tzw. sprajtami (duszkami) w Visual Basicu opiera się na funkcji API:
BitBlt, której zadaniem jest kopiowanie bitmapy z jednego obiektu rysunkowego do
drugiego. Jej deklaracja wygląda następująco:


Private Declare Function BitBlt Lib "gdi32" _
(ByVal hDestDC As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hSrcDC As Long, _
ByVal xSrc As Long, _
ByVal ySrc As Long, _
ByVal swRop As Long) As Long


Funkcja do działania potrzebuje informacji o tzw. uchwycie (hDestDC) celu, jego
położeniu (x,y) i rozmiarze (nWidth, nHeight) oraz uchwycie (hSrcDC) i położeniu
(xSrc, ySrc) źródła. Ostatni parametr (swRop) określa tryb operacji jaka ma zostać
wykonana (o tym później).

CO JEST POTRZEBNE DO ANIMACJI SPRAJTOWEJ?

1. Plama
Plama składa się z dwóch obrazów:


obrazu sprajta taki, jakim będzie widziany przez użytkowników programu
maski czyli czarnobiałego cienia sprajta w którym czarne piksele reprezentują tą
jego część, która będzie wyświetlana zaś białe część przeźroczystą, która
wyświetlana nie będzie.



2. Obraz Pamięci
Obiekt graficzny, który będzie pamiętał tło z przed pojawienia się sprajta.

3. Obraz Roboczy
Obiekt graficzny na którym będą wykonywane czynności związane z wyświetlaniem
sprajta zanim trafi on na obraz właściwy. Ma to na celu uniknięcie efektu migotania
obrazu sprajta na Obrazie Głównym.

Żaden z powyższych obiektów nie jest widziany przez użytkownika, który ogląda
efekt finalny rozgrywający się na Obrazie Głównym. Ale w przykładzie wszystko
widać... ze względów dydaktycznych :-)

4. Obraz Główny
Tu rozgrywa się główna akcja. Ten obraz, oraz przemieszczający się po nim sprajt
będą widziane przez użytkownika programu. Tak więc ten właśnie obraz musi wyglądać
najlepiej.

PROCES WYŚWIETLANIA I ANIMACJI DUSZKA

W tym miejscu trzeba powiedzieć jeszcze parę zdań o tzw. trybach operacji rastrowych
dla funkcji BitBlt (ostatni parametr tej funkcji - swRop). Wartości te powinny być
podawane w formie liczb, jednak dla przejrzystości kodu lepiej jest zadeklarować je jako
stałe i dalej posługiwać się nazwami tych stałych, które nie wątpliwie dużo
więcej mówią o rodzaju wykonywanej operacji niż ciąg liczb.


Const SRCCOPY = &HCC0020 'Kopiuje obraz takim jaki jest
Const SRCAND = &H8800C6 'Kopiuje obraz za wyjątkiem
'białych punktów
Const SRCPAINT = &HEE0086 'Kopiuje obraz za wyjątkiem
'czarnych punktów


A teraz już możemy przejść do samej animacji. Cały proces odbywa się w siedmiu
następujących kolejno po sobie krokach:

1) Zapamiętanie pierwotnego wyglądu tła

Kopiuj część Obrazu Głównego na której ma pojawić się sprajt do obrazu pamięci
aby móc go później odtworzyć.


Response = BitBlt(picPamiec.hDC, 0, 0, picPamiec.Width, _
picPamiec.Height, picTablica.hDC, xSprite, ySprite, SRCCOPY)

picPamiec.Refresh ' Odswież Obraz Pamieci



2) Kopiuj część obrazu głównego na której ma pojawić się sprajt z
Obszaru Pamięci do Obszaru Roboczego


Response = BitBlt(picObszarRoboczy.hDC, 0, 0, _
picObszarRoboczy.Width, picObszarRoboczy.Height, _
picPamiec.hDC, 0, 0, SRCCOPY)

picObszarRoboczy.Refresh ' Odśwież obraz roboczy



3) Połóż maskę sprajta w Obszarze Roboczym


Response = BitBlt(picObszarRoboczy.hDC, 0, 0, _
picObszarRoboczy.Width, picObszarRoboczy.Height, _
picMaska.hDC, 0, 0, SRCAND)

picObszarRoboczy.Refresh ' Odśwież Obraz Roboczy



4) Połóż sprajta na masce w Obszarze Roboczym


Response = BitBlt(picObszarRoboczy.hDC, 0, 0, _
picObszarRoboczy.Width, picObszarRoboczy.Height, _
picTramwaj.hDC, 0, 0, SRCPAINT)

picObszarRoboczy.Refresh ' Odśwież Obraz Roboczy



5) Skopiuj obraz z Obszaru Roboczego do Obrazu Głównego


Response = BitBlt(picTablica.hDC, xSprite, ySprite, _
picPamiec.Width, picPamiec.Height, picObszarRoboczy.hDC, _
0, 0, SRCCOPY)

picTablica.Refresh ' Odswież Obraz Główny



6) Skopiuj zapamiętany w Obszarze Pamięci, Obraz Głowny z przed pojawienia
się sprajta, do Obszaru Roboczego


Response = BitBlt(picObszarRoboczy.hDC, 0, 0, _
picObszarRoboczy.Width, picObszarRoboczy.Height, _
picPamiec.hDC, 0, 0, SRCCOPY)

picObszarRoboczy.Refresh ' Odśwież Obraz Roboczy



7) Skopiuj Obraz Roboczy na Obraz Główny


Response = BitBlt(picTablica.hDC, xSprite, ySprite, _
picObszarRoboczy.Width, picObszarRoboczy.Height, _
picObszarRoboczy.hDC, 0, 0, SRCCOPY)



W tym miejscu następuje koniec cyklu animacji. Sprajt został wyświetlony a
następnie usunięty zaś tło na którym się znajdował odtworzone. Rzecz jasna do
procesu animacji powyższa procedura musi zostać w jakiś sposób zapętlona. Najlepszym
pomysłem wydaje się być kontrolka zegara, która co pewien określony czas (u mnie w
przykładzie co 10 milisekund) wyzwalać będzie zdarzenie, które uruchomi od nowa całą
procedurę (zwiększywszy uprzednio o 2 współrzędną xSprite - aby sprajt został
wyświetlony nieco bardziej na prawo od swojej poprzedniej pozycji).

O CZYM JESZCZE TRZEBA PAMIĘTAĆ?

Wszystkie obiekty obrazu (PictureBox) muszą mieć wartość "AutoRedraw"
ustawioną na "True", inaczej z animacji wyjdą nici.

UWAGI KOŃCOWE


Polecenia odświeżenia Obrazu Roboczego w kroku 2 i 3 zostały użyte w celach
dydaktycznych (patrz dalej) w normalnym programie wystarczy jedno odświeżenie Obrazu
Roboczego w kroku 4 - może to dodatnie wpłynąć na płynność animacji.
Program przykładowy jest tak zbudowany, że możesz obserwować proces animacji duszka
dosłownie krok po kroku. Spróbuj "wyREMować" sześć ostatnich kroków i
później odsłaniać je po kolei, oglądając co dokładnie robi funkcja BitBlt w każdym
z kroków.
Sprajt użyty w przykładzie jest dość spory - chciałem mieć pewność, że nawet na
bardzo szybkich komputerach będzie dobrze widać efekt migotania sprajta w Obrazie
Roboczym i jego płynnego wyświetlania na Obrazie Głównym :-)


Następnym razem spróbuję zmierzyć się z wieloklatkowymi sprajtami, czyli
chodzącymi ludzikami, wybuchającymi statkami itd. A potem... złożone wykrywanie
kolizji!

izomag
e-mail: izomag@postkassa.no







Wyszukiwarka

Podobne podstrony:
ART6 (7)
art6
ART6 (13)
art6
art6
ART6 (14)
art6
art6
art6
ART6 (11)

więcej podobnych podstron