Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: [VB] Piirto suoraan työpöydälle

Sivun loppuun

Nesci [31.10.2006 01:14:43]

#

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" :)

Latska [31.10.2006 06:05:23]

#

Tämä koodivinkki muistaakseni vastaa kysymykseen.

Blaze [31.10.2006 09:17:11]

#

Yksi tapa: https://www.ohjelmointiputka.net/koodivinkit/24435-vb6-aktiivisen-ikkunan-päällä-istuva-maskotti

Nesci [31.10.2006 10:00:33]

#

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ä..

JoreSoft [06.11.2006 16:19:01]

#

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

Nesci [07.11.2006 08:22:41]

#

Noista on paljon apua! Suurkiitokset JoreSoftille :)

Metabolix [07.11.2006 08:44:22]

#

Ä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.

JoreSoft [07.11.2006 18:39:36]

#

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_2y9g.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.


Sivun alkuun

Vastaus

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

Tietoa sivustosta