xParticles

« Older   Newer »
  Share  
»Master
CAT_IMG Posted on 20/7/2012, 21:04     +1   +1   -1




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 :asd:


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
 
Top
bradipooso
CAT_IMG Posted on 20/7/2012, 21:11     +1   -1




mother-of-god

Mi aspettavo 7-800 linee
 
Top
Sbarabau
CAT_IMG Posted on 20/7/2012, 21:23     +1   -1




Tu sei malato delle GDI xD
Comunque è carino, bravo :asd:
 
Top
»Master
CAT_IMG Posted on 20/7/2012, 21:34     +1   -1




CITAZIONE (bradipooso @ 20/7/2012, 22:11)

xD ma è semplice ha sulle 100 linee senza la parte del controllo di FPS, colori, eccettera lol

CITAZIONE (Sbarabau @ 20/7/2012, 22:23)
Tu sei malato delle GDI xD
Comunque è carino, bravo :asd:

grazie, ma la parte delle GDI è stupidissima xD
l'accelerazione di ogni particola si che è stata leggermente difficile da fare :asd;
 
Top
*Sym98*
CAT_IMG Posted on 20/7/2012, 21:48     +1   -1




E' stupendo! xD

CITAZIONE (bradipooso @ 20/7/2012, 22:11) 

Quoto lol.
CITAZIONE (Sbarabau @ 20/7/2012, 22:23)
Tu sei malato delle GDI xD
Comunque è carino, bravo :asd:

RiQuoto. xD
Complimenti davvero, ma ti devo chiedere una cosa: ti hanno impiantato un microchip nel cervello per farti conoscere così bene le GDI+? Sarà che io le odio perchè non mi funzionano mai, ma tu fai cose impossibili. :asd: Un giorno mi insegnerai anche a me. lol
 
Top
»Master
CAT_IMG Posted on 21/7/2012, 00:10     +1   -1




looool ma basta che disegni un oggetto qualsiasi (nel caso sto disegnando un cerchio per ogni particola) e poi fai il draw sull'intera area della gui con un Brush che possiede del componente alpha e hai quell'effetto xD è infatti l'unica cosa che faccio con le GDI li asd
 
Top
th1sk
CAT_IMG Posted on 21/7/2012, 00:22     +1   -1




Comunque qui il fatto non è sapere usare le GDI+, ma è sapere la matematica ed avere un cervello :asd:

Sei un genio :asd:
 
Top
»Master
CAT_IMG Posted on 21/7/2012, 00:24     +1   -1




CITAZIONE (th1sk @ 21/7/2012, 01:22) 
Comunque qui il fatto non è sapere usare le GDI+, ma è sapere la matematica ed avere un cervello :asd:

Sei un genio :asd:

grazie :asd:
si infatti era cosa stavo provando a dire io xD e poi non è proprio necessario avere tanto cervello, è quasi basico :asd:


comunque, aggiornato :asd:
 
Top
CAT_IMG Posted on 21/7/2012, 00:40     +1   +1   -1

So implementare gli object

Group:
Admin
Posts:
1,215
Reputazione:
+150

Status:


La parte difficile qui è la fisica, non tanto la GDI...
 
Top
Snake442
CAT_IMG Posted on 21/7/2012, 08:28     +1   -1




CITAZIONE (bradipooso @ 20/7/2012, 22:11) 

Tocca quotare anche a me..
Davvero complimenti per il programma Master! Però i complimenti vanno anche a chi ha avuto l'idea! :)
 
Top
»Master
CAT_IMG Posted on 21/7/2012, 08:30     +1   -1




CITAZIONE (Snake442 @ 21/7/2012, 09:28) 
CITAZIONE (bradipooso @ 20/7/2012, 22:11) 

Tocca quotare anche a me..
Davvero complimenti per il programma Master! Però i complimenti vanno anche a chi ha avuto l'idea! :)

grazie xD veramente non mi ha dato l'idea propriamente lui, mi ha fatto vedere un video, dal cui ho avuto l'idea xD
 
Top
Snake442
CAT_IMG Posted on 21/7/2012, 08:33     +1   -1




CITAZIONE (»Master @ 21/7/2012, 09:30) 
CITAZIONE (Snake442 @ 21/7/2012, 09:28) 
Tocca quotare anche a me..
Davvero complimenti per il programma Master! Però i complimenti vanno anche a chi ha avuto l'idea! :)

grazie xD veramente non mi ha dato l'idea propriamente lui, mi ha fatto vedere un video, dal cui ho avuto l'idea xD

Allora sono tutti per te! ahaha :)
 
Top
11 replies since 20/7/2012, 21:04   275 views
  Share