Что нового

Снежинки к Новому Году

TheBloodTear

Новичок
Сообщения
36
Репутация
9
Вот нашел в недрах мусора очень милый скрипт, думаю понравится :smile:..

Код:
#NoTrayIcon
#include <WindowsConstants.au3>
#include <GDIPlus.au3>

FileInstall ("1.png", @TempDir & "\1.png", 1)
FileInstall ("2.png", @TempDir & "\2.png", 1)
FileInstall ("3.png", @TempDir & "\3.png", 1)
FileInstall ("4.png", @TempDir & "\4.png", 1)
FileInstall ("5.png", @TempDir & "\5.png", 1)
FileInstall ("6.png", @TempDir & "\6.png", 1)
FileInstall ("7.png", @TempDir & "\7.png", 1)
FileInstall ("8.png", @TempDir & "\8.png", 1)
FileInstall ("9.png", @TempDir & "\9.png", 1)

Global $iDots = 9
Global $aDots[$iDots][9]
Global $iXpos = 0
Global $iYpos = 0
Global $iDeltaT = 0.01
Global $iSegLen = 10
Global $iSpringK = 10
Global $iMass = 1
Global $iXGravity = 0
Global $iYGravity = 50
Global $iRes = 10
Global $iStopVel = 0.1
Global $iStopAcc = 0.1
Global $iDotSize = 25
Global $iBounce = 0.75
Global $snow = 0
Global Const $AC_SRC_ALPHA      = 1
Global $iHeight = @DesktopHeight
Global $iWidth = @DesktopWidth

HotKeySet ("^{F12}", "snow") ;Ctrl+F12 - показать, либо скрыть
HotKeySet ("{ESC}", "bay") ;Esc - выход

While 1
	If $snow = 1 Then
		$m = MouseGetPos()
		$iXpos = $m[0]
		$iYpos = $m[1]
		_Animate()
	EndIf
	Sleep (10)
WEnd

Func snow()
	If $snow = 1 Then
		For $i = 1 To ($iDots - 1)
			$iDotSize-=2
			GUISetState(@SW_HIDE, $aDots[$i][0])
			$snow = 0
		Next
	Else
		For $i = 1 To ($iDots - 1)
			$iDotSize-=2
			$aDots[$i][0] = GUICreate("Snow", $iDotSize, $iDotSize, 144, 160, $WS_POPUP , $WS_EX_LAYERED + $WS_EX_TOOLWINDOW+$WS_EX_TOPMOST)
			_GDIPlus_Startup()
			$hImage = _GDIPlus_ImageLoadFromFile(@TempDir & "\" & $i & ".png")
			SetBitMap($aDots[$i][0] , $hImage, 255)
			GUISetState(@SW_SHOW, $aDots[$i][0])
			$snow = 1
		Next
	EndIf
EndFunc

Func bay()
	Exit
EndFunc

Func _Animate()
    $aDots[0][1] = $iXpos
    $aDots[0][2] = $iYpos
    For $i = 1 To ($iDots - 1)
        Local $spring[3]
        $spring[1] = 0
        $spring[2] = 0
        _Spring_Force($i - 1, $i, $spring)
        If $i < ($iDots - 1) Then _Spring_Force($i + 1, $i, $spring)
        Local $resist[3]
        $resist[1] = -$aDots[$i][3] * $iRes
        $resist[2] = -$aDots[$i][4] * $iRes
        Local $accel[3]
        $accel[1] = ($spring[1] + $resist[1]) / $iMass + $iXGravity
        $accel[2] = ($spring[2] + $resist[2]) / $iMass + $iYGravity
        $aDots[$i][3] += ($iDeltaT * $accel[1])
        $aDots[$i][4] += ($iDeltaT * $accel[2])
        If Abs($aDots[$i][3]) < $iStopVel And Abs($aDots[$i][4]) < $iStopVel And Abs($accel[1]) < $iStopAcc And Abs($accel[2]) < $iStopAcc Then
            $aDots[$i][3] = 0
            $aDots[$i][4] = 0
        EndIf
        $aDots[$i][1] += $aDots[$i][3]
        $aDots[$i][2] += $aDots[$i][4]
        If ($aDots[$i][2] < 0) Then
            If ($aDots[$i][4] < 0) Then $aDots[$i][4] = $iBounce * - $aDots[$i][4]
            $aDots[$i][2] = 0
        EndIf
        If ($aDots[$i][2] >= $iHeight - $iDotSize - 1) Then
            If ($aDots[$i][4] > 0) Then $aDots[$i][4] = $iBounce * - $aDots[$i][4]
            $aDots[$i][2] = $iHeight - $iDotSize - 1
        EndIf
        If ($aDots[$i][1] >= $iWidth - $iDotSize) Then
            If ($aDots[$i][3] > 0) Then $aDots[$i][3] = $iBounce * - $aDots[$i][3]
            $aDots[$i][1] = $iWidth - $iDotSize - 1
        EndIf
        If ($aDots[$i][1] < 0) Then
            If ($aDots[$i][3] < 0) Then $aDots[$i][3] = $iBounce * - $aDots[$i][3]
            $aDots[$i][1] = 0
        EndIf
        WinMove($aDots[$i][0], "", $aDots[$i][1], $aDots[$i][2])
    Next
EndFunc

Func _Spring_Force($i, $j, ByRef $spring)
    Local $springF
    $dx = $aDots[$i][1] - $aDots[$j][1]
    $dy = $aDots[$i][2] - $aDots[$j][2]
    $len = Sqrt($dx ^ 2 + $dy ^ 2)
    If Not ($len > $iSegLen) Then Return
    $springF = $iSpringK * ($len - $iSegLen)
    $spring[1] += ($dx / $len) * $springF
    $spring[2] += ($dy / $len) * $springF
EndFunc

Func SetBitmap($hGUI, $hImage, $iOpacity)
  Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
  $hScrDC  = _WinAPI_GetDC(0)
  $hMemDC  = _WinAPI_CreateCompatibleDC($hScrDC)
  $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
  $hOld    = _WinAPI_SelectObject($hMemDC, $hBitmap)
  $tSize   = DllStructCreate($tagSIZE)
  $pSize   = DllStructGetPtr($tSize  )
  DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth ($hImage))
  DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
  $tSource = DllStructCreate($tagPOINT)
  $pSource = DllStructGetPtr($tSource)
  $tBlend  = DllStructCreate($tagBLENDFUNCTION)
  $pBlend  = DllStructGetPtr($tBlend)
  DllStructSetData($tBlend, "Alpha" , $iOpacity    )
  DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
  _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
  _WinAPI_ReleaseDC   (0, $hScrDC)
  _WinAPI_SelectObject($hMemDC, $hOld)
  _WinAPI_DeleteObject($hBitmap)
  _WinAPI_DeleteDC    ($hMemDC)
EndFunc

Скрипт заставляет ряд картинок двигаться за указателем мыши :smile:.. Так как на носу Новый Год, я вставил в качестве картинок снежинки ;).. Я думаю, если у кого-то есть дамы, которые могут встретить Новый Год за ПК, или на след день быть за ним, то будет мило установить им это ;).. Используя условия:

Код:
If @YEAR = "2010" And @MON = "01" And @MDAY < 10 Then

вместо появления через HotKey ;).. Как установить EXE в автозагрузку думаю знаете ;)..
Скрипт и картинки во вложении ;).. С наступающим всех!!! :beer:

P.S. Исходный код скрипта не мой, и к сожалению я автора не вспомню, т.к. скачан скрипт был очень давно :(..
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 702
Очень красиво.

А оригинальная верся, я думаю, здесь.
 

armenxxx1

Продвинутый
Сообщения
155
Репутация
56
Извините, что я пишу в такой старой теме, но не работает с Версия AutoIt:3.3.6.1 в чем причина ?
 

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
408
Всё работает, для запуска скрипта нужно нажать Ctrl+F12 (Windows XP)
 

AZJIO

Меценат
Меценат
Сообщения
2 748
Репутация
1 146
Убрал F12 и сделал чтоб снежинки были одинаковыми 16х16. Выход также по Esc.

Скачать

Так как я первый раз этот эффект встретил на JavaScript, то добавил в архив ещё вариант JavaScript и два эффекта на JavaScript, которые тоже бы хотелось переложить на Autoit.
 
Верх