Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: BitBlt vs PaintPicture

Sivun loppuun

Lumi-ukkeli [04.02.2005 15:16:25]

#

Kumpaa kannattais käyttää, jos meinaa tehä 2D-pelin?

esakom [04.02.2005 15:25:04]

#

BitBlt:tä joudut luultavasti jokatapauksessa käyttämään, jos sun täytyy pyöritellä bittikarttoja muistissa, esim. läpinäkyvyyttä ym. muita "efektejä" varten. Nopeuskin on taattu. PaintPicturesta mulla ei oikeastaan ole kokemusta...

Lumi-ukkeli [04.02.2005 17:53:24]

#

Tossa Microsoftin oppaassa sanottiin, että jos
joutuu tekemään laajoja rasterointioperaatioita bittikartalle samalla kun piirtää sitä, niin kannattaa käyttää Paintpicturea BitBlt:n tilalta.

esakom [04.02.2005 18:06:52]

#

No voithan kokeilla asiaa käytännössä. Tee väliin funktio jota ohjelmastasi kutsut niin rajapinta ohjelmaasi pysyy samana, ja sitten tuossa funktiossa voi kokeilla kumpaakin
tyyliin:

Dim bPaint As Boolean

Public Sub Piirrä()
    'parametrit ensin kohdalleen ja sitten

    If bPaint = True Then
        Me.PaintPicture parametrit
    Else
        bitblt (parametrit2)
    End If
End Sub

tuo paintpicture käsittelee suoraan stdPicturea (jonka esim. taitaa saada suoraan pictureboxiin)

Voi olla tuo paintpicture helpompi käyttää, ainakin jos teet vain joitakin kopiointeja esim. pictureboxien välillä. BitBlt vaatii piirtopintojen käsittelyä, joten se on hieman haastavampi käyttää. Joten veikkaisin että voit käyttää tuota paintpicturea aluksi, sitten jos tulee joku juttu missä se ei riitä, niin sitten siinä kohti käytät bitblt:tä. (ym. muita piirtopintaa käsitteleviä apeja, bitblt harvoin yksin riittää)

Antti Laaksonen [04.02.2005 19:39:49]

#

Joka tapauksessa piirtokomento kannattaa toteuttaa niin, että PaintPicturen muuttaminen BitBlt:ksi tai toisinpäin on helppoa. Minä teen yleensä niin, että kuvia piirretään tähän tapaan:

' piirtää linnun kohtaan (50, 50)
PiirraKuva LINTU, 50, 50

Näin koodista tulee varsin selkeää. PiirraKuva-aliohjelmassa sitten kutsutaan vaikka BitBlt:tä tai yhtä hyvin DirectX:n piirtokomentoja. LINTU on vakio, jonka perusteella tiedetään kuvan paikka suuremmassa kuvassa, johon on koottu kaikki peliin kuuluvat pikkukuvat.

Lumi-ukkeli [05.02.2005 09:35:16]

#

Aika tarkalleen samalla tavalla neuvoit ku tuossa pelinteko-oppaassa(vb6:lle).

Päättelin tuosta sun kommentista "sitten jos tulee joku juttu missä se ei riitä, niin sitten siinä kohti käytät bitblt:tä.", että Bitblt on monipuolisempi?

Antti Laaksonen [05.02.2005 12:41:47]

#

PaintPicturen toiminta vastaa BitBlt:tä. Lisäksi PaintPicture taitaa myös kuvan venytyksen, mihin BitBlt ei pysty, vaan pitää käyttää StretchBlt:tä. Toisaalta BitBlt taisi olla useita kertoja nopeampi, kun joskus asiaa testasin.

esakom [05.02.2005 13:27:32]

#

Kuten sanottua, BitBlt on vain yksi API:n grafiikka-funktioista. BitBlt:n "monipuolisuus" johtuu siitä että sitä voi sujuvammin käyttää näiden muiden apien kanssa (kaikki käsittelevät piirtopinnan kahvaa, bitmap-rakennetta jne.) Eli jos olet jo sovelluksessasi käyttänyt BitBlt:tä, ja törmäät tilanteesen missä PaintPicture ei riitäkään, niin voit ehkä hieman helpommin liittää mukaan myös muita grafiikka-apeja (Puhun siis koko ajan Win32 API:sta, onhan niitä muitakin...) BitBlt yksin ei taida olla sen monipuolisempi, kuin että sillä voi piirtää myös muualle kuin omaan sovellukseen, vaikka suoraan Windowsin työpöydälle!

nomic [06.02.2005 02:22:01]

#

itse suosin ennemmin blittausta, jos kyseessä on pikkasenkin isompi projekti.
kannattaa tutustua seuraaviin rajapintoihin:

BitBlit
TransparentBlt
StretchBlt
GetPixel

muistaakseni TransparentBlt:llä pystyi myöskin venyttämään kuvaa.

Alla pieni esimerkki läpinäkyvyydestä ja venyttämisestä.
Eli luo formille timer1, picture1, picture2.

Private Declare Function TransparentBlt Lib "msimg32.dll" (ByVal hDC 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 nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal crTransparent As Long) As Boolean
Dim a As Long
Dim x As Integer, y As Integer

Private Sub Form_Activate()
        a = TransparentBlt(Picture2.hDC, 0, 0, 64, 64, Picture1.hDC, 0, 0, 64, 64, RGB(255, 255, 255))

        x = Picture1.ScaleWidth
        y = Picture1.ScaleHeight

        Timer1.Interval = 50
End Sub

Private Sub Timer1_Timer()
    x = x - 1
    y = y - 1
    a = TransparentBlt(Picture2.hDC, 0, 0, x, y, Picture1.hDC, 0, 0, 64, 64, RGB(255, 255, 255))
End Sub

Eli parametrit on lähes samat, kuin bitblt:lle.
Ainut, että vikaan parametriin määritellään mikä on läpinäkyvyyden väri. Ja kaksi sitä edellistä määrittää kuvan koon, joka siirretään seuraavaan kuvaan.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta