GDI+ Schneegestöber

  • Hallo,

    da wir alle ja nun auf Weihnachten eingestellt sind und sämtliche Scripte schon für weihnachten fleißig geschrieben werden, wollte ich mich nun auch mal in die Runde der Weihnachtsscripter setzen.

    In GDI+ möchte ich zunächst erstmal ein kleines Schneegestöber schreiben. Ich hatte es mit einem Schneeflockenbild versucht das von oben nach unten fällt aber erstens fänd ich es schöner wenn es einfach kleine PixelPunkte sind die eben wie im Schneegestöber quer durch den Bildschirm fliegen, da es recht langweilog aussieht wenn es einfach stur von oben nach unten fällt.

    Fält euch da auf die schnelle ein kleiner Code dafür ein?

    MfG, Facemix

    meine Spezialität: Windowstools für eine leichtere Arbeit am PC

    Nicht veröffentlicht


    nicht veröffentlichte Programme von mir

    - FTP Filereader
    - Youtube Kanal Player
    -GDI+ Countdown (bis zu einem Wunderbaren ereignis :) )

    MyPastebin

  • GANZ einfach wäre es, jedes Teilchen von oben nach unten zu animieren (oder seitwärts) und es jedes Mal um eine kleine Menge zufälliger Pixel verschieben ^^

    // Kannst ja noch Objekte einbinden, auf denen der "Schnee" dann liegen bleibt.

  • BinDannMalWeg
    das hört sich doch super an, hast du dazu mal ein Beispielscript wie das Funktionieren könnte?

    MfG, Facemix

    meine Spezialität: Windowstools für eine leichtere Arbeit am PC

    Nicht veröffentlicht


    nicht veröffentlichte Programme von mir

    - FTP Filereader
    - Youtube Kanal Player
    -GDI+ Countdown (bis zu einem Wunderbaren ereignis :) )

    MyPastebin

  • Ich könnte dir jetzt eins schreiben, aber dann kann ich da ja gleich selber einreichen... ;)
    Klar du willst 'nur' ein Beispiel... Allerdings geht - zumindest meiner Meinung nach - der Sinn des Wettbewerbs verloren, wenn man nicht die "eigene" Leistung einreicht. ;)

    LG
    Christoph :)

  • Geht es denn hier überhaupt um den Wettbewerb? Ich lese nämlich nichts dergleichen in Facemixs Beiträgen.

    Facemix Ich habe vor einiger Zeit mal versucht ein Script zu schreiben, bei dem Schneeflocken in einer GUI runtersegeln. Jetzt hab ich das ganze mal überarbeitet und ausgebaut. So siehst du zumindest wie man die Schneeflocken als eine Art Partikelsystem umsetzen kann.

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <GDIPlus.au3>
    #include <WinAPI.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; -Author: name22 (http://www.autoit.de)

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $nTau = ACos(-1) * 2

    [/autoit] [autoit][/autoit] [autoit]

    Global $iWidth = 400
    Global $iHeight = 400

    [/autoit] [autoit][/autoit] [autoit]

    Global $iARGB_BG = 0xFF505050
    Global $iARGB_Snow = 0xFFFFFFFF

    [/autoit] [autoit][/autoit] [autoit]

    Global $iFlakeCount = 40
    Global $iMinFallingSpeed = 0.5, $iMaxFallingSpeed = 2
    Global $iMinOscillations = 2, $iMaxOscillations = 5
    Global $iMinOscillationDist = 0.5, $iMaxOscillationDist = 2
    Global $iMinRadius = 1, $iMaxRadius = 3

    [/autoit] [autoit][/autoit] [autoit]

    Global $iBlastRadius = 100
    Global $iBlastAccell = 10
    Global $nAirFriction = 0.95

    [/autoit] [autoit][/autoit] [autoit]

    Global $aFlakes[$iFlakeCount + 1][8] = [[$iFlakeCount]]
    Global $hWnd, $hDC_Window, $hDC_Bitmap, $hBitmap, $hGraphics, $hOldObj

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $aFlakes[0][0]
    $aFlakes[$i][0] = Random(10, $iWidth - 10, 1)
    $aFlakes[$i][1] = Random(-$iHeight, 0, 1)
    $aFlakes[$i][2] = 0
    $aFlakes[$i][3] = 0
    $aFlakes[$i][4] = Random($iMinRadius, $iMaxRadius, 1)
    $aFlakes[$i][5] = Random($iMinFallingSpeed, $iMaxFallingSpeed)
    $aFlakes[$i][6] = Random($iMinOscillations, $iMaxOscillations, 1)
    $aFlakes[$i][7] = Random($iMinOscillationDist, $iMaxOscillationDist) * (-1) ^ Random(1, 2, 1)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $hWnd = GUICreate("name22 - Snowflakes", $iWidth, $iHeight)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    $hDC_Window = _WinAPI_GetDC($hWnd)
    $hDC_Bitmap = _WinAPI_CreateCompatibleDC($hDC_Window)
    $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC_Window, $iWidth, $iHeight)
    $hOldObj = _WinAPI_SelectObject($hDC_Bitmap, $hBitmap)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    $hGraphics = _GDIPlus_GraphicsCreateFromHDC($hDC_Bitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hGraphics, 2)

    [/autoit] [autoit][/autoit] [autoit]

    $hBrush_Snow = _GDIPlus_BrushCreateSolid($iARGB_Snow)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsClear($hGraphics, $iARGB_BG)
    _Redraw()

    [/autoit] [autoit][/autoit] [autoit]

    OnAutoItExitRegister("_Shutdown")
    GUIRegisterMsg($WM_PAINT, "_Redraw")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Close")
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_Click")

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(12)
    _GDIPlus_GraphicsClear($hGraphics, $iARGB_BG)
    For $i = 1 To $aFlakes[0][0]
    If $aFlakes[$i][1] + $aFlakes[$i][3] > $iHeight Or $aFlakes[$i][0] < -20 Or $aFlakes[$i][0] > $iWidth + 20 Then
    $aFlakes[$i][0] = Random(10, $iWidth - 10, 1)
    $aFlakes[$i][1] = Random(-$iHeight, 0, 1)
    $aFlakes[$i][2] = 0
    $aFlakes[$i][3] = 0
    $aFlakes[$i][4] = Random($iMinRadius, $iMaxRadius, 1)
    $aFlakes[$i][5] = Random($iMinFallingSpeed, $iMaxFallingSpeed)
    $aFlakes[$i][6] = Random($iMinOscillations, $iMaxOscillations, 1)
    $aFlakes[$i][7] = Random($iMinOscillationDist, $iMaxOscillationDist)
    EndIf
    $aFlakes[$i][1] += $aFlakes[$i][5] + $aFlakes[$i][3]
    $aFlakes[$i][0] += Sin($aFlakes[$i][1] / $iHeight * $nTau * $aFlakes[$i][6]) * $aFlakes[$i][7] + $aFlakes[$i][2]
    $aFlakes[$i][2] *= $nAirFriction
    $aFlakes[$i][3] *= $nAirFriction
    _GDIPlus_GraphicsFillEllipse($hGraphics, $aFlakes[$i][0] - $aFlakes[$i][4] / 2, $aFlakes[$i][1] - $aFlakes[$i][4] / 2, $aFlakes[$i][4] * 2, $aFlakes[$i][4] * 2, $hBrush_Snow)
    Next
    _WinAPI_BitBlt($hDC_Window, 0, 0, $iWidth, $iHeight, $hDC_Bitmap, 0, 0, $SRCCOPY)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Click()
    Local $tMousePos = _WinAPI_GetMousePos(True, $hWnd)
    For $i = 1 To $aFlakes[0][0]
    $iX_Dist = ($aFlakes[$i][0] - $aFlakes[$i][4]) - DllStructGetData($tMousePos, "X")
    $iY_Dist = ($aFlakes[$i][1] - $aFlakes[$i][4]) - DllStructGetData($tMousePos, "Y")
    $iDist = Sqrt($iX_Dist ^ 2 + $iY_Dist ^ 2)
    If $iDist = 0 Then ContinueLoop
    If $iDist < $iBlastRadius Then
    $aFlakes[$i][2] = (1 - $iDist / $iBlastRadius) * ($iX_Dist / $iDist) * $iBlastAccell
    $aFlakes[$i][3] = (1 - $iDist / $iBlastRadius) * ($iY_Dist / $iDist) * $iBlastAccell
    EndIf
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Redraw()
    _WinAPI_BitBlt($hDC_Window, 0, 0, $iWidth, $iHeight, $hDC_Bitmap, 0, 0, $SRCCOPY)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Close()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Shutdown()
    _WinAPI_SelectObject($hDC_Bitmap, $hOldObj)
    _WinAPI_ReleaseDC($hWnd, $hDC_Window)
    _WinAPI_DeleteDC($hDC_Bitmap)
    _WinAPI_DeleteObject($hBitmap)

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_BrushDispose($hBrush_Snow)
    _GDIPlus_Shutdown()
    EndFunc

    [/autoit]


    Am Scriptanfang sind jede Menge globale Variablen die diverse Einstellmöglichkeiten bieten.
    Kleine extra Spielerei: Klick mal irgendwo in die GUI ;).

  • name22
    danke, denn ich hatte es tatsächlich nicht auf den Wettbewerb abgesehen, ich möchte einfach ein kleines Weihnachtsscript für mich schreiben :)

    Dein Script schaut super aus, auch die kleine extra spielerei finde ich ganz lustig dass beim Click in die GUI die Schneeflocken vom Curser wegfliegen, und sonst ist es ganz genau das was ich gesucht habe ich danke dir :)

    minx, BinDannMalWeg
    klar ihr habt recht icht hätte es auf den Wettbewerb abziehlen können, doch das ist jedoch nicht der Fall, seid euch versichert, ich hätte genau diese Frage auch gebracht wenn hier nicht gerade ein Wettbewerb laufen würde :)

    MfG, Facemix

    meine Spezialität: Windowstools für eine leichtere Arbeit am PC

    Nicht veröffentlicht


    nicht veröffentlichte Programme von mir

    - FTP Filereader
    - Youtube Kanal Player
    -GDI+ Countdown (bis zu einem Wunderbaren ereignis :) )

    MyPastebin

  • da fällt mir doch sofort das hier ein^^

  • schönes schneien auf dem Desktop, ist nur ein bisschen unpassend dass die Fenster durchlöchert werden :D aber sieht cool aus

    MfG, Facemix

    meine Spezialität: Windowstools für eine leichtere Arbeit am PC

    Nicht veröffentlicht


    nicht veröffentlichte Programme von mir

    - FTP Filereader
    - Youtube Kanal Player
    -GDI+ Countdown (bis zu einem Wunderbaren ereignis :) )

    MyPastebin