Avatar billede sion Nybegynder
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
Avatar billede sion Nybegynder
03. januar 2003 - 00:22 #1
en anden idé kunne være at gemme bitmappet i hukommelsen...?
Avatar billede sjh Nybegynder
03. januar 2003 - 00:49 #2
? hvad er "Graphic" Function Blt(FigurNr As Graphic, Opt.....
Avatar billede sjh Nybegynder
03. januar 2003 - 01:01 #3
Hent filen her:
http://home.get2net.dk/sjh/eksperten/200730/2dgames.zip

..og se på disse zip-filer:
-> animation.zip
-> multiback.zip
-> memorydc.zip
Avatar billede sjh Nybegynder
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 :-)
Avatar billede sion Nybegynder
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...
Avatar billede sion Nybegynder
03. januar 2003 - 13:01 #6
Hvis du vil se nærmere på problemmet, så kan du jo hente den forløbige kode på http://80.62.178.58/andes/upload/Bomber.rar ... Hvis det skal være, kan jeg da også godt fremtrylle lidt flere points for en mulig løsning på problemmet ;)
Prøv at tage et kik på det
Avatar billede sjh Nybegynder
03. januar 2003 - 20:55 #7
Jeg har lavet en der ikke flakker :-)
http://hjem.get2net.dk/sjh/eksperten/300358/GameTest.zip
Avatar billede sjh Nybegynder
04. januar 2003 - 00:03 #8
Nu kan du også skyde med kuler [CTRL] :)
http://hjem.get2net.dk/sjh/eksperten/300358/GameTest.zip
Avatar billede sjh Nybegynder
04. januar 2003 - 00:04 #9
Avatar billede sjh Nybegynder
04. januar 2003 - 03:12 #10
Avatar billede sion Nybegynder
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?
Avatar billede sion Nybegynder
04. januar 2003 - 15:14 #12
Det er sq et lækkert eksempel du har kreeret! Så kan det også være ligemeget med at skulle lave sprites & mask's og så'n nå'et. Jeg bygger videre på dit eksempel og siger mange tak!
Avatar billede sjh Nybegynder
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
Avatar billede sjh Nybegynder
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
Avatar billede sion Nybegynder
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
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester