Eli niinkuin otsikko jo kertoo, pitäisi piirtää spritejä suoraan työpöydälle. Ennenkö alan räpeltämään mitään kysyn mielipiteitä kuinka homma kannattaisi hoitaa.
Formiin picture boxi, suurentaa ne koko ruudun kokoisinksi, piilottaa ja piirää - Tuommoinen tuli mieleen.
Toinen vaihtoehto kenties olisi ottaa kuvat työpöydästä ja iskeä se pictureboxin taustaksi, mutta tuo ei ihan aja asiaa mitä olen tekemässä.
Onko olemassa eri tapoja ? Esim Api puolella ?
Nimim. "keltanokka" :)
Tämä koodivinkki muistaakseni vastaa kysymykseen.
Yksi tapa: https://www.ohjelmointiputka.net/koodivinkit/
nojoo, pitää vähä kai tarkentaa. Siksi spritellä että voi käyttää kaksoispuskurointia, objektia on tarkotus liikutella. Sain kikkailtua tuon roska vinkin ja antin bitblit oppaan avulla jonkinlaisen jutun pikapikaa.. mutta kyseinen koodi jättää jälkiä sinne sun tänne ja sekoilee kun hyppää ikkunasta toiseen. Pitää kehitellä vielä..
Pikku apu tuohon BitBlt juttuun :) Ei liity siis suoraan tuohon työpöydälle piirtoon :D
Käytä mieluummin TransparentBlt-API:a
Public Declare Function TransparentBlt Lib "msimg32" _ (ByVal hdcDest As Long, ByVal nXOriginDest As Long, _ ByVal nYOriginDest As Long, ByVal nWidthDest As Long, _ ByVal nHeightDest As Long, ByVal hdcSrc As Long, _ ByVal nXOriginSrc As Long, ByVal nYOriginSrc As Long, _ ByVal nWidthSrc As Long, ByVal nHeightSrc As Long, _ ByVal crTransparent As Long) As Long
Luo Form fOrig, (Originaali) jonka kuvaksi lataat pelin taustakuvan.
Luo Form fBuf, (Buffer) toimii välipuskurina
Luo Form fSprite, Kaikkien Spritejen varasto.
Systeemi toimii siten että määräät yhden värin "läpinäkyvyys" väriksi esim &HFF00FF (Pinkki), jokaiseen tekemääsi kuvaan, et tarvitse erillistä maski kuvaa kuten BitBlt-API:ssa. jää siis yksi API-kutsu pois.. ja iso kasa kuvia. :D
Tässä esimerkissä formien AutoRedraw = True ja ScaleMode = 3 (Pixels)
Eikä käytetä yhtään PictureBoxia ;)
Piirtokoodi
Public Sub PrintAll() Dim K1 As SpriteType, I% BitBlt fBuf.hdc, 0, 0, PW, PH, fOrig.hdc, 0, 0, vbSrcCopy 'Kopioidaan taustakuva puskuriin For I = 0 To 100 With D(I) '.X ja .Y Spriten paikka pelissä, K1.X, K1.Y Spriten paikka talletuspaikassa K1 = CountXY(I, 8) 'Lasketaan indeksin muukaan, mikä spriten talletuspaikka TransparentBlt fBuf.hdc, .X, .Y, W, H, fSprite.hdc, K1.X, K1.Y, W, H, &HFF00FF 'Haetaan yksi kuvalohko End With Next I BitBlt PL.pKuva.hdc, 0, 0, SW, SH, fBuf.hdc, 0, 0, vbSrcCopy 'Siirretään se pelikuvaksi End Sub 'Talletetaan sprite Sub SaveSprite(Index%, Kuva As PictureBox) Dim K As SpriteType K = CountXY(Index, 8) BitBlt fSprite.hdc, K.X, K.Y, W, H, Kuva.hdc, 0, 0, vbSrcCopy End Sub 'Laskee X/Y koordinaatit Public Function CountXY(Index As Integer, Rows%) As SpriteType Dim X&, Y& Y = Int(Index / Rows) X = Index - (Y * Rows) CountXY.Y = Int(Y) CountXY.X = Int(X) End Function
Tuossa jotain apua :)
Edit**
Spritejen talletus tiedostosta suoraan
Sub SaveSprite(Index%, Filename As String) Dim K As SpriteType, I% If Dir(Filename, vbNormal) = "" Then MsgBox "Kyseistä tiedostoa ei ole" Exit Sub End If K = CountXY(Index, 8) pTemp.Picture = LoadPicture(Kuva) BitBlt fSprite.hdc, K.X, K.Y, W, H, pTemp.hdc, 0, 0, vbSrcCopy End Sub ' Esimerkki SprteTypestä vielä... muokkaa omiin tarpeisiin sopivaksi Public Type SpriteType X As Integer Y As Integer XT As Integer 'Temp tieto YT As Integer Value As Integer Direction As Integer 'Suunta (-1) - (1) End Type
Noista on paljon apua! Suurkiitokset JoreSoftille :)
Älä käytä TransparentBlt-apia, jos meinaat tehdä toimivan ohjelman. Siinä on nimittäin ainakin Windows 98:ssa vielä muistivuoto, ja ihan kokemuksesta voin sanoa, että Tetrikseni lopetti sen takia piirtämisen muutaman piirtokerran jälkeen. Sitä bugia olikin sitten ilo metsästää. "Minne ne kaikki hävisivät?!" :/ Ongelmasta on maininta nykyään varmaankin liki kaikilla ohjesivuilla, tai olisi ainakin syytä. Ratkaisu ja korvaava funktio (C++:lla ainakin) ovat Microsoftin sivuilla.
http://msdn.microsoft.com/library/default.asp?
Tuolla se asia ilmeneekin :) Eli ei win95/98 käyttöön, mutta ei monella niitä koneessaa edes ole. Sen takia en ollut tietoinen tuosta viasta.
Windows 95/98: TransparentBlt contains a memory leak that can exhaust system resources. To draw a transparent bitmap using BitBlt, see Knowledge Base article 79212.
Aihe on jo aika vanha, joten et voi enää vastata siihen.