03. januar 2003 - 00:13
Der er
14 kommentarer og
1 løsning
BitBlt spørgsmål
Jeg er igang med at lave et spil á la de gamle arkadeflyspil. Til at tegne de forskellige figurere bruger jeg "TransparentBlt", og tegner i en picturebox hvor autoredraw er slået til.
Koden jeg bruger til at tegne figurene er som følger:
Private Function Blt(FigurNr As Graphic, Optional X As Integer = 0, _
Optional Y As Integer = 0, Optional Sov As Integer = 10) As Boolean
Dim CurrentFrame As Integer, TotalFrames As Integer, RetVal As Integer
Dim destWidth As Single, destHeight As Single, srcX As Single, srcWidth As Single
TotalFrames = Val(pic(FigurNr).Tag)
destHeight = pic(FigurNr).ScaleHeight
'Hvis der kun er én frame
If TotalFrames = 0 Then
destWidth = pic(FigurNr).ScaleWidth
picDest.Cls
RetVal = TransparentBlt(picDest.hdc, X, Y, destWidth, destHeight, pic(FigurNr).hdc, 0, 0, destWidth, pic(FigurNr).ScaleHeight, TransColor)
If RetVal = 1 Then Blt = True
picDest.Refresh
Else
Do Until CurrentFrame = TotalFrames
destWidth = pic(FigurNr).ScaleWidth / TotalFrames
'Gå én frame frem
CurrentFrame = CurrentFrame + 1
srcX = destWidth * CurrentFrame
srcWidth = destWidth
picDest.Cls
RetVal = TransparentBlt(picDest.hdc, X, Y, destWidth, destHeight, pic(FigurNr).hdc, srcX, 0, destWidth, pic(FigurNr).ScaleHeight, TransColor)
If RetVal = 1 Then Blt = True
picDest.Refresh
Sleep Sov
DoEvents
Loop
End If
End Function
Mit spørgsmål er hvordan jeg skal lave kode så billederne ikke flakker, f.eks. ved blot at optegne én figur ad gangen, og ikke, som ved min kode, optegne hele pictureboxen igen...
-Sion
03. januar 2003 - 01:12
#4
Autoredraw er ikke god når du skal opdater så mange gange, lav det med Autoredraw = false så flakker det nok ikke så meget :-)
03. januar 2003 - 12:36
#5
"Graphic" returnere nummeret på den picturebox hvor den bestemte figur er...
Enum Graphic
PIC_EXPLOSION1 = 0
PIC_EXPLOSION2 = 1
PIC_BI = 2
PIC_PLANE = 3
(...osv)
End Enum
---
Alle eksemplerne fra zip-filen bruger jo BitBlt og ikke TransperantBlt, så jeg er ikke sikker på at jeg kan bruge det...
04. januar 2003 - 14:28
#11
Wow, du kan nogle tricks med bitblt! Du har dog skrottet alt mit kode ;( , men kan det virkeligt ikke lade sig gøre at lave grafik der ikke flakker, med TransperantBlt? Kan det passe at man skal bruge BitBlt el. StrechBlt da TransperantBlt også er en Blt-funktion?
04. januar 2003 - 17:08
#13
Har lige prøvet med TransparentBlt, og det virker :-) men er ikke sikker på at TransparentBlt er hurtig nok når der kommer mange objecter på da det er 2 forskilige API Call.
TransparentBlt er msimg32.dll og BitBlt er gdi32.dll
04. januar 2003 - 17:14
#14
(Du har dog skrottet..) Du kan da bare lave det om. Det var kun en GameTest så du kunne se hvordan du kunne gøre :-)
PS
Hvis og når du bliver færtig med dit spil vil jeg da godt prøve det :))
Du kan bare sende det til: sjh.multimedia@get2net.dk
04. januar 2003 - 18:26
#15
Hey, du har ret - det virker sq også med transperantblt! Lækkert! Jeg skal nok sende spillet til dig... hvis det da engang bliver færdigt :)
Tak for hjælpen