Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <WindowsConstants.au3>
- #include <GUIConstants.au3>
- #include <GDIPlus.au3>
- #include <WinAPI.au3>
- ; -Author: name22 (www.autoit.de)
- Opt("GUIOnEventMode", 1)
- Global Const $nTau = ACos(-1) * 2
- Global $vNTdll = DllOpen("ntdll.dll")
- Global $tPrecSleep = DllStructCreate("int64 time;")
- Global $pPrecSleep = DllStructGetPtr($tPrecSleep)
- ;###-v-SETTINGS-v-###
- Global $iWidth = 400
- Global $iHeight = 400
- Global $nFPS = 60
- Global $iARGB_BG = 0xFF505050
- Global $iARGB_Snow = 0xFFFFFFFF
- Global $iFlakeCount = 60
- Global $iMinFallingSpeed = 20, $iMaxFallingSpeed = 50
- Global $iMinOscillations = 2, $iMaxOscillations = 5
- Global $iMinOscillationDist = 10, $iMaxOscillationDist = 50
- Global $iMinRadius = 1, $iMaxRadius = 3
- Global $iBlastRadius = 200
- Global $iBlastAccell = 300
- Global $nAirFriction = 0.95
- ;###-^-SETTINGS-^-###
- Global $aFlakes[$iFlakeCount + 1][8] = [[$iFlakeCount]]
- Global $hWnd, $hDC_Window, $hDC_Bitmap, $hBitmap, $hGraphics, $hOldObj, $hBrush_Snow
- Global $nSleepTime = 1000 / $nFPS
- 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
- $hWnd = GUICreate("name22 - Snowflakes", $iWidth, $iHeight)
- GUISetState()
- $hDC_Window = _WinAPI_GetDC($hWnd)
- $hDC_Bitmap = _WinAPI_CreateCompatibleDC($hDC_Window)
- $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC_Window, $iWidth, $iHeight)
- $hOldObj = _WinAPI_SelectObject($hDC_Bitmap, $hBitmap)
- _GDIPlus_Startup()
- $hGraphics = _GDIPlus_GraphicsCreateFromHDC($hDC_Bitmap)
- _GDIPlus_GraphicsSetClipRect($hGraphics, 0, 0, $iWidth, $iHeight)
- _GDIPlus_GraphicsSetSmoothingMode($hGraphics, 2)
- $hBrush_Snow = _GDIPlus_BrushCreateSolid($iARGB_Snow)
- _GDIPlus_GraphicsClear($hGraphics, $iARGB_BG)
- _Redraw()
- OnAutoItExitRegister("_Shutdown")
- GUIRegisterMsg($WM_PAINT, "_Redraw")
- GUISetOnEvent($GUI_EVENT_CLOSE, "_Close")
- GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_Click")
- $nT_Sleep = TimerInit() + $nSleepTime
- While True
- DllStructSetData($tPrecSleep, "time", -10000 * ($nSleepTime - TimerDiff($nT_Sleep)))
- DllCall($vNTdll, "dword", "ZwDelayExecution", "int", 0, "ptr", $pPrecSleep)
- $nFrameTime = TimerDiff($nT_Sleep)
- $nT_Sleep = TimerInit()
- $nFPS_Cur = 1000 / $nFrameTime
- _GDIPlus_GraphicsClear($hGraphics, $iARGB_BG)
- For $i = 1 To $aFlakes[0][0]
- $aFlakes[$i][1] += ($aFlakes[$i][5] + $aFlakes[$i][3]) / $nFPS_Cur
- $aFlakes[$i][0] += (Sin($aFlakes[$i][1] / $iHeight * $nTau * $aFlakes[$i][6]) * $aFlakes[$i][7] + $aFlakes[$i][2]) / $nFPS_Cur
- $aFlakes[$i][2] *= $nAirFriction
- $aFlakes[$i][3] *= $nAirFriction
- If $aFlakes[$i][1] > $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
- _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
- 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
- Func _Redraw()
- _WinAPI_BitBlt($hDC_Window, 0, 0, $iWidth, $iHeight, $hDC_Bitmap, 0, 0, $SRCCOPY)
- EndFunc
- Func _Close()
- Exit
- EndFunc
- Func _Shutdown()
- _WinAPI_SelectObject($hDC_Bitmap, $hOldObj)
- _WinAPI_ReleaseDC($hWnd, $hDC_Window)
- _WinAPI_DeleteDC($hDC_Bitmap)
- _WinAPI_DeleteObject($hBitmap)
- _GDIPlus_GraphicsDispose($hGraphics)
- _GDIPlus_BrushDispose($hBrush_Snow)
- _GDIPlus_Shutdown()
- DllClose($vNTdll)
- EndFunc
- ; #FUNCTION# ====================================================================================================================
- ; Name...........: _GDIPlus_GraphicsSetClipRect
- ; Description ...: Updates the clipping region of a Graphics object to a region that is the combination of itself and a rectangle
- ; Syntax.........: _GDIPlus_GraphicsSetClipRect($hGraphics, $nX, $nY, $nWidth, $nHeight[, $iCombineMode = 0])
- ; Parameters ....: $hGraphics - Pointer to a Graphics object
- ; $nX - X coordinate of the upper-left corner of the rectangle
- ; $nY - Y coordinate of the upper-left corner of the rectangle
- ; $nWidth - Width of the rectangle
- ; $nHeight - Height of the rectangle
- ; $iCombineMode - Regions combination mode:
- ; |0 - The existing region is replaced by the new region
- ; |1 - The existing region is replaced by the intersection of itself and the new region
- ; |2 - The existing region is replaced by the union of itself and the new region
- ; |3 - The existing region is replaced by the result of performing an XOR on the two regions
- ; |4 - The existing region is replaced by the portion of itself that is outside of the new region
- ; |5 - The existing region is replaced by the portion of the new region that is outside of the existing region
- ; Return values .: Success - True
- ; Failure - False and either:
- ; |@error and @extended are set if DllCall failed
- ; |$GDIP_STATUS contains a non zero value specifying the error code
- ; Remarks .......: None
- ; Related .......: None
- ; Link ..........; @@MsdnLink@@ GdipSetClipRect
- ; Example .......; No
- ; ===============================================================================================================================
- Func _GDIPlus_GraphicsSetClipRect($hGraphics, $nX, $nY, $nWidth, $nHeight, $iCombineMode = 0)
- Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetClipRect", "hwnd", $hGraphics, "float", $nX, "float", $nY, "float", $nWidth, "float", $nHeight, "int", $iCombineMode)
- If @error Then Return SetError(@error, @extended, False)
- $GDIP_STATUS = $aResult[0]
- Return $aResult[0] = 0
- EndFunc ;==>_GDIPlus_GraphicsSetClipRect
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement