Kumpaa kannattais käyttää, jos meinaa tehä 2D-pelin?
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...
Tossa Microsoftin oppaassa sanottiin, että jos
joutuu tekemään laajoja rasterointioperaatioita bittikartalle samalla kun piirtää sitä, niin kannattaa käyttää Paintpicturea BitBlt:n tilalta.
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ää)
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.
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?
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.
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!
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.