Gå til innhold

VB Snø object til å parse forms!


Anbefalte innlegg

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. :D

 

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 av chills
Lenke til kommentar
Videoannonse
Annonse

Når jeg tenker meg om.......

 

 

Kan jeg bruke bitmaps som snø?

Hmm lese litt om det da :p

 

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. :ermm:

Lenke til kommentar
Reversing er lagt på hylla, jeg har en julekalender å lage.  :D

Endelig noe fornuftig! :p

 

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 av moskus
Lenke til kommentar
  • 3 uker senere...

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

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
Eller kanskje du vil ta deg bryet med å fortelle meg hvordan jeg finner X til en gitt farge? :whistle:

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 av jorn79
Lenke til kommentar

Du forstod meg riktig, men jeg er redd for at jeg ikke forstod deg. :blush:

 

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
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 av jorn79
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...