No niin pitkästä aikaa koneen ääressä ja vb:n kimpussa. Asia joka ei nyt millään tunnu menevän meikällä jakeluun, tämä sprite grafiikan teko nimittäin. Olen koittanut sisäistää Putkan pariakin esimerkkiä, mutta mutta.... Nyt kysynkin, voiko homman tehdä ilman kaksoispuskurointia?? Laitoin tähän säälittävän yritelmän mukaan .Joten kertokaahan olenko ollenkaan oikeilla jäljillä??? Nyt lienee hieman selvennystä syytä lisätä tähän. Ne BitBlt litaniat laitoin moduliin. Eli ajatuksenani oli saada pTaustaan ilmestymään sprite. Tuo pVanha on tyhjä picturebox johon otin taustan talteen. Ja tuo lopussa oleva KeyDown:n olisi pitänyt kadottaa sprite koska en palauttanut talteen ottamaani pTaustaa. Toivottavasti saitte jotakin tolkkua.... Ja anteeksi kun tuli näin pitkä.
Dim a As Long Dim x As Single, y As Single Private Sub Form_Activate() ScaleMode = 3 'saako tällä twip/pixel ongelman ratkottua?? x = 304 y = 264 a = BitBlt(pVanha.hDC, 0, 0, 38, 42, pTausta.hDC, x, y, vbSrcCopy) a = BitBlt(pTausta.hDC, x, y, 38, 42, pMaski.hDC, 0, 0, vbSrcAnd) a = BitBlt(pTausta.hDC, x, y, 38, 42, pSprite.hDC, 0, 0, vbSrcInvert) End Sub Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyLeft Then x = x - 20 End Sub
Ei kaksoispuskurointia ole pakko käyttää. Tällöin grafiikasta kuitenkin tulee helposti vilkkuvaa. Sprite-oppaan esimerkkiohjelmassakin on oikeasti formin ulkopuolella Picturebox, jonne kuva piirretään ennen kuin se kopioidaan näkyville toiseen Pictureboxiin.
Jos sprite-ohjelma ei tunnu toimivan, tarkista:
1. että kaikki mitat ovat pikseleissä tai pikseleiksi muutettuna (näyttää olevan oikein tuossa koodissa)
2. PictureBoxien AutoRedraw-ominaisuudet. Välillä AutoRedraw täytyy olla False, välillä True. Tämän logiikkaa en ole itsekään kokonaan sisäistänyt, kokeilu kannatta...
Ja kukaan ei tietysti pakota käyttämään pictureboxeja ollenkaan. GDI:stä löytyy CreateBitmap sekä CreateCompatibleBitmap-funktiot. Muita hyödyllisiä: SelectObject, DeleteObject jne.
Spritet on varmasti kätevämpi latailla pictureboxeihin, näin tulee käytettyä hyödyksi VB:n automaagiset tuet monille kuvaformaateille.
Delphi ei tietysti ole ihan sama asia, mutta minä teen siten että käytän TImagea joka vastaa luullakseni tuota pictureboxia ja sitten kopioin suoraan lomakkeen Canvakseen. Canvas varmaan vastaa DC:tä, mutta en ole ihan varma. Joka tapauksessa on toiminut hyvin...
No niin täällä taas!
Tässä taas koodi yritelmä joka YLLÄTYS yllätys muistuttaa erehdyttävästi Putkan esimerkkiä. Mutta jostainhan se on lähdettävä???
Kuten jo aikaisemmin yritin saada homman toimimaan ilman sitä kaksoispuskurointia ja samalla sisäistää esimerkki koodia. Ja kyllähän siitä kerta kerran jälkeen jotain aina valkenee...
Tässä siis "jutzka". Laitoin kysymykset perään.
BitBlt litaniat edelleen modulissa.
Option Explicit Dim a As Long Dim x As Single, y As Single Dim i As Single, j As Single Dim vx As Single, vy As Single Dim KeyCode As Integer Private Sub Form_Activate() ScaleMode = 3 KeyPreview = True x = pTausta.Width / 2 y = pTausta.Height / 2 Do For i = 0 To 10 If vx <> 0 Then 'palautetaan kuva takaisin a = BitBlt(pTausta.hDC, vx, vy, 38, 42, pVanha.hDC, 0, 0, vbSrcCopy) End If ' uudet koordinaatit x = pTausta.Width / 2 - 20 y = pTausta.Height / 2 - 20 ' otetaan kuva talteen a = BitBlt(pVanha.hDC, 0, 0, 38, 42, pTausta.hDC, x, y, vbSrcCopy) 'piirretään sprite a = BitBlt(pTausta.hDC, x, y, 38, 42, pMaski.hDC, 0, 0, vbSrcAnd) a = BitBlt(pTausta.hDC, x, y, 38, 42, pSprite.hDC, 0, 0, vbSrcInvert) ' vanhat koordinaatit talteen vx = x vy = y 'hidaste j = Timer Do While j + 0.01 > Timer DoEvents Loop If KeyCode = vbKeyEscape Then End End If Next Loop End Sub
1. Yritin saada loopin loppumaan vbKeyEscapella, mutta ei onnistunut. Mikä väärin?
2. Jos olen ollenkaan ymmärtänyt mitä tuohon koodiin kirjoitin, niin eikö tuon pitäisi toistaa looppi 10 kertaa ja samalla siirtää kuvaa.
3. Se AutoReDraw juttu tosiaan auttoi.
4. Sitten vielä utelisin sellaista miten hoidetaan spriten liikuttelu Keycodeilla. Osaan kyllä hoitaa homman tavallisilla picboxeilla, niissä kun on Left ja Top jonka arvoja muuttamalla homma hoituu. Tässä tapauksessa olen ajatellut että pitäisikö olla joku muuttuja tuossa koodin 'uudet koordinaatit osiossa, jonka arvoa sitten muuteltaisiin esim. näin???
If KeyCode = vbKeyLeft Then muuttuja = 10 ( esim.) Onko sinne päinkään?
Tässähän taas tätä, koittakaa olla tuskastumatta, kyllä tämä vielä tästä. Pakkohan siihen on uskoa, vai mitä?
No jebu. Sain ton vbKeyEscape mysteerion selvitettyä.Mutta haluaisiko joku avittaa tuossa liikuttelu ongelmassa.
Vaikkapa sanallisesti, tai koodin pätkällä, mutta siinä tapauksessa kommentteja mukaan!! Nämä jutut kun ei ole kaikille niin selviä. Ja toisekseen, mitä iloa on kopioida koodia ymmärtämättä siitä mitään??? - Ville
Laita tämä Form_KeyDown:in alle.
Select Case KeyCode Case vbKeyUp 'YLÖS-nappi 'Mitä tehdään kun YLÖS-nappia painetaan Case vbKeyDown 'ALAS-nappi 'Mitä tehdään kun ALAS-nappia painetaan Case vbKeyLeft 'VASEMMALLE-nappi 'Mitä tehdään kun VASEMMALLE-nappia painetaan Case vbKeyRight 'OIKEALLE-nappi 'Mitä tehdään kun OIKEALLE-nappia painetaan End Select
Aihe on jo aika vanha, joten et voi enää vastata siihen.