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:
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
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