Moin,
Motiviert durch die gestrigen Animationen habe ich heute eine kleine Animation gebastelt.
Auf meinem Minirechner (hat keine Graka und nur einen IntelAtom) läuft der Spaß mehr oder weniger flüssig, wenns bei euch schneller ist könnt ihr die Größe erhöhen und die Anzahl hochschrauben.
AutoIt
#include <GDIPlus.au3>
Opt('GUIOnEventMode', 1)
Global Const $W = @DesktopWidth / 3 * 2, $H = @DesktopHeight / 3 * 2
Global Const $Anzahl = 12
Global $PEN, $GFX, $BUF, $BMP, $GUI, $TWI[$Anzahl], $BRU
Global Enum $CNT, $COL, $ANZ, $OFF, $DIS, $ROT, $DIA, $WID, $RAN, _
$ROT_End, $ROT_DisMul, $ROT_OffMul, $ROT_Dir, $DIR, $COL_Add
_GDIPlus_Startup()
$GUI = GUICreate('Test', $W, $H)
$GFX = _GDIPlus_GraphicsCreateFromHWND($GUI)
$BMP = _GDIPlus_BitmapCreateFromGraphics($W, $H, $GFX)
$BUF = _GDIPlus_ImageGetGraphicsContext($BMP)
$PEN = _GDIPlus_PenCreate()
$BRU = _GDIPlus_BrushCreateSolid(0x30000000)
_GDIPlus_GraphicsSetSmoothingMode($BUF, 2)
For $i = 1 To $Anzahl Step 1
$TWI[$i - 1] = _CreateTwister(60 + $i ^ 1.4 * 15, 6 + $i ^ 0.8 * Random(2, 4))
Next
OnAutoItExitRegister('_Dispose')
GUISetOnEvent(-3, '_Event', $GUI)
GUISetState(@SW_SHOW, $GUI)
While Sleep(10)
_GDIPlus_GraphicsFillRect($BUF, 0, 0, $W, $H, $BRU)
For $i = 0 To $Anzahl - 1 Step 1
_Twister($TWI[$i])
Next
_GDIPlus_GraphicsDrawImage($GFX, $BMP, 0, 0)
WEnd
Func _CreateTwister($_DIA, $_WID)
Local $a[15]
$a[$ANZ] = Random(6, 15, 1)
$a[$CNT] = Random(-555555, 555555)
$a[$COL] = 0
$a[$OFF] = 0
$a[$DIS] = 0
$a[$ROT] = 0
$a[$DIA] = $_DIA
$a[$WID] = $_WID
$a[$ROT_End] = 0
$a[$ROT_OffMul] = 0
$a[$ROT_DisMul] = 0
$a[$ROT_Dir] = 0
$a[$RAN] = Random(10, 20, 1)
$a[$DIR] = Random(-2.5, 2.5)
$a[$COL_Add] = Random(0, 10000)
Return $a
EndFunc ;==>_CreateTwister
Func _Twister(ByRef $a)
$a[$CNT] += $a[$DIR]
$a[$COL_Add] += 2
$a[$COL] = '0xAA' & Hex(Int(Sin(($a[$COL_Add] + $a[$CNT]) / 100) * 127.9 + 128), 2) & Hex(Int(Sin(($a[$COL_Add] + $a[$CNT]) / 150) * 127.9 + 128), 2) & Hex(Int(Cos(($a[$COL_Add] + $a[$CNT]) / 120) * 127.9 + 128), 2)
If $a[$ROT] Then
If Not $a[$ROT_End] Then
$a[$ROT_End] = Random(240, 480)
$a[$ROT_DisMul] = Random(0.7, 2)
$a[$ROT_OffMul] = Random(0.4, 2)
$a[$ROT_Dir] = Random(0, 1, 1)
EndIf
If $a[$ROT] > $a[$ROT_End] Then
$a[$ROT] /= 1.5
$a[$ROT_End] /= 1.5
If Round($a[$ROT], 0) = 0 Then
$a[$ROT_End] = 0
$a[$ROT] = 0
$a[$RAN] = Random(10, 20, 1)
EndIf
Else
$a[$ROT] += $a[$ROT] ^ 0.3
EndIf
$a[$DIS] = ($a[$DIS] * 6 + $a[$DIS] / $a[$ROT_DisMul]) / 7
$a[$OFF] = ($a[$OFF] * 7 + $a[$OFF] / $a[$ROT_OffMul]) / 8
If Not Random(0, 100, 1) Then
$a[$ANZ] += Random(-1, 1, 1)
If $a[$ANZ] < 5 Then $a[$ANZ] = 5
If $a[$ANZ] > 16 Then $a[$ANZ] = 16
EndIf
Else
If IsInt(Int($a[$CNT]) / $a[$RAN]) Then $a[$ROT] += 2
EndIf
If Not Random(0, 100, 1) Then $a[$DIR] = Random(-2.5, 2.5)
$a[$DIS] = ($a[$DIS] * 9 + $a[$WID]) / 10
$a[$OFF] = ($a[$OFF] * 8 + $a[$DIA]) / 9
DllCall($__g_hGDIPDll, 'int', 'GdipSetPenColor', 'handle', $PEN, 'dword', $a[$COL])
DllCall($__g_hGDIPDll, 'int', 'GdipSetPenWidth', 'handle', $PEN, 'float', $a[$DIS])
For $i = 0 To $a[$ANZ] - 1 Step 1
_PieSegment($BUF, $W / 2, $H / 2, $a[$OFF], $a[$OFF], $a[$DIS], $i * 360 / $a[$ANZ] + $a[$CNT] + ($a[$ROT_Dir] = 0) * $a[$ROT] * 2 - $a[$ROT], 300 / $a[$ANZ], $a[$COL])
Next
EndFunc ;==>_Twister
Func _PieSegment($GFX, $mX, $mY, $W, $H, $D, $fStart, $fSweep, $iCol)
DllCall($__g_hGDIPDll, 'int', 'GdipDrawArc', 'handle', $GFX, 'handle', $PEN, 'float', $mX + $D / 2 - $W / 2, 'float', $mY + $D / 2 - $H / 2, 'float', $W - $D, 'float', $H - $D, 'float', $fStart, 'float', $fSweep)
EndFunc ;==>_PieSegment
Func _Event()
Exit
EndFunc ;==>_Event
Func _Dispose()
_GDIPlus_BrushDispose($BRU)
_GDIPlus_GraphicsDispose($GFX)
_GDIPlus_GraphicsDispose($BUF)
_GDIPlus_BitmapDispose($BMP)
_GDIPlus_PenDispose($PEN)
_GDIPlus_Shutdown()
EndFunc ;==>_Dispose
Alles anzeigen
Edit: 28.09.18: Das skript hat es (wahrscheinlich vor langer Zeit) zerschossen, habe es repariert.
lg
Mars