| »Master |
| | xParticles Versione attuale : v0.7 CODICE Changelog 0.7 (20/07/2012) + Migliorata un po la dinamica delle particelle Nelle prossime versioni: + Diversi punti gravitazionali + Diversi punti di lancio di particelle + Diversi metodi di colorazione/misura particelle + Migliore gestione grafica + Aggiunta di algoritmi per creare altri effetti ancora più belli Allora, mi annoiavo quando gianlu mi ha dato l'idea di creare questo coso xD quindi l'ho fatto, è pronto da ieri, l'ho fatto in boh un'ora, tra perfezionamenti due ore, quindi beh se vi tratiene per 5 minuti è già troppo xD controllate il tutto con il mouse, se cliccate fa l'effetto contrario l'ho fatto tutto con le GDIPlus CODICE #include<GDIPlus.au3> #include<GUIConstantsEx.au3>
Opt("GUIOnEventMode", 1)
_GDIPlus_Startup()
Global Const $nPI = 3.1415926535897932384626433832795
#region ### VARS ### $version=0.1 $gtitle="xParticles by »Master v0.7 (20/07/2012)" $gWidth=500 $gHeight=500 ; @DesktopHeight*0.5
$vSpaceX=$gWidth $vSpaceY=$gHeight
$maxSampleVectorSize=20
$gravityAcc=98
$ATRITCONSTANT=1 If MsgBox(32+4, $gtitle, "Attivare attrito?")=6 Then $ATRITCONSTANT=0.985
Dim $COMP_val[3]=[-1, -1, -1]
$MSPF=45 ; 20 FPS $FPS=100
Dim $C_COMPONENTS[3]=[0xFF, 0xFF, 0xFF] Global $ParticleNumber=InputBox($gtitle, "Inserire il numero di particelle"&@CRLF&"Inserir numero de particulas"&@CRLF &"(CPU INTENSIVE) (0 = Dynamic)", 0) $DynamicResources=False If $ParticleNumber<=0 Then $DynamicResources=True $ParticleNumber=100 EndIf Global $ParticleLifeLimit=False If (MsgBox(36, $gtitle, "Attivare innietore di particelle?"&@CRLF&"Ativar injetor de partículas?")=6) Then $ParticleLifeLimit=True
Global $hParticleObject[$ParticleNumber][8] ; 0=pX, 1=pY, 2=Width, 3=Height, 4=AccVectorX, 5=AccVectorY, 6=ParticleLifeTime For $x=0 To UBound($hParticleObject, 1)-1 $hParticleObject[$x][0]=250 $hParticleObject[$x][1]=250 $hParticleObject[$x][2]=5 $hParticleObject[$x][3]=5 $hParticleObject[$x][4]=Random(-50, 50) $hParticleObject[$x][5]=Random(-50, 50) $hParticleObject[$x][6]=-$x $hParticleObject[$x][7]=1 Next
#endregion ### VARS ### ; #endregion ### VARS ###
$GUI=GUICreate($gtitle, $gWidth, $gHeight) GUISetOnEvent(-3, "_Exit") GUICtrlCreatePic("", 0, 0, $gWidth, $gHeight) GUICtrlSetBkColor(-1, 0x010101) GUISetBkColor(0x010101) GUISetState(@SW_SHOW)
#region ### GDIP OBJECTS ### $hGraph=_GDIPlus_GraphicsCreateFromHWND($GUI)
_GDIPlus_GraphicsSetSmoothingMode($hGraph, 2)
$hBKBrush=_GDIPlus_BrushCreateSolid(0x40010101) $hOBJBrush=_GDIPlus_BrushCreateSolid(0xFFFF0000)
$hSVLine=_GDIPlus_PenCreate(0xFFFFFFFF, 2) _GDIPlus_PenSetCustomEndCap($hSVLine, _GDIPlus_ArrowCapCreate(2, 2, False)) #endregion ### GDIP OBJECTS ### ; #endregion ### GDIP OBJECTS ### Sleep(500)
AdlibRegister("_GraphicsEngine_DrawFrame", $MSPF)
Do Sleep(100) Until False
Func _GraphicsEngine_DrawFrame() $timer=TimerInit()
_GraphicsEngine_DrawBack(0, 0, $vSpaceX, $vSpaceY) $COMP=Random(0, 2, 1) $C_COMPONENTS[$COMP]+=8*$COMP_val[$COMP] If $C_COMPONENTS[$COMP]>255 Then $C_COMPONENTS[$COMP]=255 $COMP_val[$COMP]=-1 EndIf If $C_COMPONENTS[$COMP]<80 Then $C_COMPONENTS[$COMP]=80 $COMP_val[$COMP]=1 EndIf
_GDIPlus_BrushSetSolidColor($hOBJBrush, "0xFF"&Hex($C_COMPONENTS[0], 2)&Hex($C_COMPONENTS[1], 2)&Hex($C_COMPONENTS[2], 2))
;~ _GraphicsEngine_DrawSampleVector($hParticleObject, 0, 2, 2, 40, 40) $MPos=GUIGetCursorInfo() For $x=0 To UBound($hParticleObject, 1)-1 If $hParticleObject[$x][7]=0 Then ContinueLoop If $ParticleLifeLimit=True Then $hParticleObject[$x][6]+=1 If $hParticleObject[$x][6]<0 Then ContinueLoop If $hParticleObject[$x][6]>$ParticleNumber Then $hParticleObject[$x][0]=250 $hParticleObject[$x][1]=250 $hParticleObject[$x][4]=Random(-50, 50) $hParticleObject[$x][5]=Random(-50, 50) $hParticleObject[$x][6]=0 EndIf EndIf If IsArray($MPos) And UBound($MPos)>=2 And $MPos[0]>0 And $MPos[0]<$vSpaceX And $MPos[1]>0 And $MPos[1]<$vSpaceY Then $Hx=$MPos[0]-$hParticleObject[$x][0] $dHx=$Hx If $dHx<0 Then $dHx*=-1 If $dHx<8 Then $dHx=8
$Hy=$MPos[1]-$hParticleObject[$x][1] $dHy=$Hy If $dHy<0 Then $dHy*=-1 If $dHy<8 Then $dHy=8
$dH=Sqrt($dHx^2+$dHy^2)
If Sqrt($dH)>18 Then $xComp=0 $yComp=0 $hParticleObject[$x][2]=2 $hParticleObject[$x][3]=2 Else $hParticleObject[$x][2]=1+Ceiling(((18-Sqrt($dH))/18)*5) $hParticleObject[$x][3]=1+Ceiling(((18-Sqrt($dH))/18)*5) If $MPos[2] Then $xComp=-($Hx/($dH^2))*190 $yComp=-($Hy/($dH^2))*190 Else $xComp=($Hx/($dH^2))*190 $yComp=($Hy/($dH^2))*190 EndIf EndIf
_PhysEngine_VectorApplyAcceleration($hParticleObject, $x, $xComp, $yComp) EndIf
_PhysEngine_ObjectCalcPos($hParticleObject, $x, 0.1)
_PhysEngine_ObjectWallCollisionCheck($hParticleObject, $x) Next
For $x=0 To UBound($hParticleObject, 1)-1 If $hParticleObject[$x][7]=0 Or ($ParticleLifeLimit=True And $hParticleObject[$x][6]<0) Then ContinueLoop _GDIPlus_GraphicsFillEllipse($hGraph, $hParticleObject[$x][0], $hParticleObject[$x][1], $hParticleObject[$x][2], $hParticleObject[$x][3], $hOBJBrush) Next If $DynamicResources=True Then If TimerDiff($timer)>$MSPF+10 Then $ParticleNumber-=1 $x=0 While $hParticleObject[$x][7]=0 $x=Random(0, UBound($hParticleObject, 1)-1, 1) WEnd _DebugWrite("Deactivated:"&$x) $hParticleObject[$x][7]=0 WinSetTitle($GUI, "", $gtitle&" particles: "&$ParticleNumber) ElseIf TimerDiff($timer)<$MSPF Then $ParticleNumber+=1 $x=UBound($hParticleObject, 1)-1 _DebugWrite("ParticleNumber="&$ParticleNumber&@TAB&"Ubound.ParticleNumber="&UBound($hParticleObject, 1)) While $hParticleObject[$x][7]=1 $x-=1 If $x=-1 Then ExitLoop WEnd If $x=-1 Then ReDim $hParticleObject[UBound($hParticleObject, 1)+1][UBound($hParticleObject, 2)] $x=UBound($hParticleObject, 1)-1 $hParticleObject[$x][0]=250 $hParticleObject[$x][1]=250 $hParticleObject[$x][2]=5 $hParticleObject[$x][3]=5 $hParticleObject[$x][4]=Random(-50, 50) $hParticleObject[$x][5]=Random(-50, 50) $hParticleObject[$x][6]=0 $hParticleObject[$x][7]=1 Else $hParticleObject[$x][0]=250 $hParticleObject[$x][1]=250 $hParticleObject[$x][4]=Random(-50, 50) $hParticleObject[$x][5]=Random(-50, 50) $hParticleObject[$x][7]=1 EndIf WinSetTitle($GUI, "", $gtitle&" particles: "&$ParticleNumber) EndIf EndIf EndFunc
Func _GraphicsEngine_DrawBack($x, $y, $w, $h) _GDIPlus_GraphicsFillRect($hGraph, $x, $y, $w, $h, $hBKBrush) EndFunc
Func _GraphicsEngine_DrawSampleVector(ByRef $PhysObject, $i, $x, $y, $w, $h) _GDIPlus_GraphicsDrawLine($hGraph, $x+$w/2, $y, $x+$w/2, $y+$h) _GDIPlus_GraphicsDrawLine($hGraph, $x, $y+$h/2, $x+$w, $y+$h/2) $cX=($PhysObject[$i][4]/$maxSampleVectorSize)*($w/2) $cY=($PhysObject[$i][5]/$maxSampleVectorSize)*($h/2) _GDIPlus_GraphicsDrawLine($hGraph, $x+$w/2, $y+$h/2, ($x+$w/2)+$cX, ($y+$h/2)+$cY, $hSVLine) EndFunc
Func _PhysEngine_ObjectWallCollisionCheck(ByRef $PhysObject, $i) If $PhysObject[$i][0]+$PhysObject[$i][2]>=$vSpaceX Or $PhysObject[$i][0]<=0 Then $PhysObject[$i][4]*=-Random(0.97, 0.99) $PhysObject[$i][5]*=Random(0.97, 0.99) If $PhysObject[$i][0]<0 Then $PhysObject[$i][0]=0 If $PhysObject[$i][0]+$PhysObject[$i][2]>$vSpaceX Then $PhysObject[$i][0]=$vSpaceX-$PhysObject[$i][2] EndIf If $PhysObject[$i][1]+$PhysObject[$i][3]>=$vSpaceY Or $PhysObject[$i][1]<=0 Then $PhysObject[$i][5]*=-Random(0.97, 0.99) $PhysObject[$i][4]*=Random(0.97, 0.99) If $PhysObject[$i][1]<0 Then $PhysObject[$i][1]=0 If $PhysObject[$i][1]+$PhysObject[$i][3]>$vSpaceY Then $PhysObject[$i][1]=$vSpaceY-$PhysObject[$i][3] EndIf EndFunc
Func _PhysEngine_ObjectCalcPos(ByRef $PhysObject, $i, $momentDelta) $PhysObject[$i][4]*=$ATRITCONSTANT $PhysObject[$i][5]*=$ATRITCONSTANT $PhysObject[$i][0]+=($PhysObject[$i][4])*$momentDelta $PhysObject[$i][1]+=($PhysObject[$i][5])*$momentDelta EndFunc
Func _PhysEngine_VectorApplyAcceleration(ByRef $PhysObject, $i, $pX, $pY)
$PhysObject[$i][4]+=$pX $PhysObject[$i][5]+=$pY
EndFunc
Func _Exit() Exit EndFunc
Func _DebugWrite($txt, $line=@ScriptLineNumber) ;~ ConsoleWrite("============>"&$line&@TAB&$txt) $txt=StringReplace($txt, @CRLF, @LF) $txt=StringReplace($txt, @CR, @LF) $split=StringSplit($txt, @LF) For $x=1 To $split[0] If $split[$x]<>"" Then ConsoleWrite(@LF&"===>"&@HOUR&":"&@MIN&":"&@SEC&"."&@MSEC&" - PID:"&@AutoItPID&" - "&$line&@TAB&"|"&$split[$x]) Next EndFunc Edited by »Master - 21/7/2012, 01:26
| | |
| |
|