Mulla on muutama kuva formilla, joita liikutellaan näppäimillä. Kuvan liikuttaminen tapahtuu tarkastamalla (GetAsyncKeyState()) onko tiettyä näppäintä painettu 50ms välein. Jos on painettu, lasketaan uudet koordinaatit ja päivitetään kuvan sijainti. Kuvia on yhteensä neljä. Kolme niistä on png-kuvia, joissa on läpinäkyvyyttä. Varsinainen ongelma on siinä, että kuvat välkkyvät ja muutenkin ruutu tuntuu tahmaavan jotenkin. Formilta osasin laittaa DoubleBuffered = True, mutta ei tuntunut auttanut yhtään. Osaisiko joku sanoa, miten näytön päivitystä voisi optimoida? Valitettavasti en voi koodia copy/pasteta tähän, kun kyseessä on duunihommeli.
Tässä simmpeli testikoodi, joka liikuttelee kahta kuvaa (toinen png-muodossa, toinen gif-muodossa):
Public Class Form1 Private i, j As Double Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick i = i + 0.1 j = j + 0.07 PictureBox1.Location = New Point(250 + 100 * Math.Sin(i), 250 + 100 * Math.Cos(i)) PictureBox2.Location = New Point(400 + 100 * Math.Sin(j), 150 + 100 * Math.Cos(j)) End Sub End Class
Tässä k.o. testiohjelma:
http://ajv.lautatarha.com/tmp/smile.exe
Eli ainakin itellä nuo läpinäkyvyydet hajoilee ihan täysin. Miten tuo kannattaisi tehdä?
Sanoisin, että paras ratkaisu olisi käyttää jotain ihan muuta ratkaisua kuin pictureboxeja transparent -taustavärillä. Eihän se toimi järkevästi päällekkäisten kuvien tapauksessa edes vaikka kuvat pysyisi paikallaan.
Moi ajv!
pitäskö sen toimia näin?
Veikkaan, että olisi vielä parempi, jos noi ei välkkyisi.
@Nea: Tuo on parempi, mutta liike pitäisi tosiaan olla tasaista.
@Grez: mikä olisi parempi ratkaisu? Muodostaa yksi kuva noista kaikista kuvista ja piirtää koko ruutu kerralla? Kuulostaa raskaalta... Tuo hommeli tulee pyörimään sulautetussa kosketusnäytössä (Win CE 6.0), joten ollaan aika kaukana PC:n tehoista.
Kokeilin piirtää koko ruudun kerralla:
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick i = i + 0.1 j = j + 0.07 Dim bm As New Bitmap(Me.Width, Me.Height) Dim g As Graphics = Graphics.FromImage(bm) Dim bg As Image = test.My.Resources.rantaleijona Dim Smiley As Image = test.My.Resources._155px_Smiley_svg g.DrawImage(bg, 0, 0, Me.Width, Me.Height) g.DrawImage(Smiley, CInt(250 + 100 * Math.Sin(i)), CInt(250 + 100 * Math.Cos(i))) g.DrawImage(Smiley, CInt(400 + 100 * Math.Sin(j)), CInt(150 + 100 * Math.Cos(j))) Me.BackgroundImage = bm g.Dispose() End Sub
Vilkkuminen häipyi ja toimii ihan hyvin tässä läppärillä. Prosessorikuorma kuitenkin kasvaa ~50% tasolle noilla kuvilla. Lopullinen sovellus on 600x800 kokoinen ja ainakin taustakuva huomattavasti yksinkertaisempi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.