Tarvitsin BitBlt-funktiota, ja yritin soveltaa Antin laittamaa vinkkiä, huomasin kuitenkin pian että koko ruutua ei kannata kopioida, vaan kopioidaan vain se alue, jonka Sprite peittää. (Mahdollistaa usean spriten käytön)
F1-Form
'Sprite-grafiikan käyttöä BitBlt-Api-funktion ja 'kaksoispuskoroinnin avulla VB:llä Ohjelmointiputkaa '(www.ohjelmointiputka.net) varten ' 'Copyright Antti Laaksonen 2002 'Muutokset Jorma Jaakkola 2004 'JoreSoft@pp.inet.fi ' 'Poista alkuperäisestä kontrollita pPuskuri, ja luo uusi saman niminen kopioimalla Strite. Private Sub Form_GotFocus() Timer1.Enabled = True End Sub Private Sub Form_LostFocus() Timer1.Enabled = False End Sub Private Sub Timer1_Timer() pii = 4 * Atn(1) i = i + 0.01 If i >= 2 * pii Then i = 0 'uudet koordinaatit x = Sin(i) * 150 + pKuva.Width / 2 - 25 y = Cos(i) * 150 + pKuva.Height / 2 - 25 Piirto End Sub Private Sub Form_Unload(Cancel As Integer) 'ohjelma sulkeutuu varmasti End End Sub
F2-Form
Siirrä tänne pMask, pSprite, ja pPuskuri. Laita kaikken AutoReDraw-arvoksi true.
Uusi moduuli
Global i As Single, pii As Single Global x As Single, y As Single Global vx As Single, vy As Single Global z As Long, a As Single 'BitBlt-funktion määrittely Public 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 dwRop As Long) As Long Sub Piirto() If vx > 0 Then 'siirretään puskurin kuva näkyville z = BitBlt(F1!pKuva.hDC, vx, vy, 32, 32, F2!pPuskuri.hDC, 0, 0, vbSrcCopy) End If 'palautetaan vanha kuva z = BitBlt(F2!pPuskuri.hDC, 0, 0, 32, 32, F1!pKuva.hDC, x, y, vbSrcCopy) 'piirretään sprite z = BitBlt(F1!pKuva.hDC, x, y, 32, 32, F2!pMaski.hDC, 0, 0, vbSrcAnd) z = BitBlt(F1!pKuva.hDC, x, y, 32, 32, F2!pSprite.hDC, 0, 0, vbSrcInvert) vx = x: vy = y End Sub 'vbDstInvert Inverts the destination bitmap 'vbMergeCopy Combines the pattern and the source bitmap 'vbMergePaint Combines the inverted source bitmap with the destination bitmap by using Or 'vbNotSrcCopy Copies the inverted source bitmap to the destination 'vbNotSrcErase Inverts the result of combining the destination and source bitmaps by using Or 'vbPatCopy Copies the pattern to the destination bitmap 'vbPatInvert Combines the destination bitmap with the pattern by using Xor 'vbPatPaint Combines the inverted source bitmap with the pattern by using Or. ' Combines the result of this operation with the destination bitmap by using Or 'vbSrcAnd Combines pixels of the destination and source bitmaps by using And 'vbSrcCopy Copies the source bitmap to the destination bitmap 'vbSrcErase Inverts the destination bitmap and combines the result with the source bitmap by using And 'vbSrcInvert Combines pixels of the destination and source bitmaps by using Xor 'vbSrcPaint Combines pixels of the destination and source bitmaps by using Or
Lataa pKuva.Picture kuvaksi haluamasi kuva.
Rivi kommentti 'palautetaan vanha kuva' pitäisi olla 'kopioidaan uusi kuva puskuriin'
Alkuperäinen koodi, löytyy täältä.
minun systeemi taustakuvalle:
For i = 0 To pKuva.Width pPuskuri.Line (i, 0)-(i, pKuva.Height), RGB(255, 0 + i, 0) Next
EDIT:kannattaa kokeilla
Aihe on jo aika vanha, joten et voi enää vastata siihen.