VB4all - 100 sampli, 50 tipsow, OCX, forum i wiele innych atrakcji

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