Gjakmarrja Skrevet 24. oktober 2006 Del Skrevet 24. oktober 2006 (endret) Hei! Jeg ønsker å lage en funksjon da hvor jeg kan parse en "pointer" til formet jeg vil ha snø effekt/animasjon på også tar den seg av det. Reversing er lagt på hylla, jeg har en julekalender å lage. Jeg tenker på å bruke Get/Set pixel API. Det blir et overlay på en måte, så den må redrawe pixel til det den var før den endre den til hvit. Noen som har noen idè/input? Selve snø koden er jeg relativt sikker på ikke er vanskelig å lage, snøen skal ikke heller ligge seg på objekter så det burde være en rett frem jobb. Takk for input. Edit: (Tenke høyt) Public Class Form1 'API CALL Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, _ ByVal y As Long) As Long Public Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, _ ByVal x As Long, ByVal y As Long, _ ByVal crColor As Long) As Long Public snow(500) As snø Public farge As Color Public Structure snø Dim x As Integer Dim y As Integer Dim NyX As Integer Dim NyY As Integer Dim pix As Long End Structure Public Sub CalcXY(ByVal i As Integer) '*sette gammel pixverdi* SetPixel(Me.CreateGraphics.GetHdc, snow(i).x, snow(i).y, snow(i).pix) 'kalkulere naturtro XY End Sub Public Sub renderscreen() Dim i As Integer = 0 For i = 0 To snow.LongLength - 1 snow(i).pix = (GetPixel(Me.CreateGraphics.GetHdc, snow(i).x, snow(i).y)) snow(i).x = snow(i).NyX snow(i).y = snow(i).NyY CalcXY(i) 'tegne snøen SetPixel(Me.CreateGraphics.GetHdc, snow(i).NyX, snow(i).NyY, ''constant for hvitfarge') Next End Sub End Class Hvilken constant kan jeg bruke for å si at jeg vil sette pixel til hvit? I og med at color constant tydeligvis ikke gir meg hvit i long type? Endret 24. oktober 2006 av chills Lenke til kommentar
Gjakmarrja Skrevet 25. oktober 2006 Forfatter Del Skrevet 25. oktober 2006 Når jeg tenker meg om....... Kan jeg bruke bitmaps som snø? Hmm lese litt om det da Gjøre de tranceparent, så skal vel det gå fint. Men hvordan kan jeg da eventuelt redraw? Me.invalidate()? Den har jo en overload som kun funker mot et lite område, så ikke hele formet blir oppdatert. Får vel se litt mer på dette en annen dag, 8 timer fysikk i dag, så historie proskjekt og i morra jobb. Lenke til kommentar
Moskus Skrevet 25. oktober 2006 Del Skrevet 25. oktober 2006 (endret) Reversing er lagt på hylla, jeg har en julekalender å lage. Endelig noe fornuftig! Jeg har et forslag. Det er forferdelig tregt og ikke optimalisert i det hele tatt, men du får ta det for hva det er verdt... Public Class frmMain 'API CALL Declare Function GetPixel Lib "gdi32" (ByVal hdc As Integer, ByVal x As Integer, ByVal y As Integer) As Integer Public Declare Function SetPixel Lib "gdi32" (ByVal hdc As Integer, ByVal x As Integer, ByVal y As Integer, ByVal crColor As Integer) As Integer Public snow(200) As snø Public farge As Color Public threadTimer As System.Threading.Thread Public bolThreadRunning As Boolean Public Structure snø Dim StartX As Integer Dim StartY As Integer Dim steg As Integer Dim NyX As Integer Dim NyY As Integer Dim pix As Integer End Structure Public Sub renderscreen() Do If bolThreadRunning Then For i As Integer = 0 To snow.GetLength(0) - 1 With snow(i) 'Tegner over forrige posisjon slik at vi slipper å tegne streker SetPixel(Me.CreateGraphics.GetHdc, .NyX, .NyY, .pix) 'Beregne ny posisjon .NyX = .StartX + Math.Sin(.steg * Math.PI / 4) * 5 .NyY = .NyY + 1 .pix = GetPixel(Me.CreateGraphics.GetHdc, .NyX, .NyY) 'Starter på ny når "snøen kommer til bunn If .NyY >= Me.Height Then .NyY = 1 'Tar et nytt steg på stigen snow(i).steg += 1 'Tegne pixel SetPixel(Me.CreateGraphics.GetHdc, .NyX, .NyY, Color.White.ToArgb) End With Next Else System.Threading.Thread.Sleep(1000) End If Loop End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load threadTimer = New System.Threading.Thread(AddressOf renderscreen) threadTimer.Priority = Threading.ThreadPriority.Normal threadTimer.Start() bolThreadRunning = True Dim rnd As New System.Random For i As Integer = 0 To snow.GetLength(0) - 1 snow(i).StartX = rnd.Next(0, Me.Width) snow(i).StartY = rnd.Next(0, Me.Height) snow(i).NyX = snow(i).StartX snow(i).NyY = snow(i).StartY snow(i).steg = rnd.Next(0, 8) snow(i).pix = 0 Next End Sub Private Sub btnStartStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStartStop.Click If bolThreadRunning = True Then bolThreadRunning = False Else bolThreadRunning = True End If End Sub End Class Dette kan selvfølgelig gjøres mer fancy. Foreløpig er X-bevegelsen til snøfnuggene bare en sinuskurve (.NyX = .StartX + Math.Sin(.steg * Math.PI / 4) * 5)), men det kan jo gjøres mer spennende, f.eks. ved å sette amplituden (5) til et random tall mellom 3 og 7? "Hastigheten" (.steg * Math.PI / 4) kan selvfølgelig også endres... Eller finne en annen funksjon? Pendel-svingning kanskje? Her setter bare fantasien begrensninger! Endret 25. oktober 2006 av moskus Lenke til kommentar
Gjakmarrja Skrevet 25. oktober 2006 Forfatter Del Skrevet 25. oktober 2006 Ikke gale. Funker jo det. Skal snuse litt mer på avanserte bevegelser, og ikke minst lære meg threading. ( ) Lenke til kommentar
GeirGrusom Skrevet 27. oktober 2006 Del Skrevet 27. oktober 2006 Laget noe slikt akkurat nå. Snøen legger seg på kontroller du legger på formen SnowApp.zip Lenke til kommentar
Gjakmarrja Skrevet 27. oktober 2006 Forfatter Del Skrevet 27. oktober 2006 Små frekt at den legger seg på kontrollene da. Hmm, jeg har 24 labels. En for hver dag, men det "lagger" når vinduet startes. Altså du kan se bakgrunnen der hvor noen av lablene skal være i kort tid under oppstart. Snøøøøø. Lenke til kommentar
GeirGrusom Skrevet 28. oktober 2006 Del Skrevet 28. oktober 2006 For å få det til å gå fortere, kan du skru av LinearGradientBrush i SnowParticle.Draw ved å bytte ut brush = New System.Drawing.Drawing2D.LinearGradientBrush med brush = Brushes.White Da går det betydelig fortere. Lenke til kommentar
Moskus Skrevet 30. oktober 2006 Del Skrevet 30. oktober 2006 Laget noe slikt akkurat nå. Snøen legger seg på kontroller du legger på formen 7163715[/snapback] Sweeet! Lenke til kommentar
Gjakmarrja Skrevet 30. oktober 2006 Forfatter Del Skrevet 30. oktober 2006 (endret) SnowApp funker ikke med mange labels på formen, da hakker det sykt. Men veldig veldig bra uten labels. Endret 30. oktober 2006 av chills Lenke til kommentar
Degeim Skrevet 20. november 2006 Del Skrevet 20. november 2006 Jeg driver med det samme nå, og fikk en del fine tips herfra. Men jeg får ikke SetPixel med Color.White.Toargb til å farge annet enn svart. Heller ikke når jeg kjører Moskus sitt eksempel blir det annet enn svart. Er det noe galt her, eller vil ikke Color.White.Toargb returnere en gyldig "integer-farge"? Takk, Degeim Lenke til kommentar
GeirGrusom Skrevet 20. november 2006 Del Skrevet 20. november 2006 Husk at Long i VB6 skal være Integer i VB.NET, så hvis du har kopiert GetPixel/SetPixel fra VB6 sin API Viewer, fungerer det neppe. Men uansett blir den svart hos meg og, men det kan fikses med Dim c As Integer = Color.White.ToArgb() And &HFFFFFF (tror det har noe med alpha kanalen å gjøre) eller bare Dim c As Integer = &HFFFFFF som gir akkurat samme resultat. Men uansett, folkens, ingen tegning med CreateGraphics, det er fy fy av flere grunner. GetHdc skal bare kalles hvis det avsluttes med en ReleaseHdc etterpå, ellers vil du få en "Already in use" melding hvis du prøver på noe GDI+ greier. Lenke til kommentar
j000rn Skrevet 20. november 2006 Del Skrevet 20. november 2006 Tenkte jeg skulle prøve å lage snø-test med GeirGrusom sin metode... Det burde gå atskillig raskere og gi mulighet til litt mer fancy snø. Må bare få litt tid. Jobb og slit først... :| Lenke til kommentar
Degeim Skrevet 20. november 2006 Del Skrevet 20. november 2006 Aha, takk skal du ha Geir. Da lærte jeg noe nytt også (VB6: Long=VB.Net: Integer). Men da gjenstår fremdeles Color.Darkblue.Toargb AND &X. Eller kanskje du vil ta deg bryet med å fortelle meg hvordan jeg finner X til en gitt farge? Takk, Degeim Lenke til kommentar
j000rn Skrevet 20. november 2006 Del Skrevet 20. november 2006 (endret) Eller kanskje du vil ta deg bryet med å fortelle meg hvordan jeg finner X til en gitt farge? 7325133[/snapback] Hvis jeg forstår deg riktig: &HFF = R &HFF00 = G &HFF0000 = B &HFF000000 = Alpha AND = får bare tilbake bit'ene som er like i de to tallene. farge AND &HFFFFFF <-- "fjerner"/setter til 0 alpha kanalen. Endret 20. november 2006 av jorn79 Lenke til kommentar
Degeim Skrevet 20. november 2006 Del Skrevet 20. november 2006 Du forstod meg riktig, men jeg er redd for at jeg ikke forstod deg. Jeg regner med det er snakk om sekstentallssystemet? Så hvis &HFF er rød, burde &H000000 (&H0) være svart, og &HFFFFFF hvit. Altså vil det si at Color.White.Toargb and &HFFFFFF returnerer &HFFFFFF fordi det er bitene som er like. Korrekt? Dermed trodde jeg at Color.FromARGB(0,&H5F,0,&HFF).Toargb and &H5F00FF ville returnere fargen RGB(80,0,255), men den gir rød... Hva er det jeg gjør feil? Takk, Degeim Lenke til kommentar
j000rn Skrevet 20. november 2006 Del Skrevet 20. november 2006 (endret) Dermed trodde jeg at Color.FromARGB(0,&H5F,0,&HFF).Toargb and &H5F00FF ville returnere fargen RGB(80,0,255), men den gir rød... Hva er det jeg gjør feil? 7325497[/snapback] Alt stemte, unntatt den siste... Når man jobber med farger skal man ALDRI (så godt som) leke med noe annet enn &HFF, &HFFFF, etc... &HFFFFFFFF vil si at man tar med alle bit'ene. Og da trenger man den ikke. TALL AND &HFFFFFFFF = TALL TALL AND 0 = 0 TALL AND TALL = TALL Color.FromARGB(0,&H5F, 0, &HFF).ToARGB() er det ikke noe poeng å AND'e med. Her har du jo allerede satt hva hver byte skal være. Hvis koden du skrev hadde fungert så ville den jo AND'et med seg selv, og gitt samme resultat Men... ToArgb gir det resultatet i omvendt rekkefølge av hva du skulle tro: (burde heller fått navnet ToAbgr Første 8 bits: R (dvs. "siste"... de 8 bitene med lavest tallverdi - lengst til høyre) Neste 8 bits: G Neste 8: B Siste 8: Alpha Så hvis du absolutt vil AND'e med seg selv (selv om det er unødvendig som skrevet over) ville koden blitt: Color.FromARGB(0,&H5F,0,&HFF).Toargb and &HFF005F Endret 20. november 2006 av jorn79 Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå