ben alors, ça intéresse personne les particules 2D ? mh ?
Allez, comme je suis hyper sympathique, je vous poste deux petits essais de codes que j'ai fait ce matin.
Ils sont sans doute mal codés, n'hésitez pas à partir de ces codes et à les modifier pour obtenir d'autres effets, ou à les corriger si vous voyez des erreurs plus grosses qu'un éléphant

.
Le sprite que vous pouvez utiliser avec ces codes :
Un feu (avec des sprites3D) :
Code : Tout sélectionner
;**************************************************************
;{ informations
; particule system : Fire
; blendman
; date : 29/04/2011
; pb 4.60
;**************************************************************
;}
;**************************************************************
;{ variable
;**************************************************************
ShowCursor_(1)
Global inscreen=1
Global CheckTime
#FPS_LIMIT = 60
;}
;**************************************************************
;{ structure, array
;**************************************************************
; DirectX9 - merci G-tom
Structure D3DTLVERTEX
x.f:y.f:z.f
rhw.f:Color.l
tu.f:tv.f
EndStructure
Structure PB_DX9Sprite3D
;merci G-rom
TexRes.i ; TexRes
Vertice.D3DTLVERTEX[4] ; The 4 vertices for the rectangle sprite
TmpVertice.D3DTLVERTEX[4] ; The 4 vertices for the rectangle sprite
Width.l ; width set with ZoomSprite3D()
Height.l ; height set with ZoomSprite3D()
RealWidth.l
RealHeight.l
Angle.f
Transformed.l
EndStructure
Structure particule
id.i
size.f
position_x.f
position_y.f
life.i
vitesse.i
create.i
alpha.f
color.i
EndStructure
Global Dim particule.particule(0,0)
Procedure SetColor(Sprite3D, Color.l)
; merci G-rom
Protected *Sprite3D.PB_DX9Sprite3D = IsSprite3D(Sprite3D)
With *Sprite3D
\Vertice[0]\Color = Color.l
\Vertice[1]\Color = Color.l
\Vertice[2]\Color = Color.l
\Vertice[3]\Color = Color.l
EndWith
EndProcedure
;}
;**************************************************************
;{ declare
;**************************************************************
Declare gestion_souris()
Declare main()
Declare createParticleSystem(id.i,pos_x,pos_y,color.i,life.i=30,vitesse.i = 2,randpos.i=3,nb.i=10,size.i=1,alpha.i=50)
Declare drawParticuleSysteme(id.i,nb.i)
;}
;**************************************************************
;{ init
;**************************************************************
If InitSprite() And InitSprite3D() And InitKeyboard()And InitMouse() And UsePNGImageDecoder()
;
EndIf
;}
;**************************************************************
;{ openwindow
;**************************************************************
If OpenWindow(0,0,0,800,600,"particule",#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget)
If OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)
EndIf
EndIf
;}
;**************************************************************
;{ loading
;**************************************************************
LoadSprite(0,"part02.png",#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
CreateSprite3D(0,0)
;}
;**************************************************************
;{ Loop - repeat..
;**************************************************************
Repeat
If (ElapsedMilliseconds() > CheckTime + 1000 / #FPS_LIMIT)
CheckTime = ElapsedMilliseconds()
ClearScreen(RGB(125,125,125))
createParticleSystem(0,400,450,RGB(49,155,235),10,2,20,20,3,150)
;createParticleSystem(1,400,450,RGB(73,225,177),10,2,20,30,3,50)
drawParticuleSysteme(0,20)
;drawParticuleSysteme(1,30)
Else
Delay(16)
EndIf
event = WindowEvent()
main()
gestion_souris()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or event = #PB_Event_CloseWindow
End
;}
;**************************************************************
;{ procedures
;**************************************************************
Procedure gestion_souris()
; by netmaestro !!
mx = WindowMouseX(0):my = WindowMouseY(0)
If inscreen = 1
If mx> WindowWidth(0)-2 Or my> WindowHeight(0)-2 Or mx<1 Or my<1
inscreen = 0
ReleaseMouse(1) ; on libère la souris
EndIf
ElseIf mx <WindowWidth(0)-1 And my < WindowHeight(0)-1 And mx > 0 And my > 0
ReleaseMouse(0)
MouseLocate(mx,my)
inscreen = 1
EndIf
EndProcedure
Procedure main()
If ExamineMouse()
EndIf
If ExamineKeyboard()
EndIf
EndProcedure
Procedure createParticleSystem(id.i,pos_x,pos_y,color.i,life.i=30,vitesse.i = 2,randpos.i=3,nb.i=10,size.i=1,alpha.i=50)
ReDim particule(id,nb)
For i = 1 To nb
With particule(id,i)
If \life < -(40+Random(60)) Or \create =0
\create = 1
\id = i
\size = 1/(1+Random(size))
\position_x = pos_x + Random(randpos)
\position_y = pos_y + Random(randpos)/2
\life = Random(life)
\vitesse = Random(vitesse)
\alpha = Random(85)+ alpha
\color = color
EndIf
EndWith
Next i
EndProcedure
Procedure drawParticuleSysteme(id.i,nb.i)
For i=1 To nb
With particule(id,i)
\life -Random(2)
If \life > - 10 -Random(40)
\position_x + Random(\vitesse) - Random(\vitesse)
\position_y + Random(\vitesse/2) - Random(\vitesse/2)
ElseIf \life <= - Random(10)
\position_x + Random(\vitesse) - Random(\vitesse)
;\position_x + Random(\vitesse/2) - Random(\vitesse/2)
\position_y - 3*\vitesse
\alpha -1
EndIf
EndWith
Next i
Start3D()
Sprite3DBlendingMode(5,7);5,7 - 7,2
For i=1 To nb
With particule(id,i)
;ZoomSprite3D(0,0.5*SpriteWidth(0)*\size,0.5*SpriteHeight(0)*\size)
If \alpha >1
DisplaySprite3D(0,\position_x,\position_y,\alpha);+Random(50))
;SetColor(0, RGB(255,125,169)) violet
SetColor(0, \color) ;violet
;ZoomSprite3D(0,SpriteWidth(0),SpriteHeight(0))
EndIf
EndWith
Next i
Sprite3DBlendingMode(5,6)
Stop3D()
EndProcedure
;}
Des lucioles (idem) :
Code : Tout sélectionner
;**************************************************************
;{ informations
; particule system :
; blendman 2011/04
; souris : netmaestro
; date : 29/04/2011
; pb 4.60
;**************************************************************
;}
;**************************************************************
;{ variable
;**************************************************************
ShowCursor_(1)
Global inscreen=1
Global CheckTime
#FPS_LIMIT = 60
;}
;**************************************************************
;{ structure, array
;**************************************************************
Structure particule
size.i
position_x.l
position_y.l
life.i
vitesse.i
EndStructure
Global Dim particule.particule(0)
;}
;**************************************************************
;{ declare
;**************************************************************
Declare gestion_souris()
Declare main()
Declare createParticleSystem(pos_x,pos_y,life.i=30,vitesse.i = 2,randpos.i=3,nb.i=10,size.i=1)
Declare drawParticuleSysteme(nb.i)
;}
;**************************************************************
;{ init
;**************************************************************
If InitSprite() And InitSprite3D() And InitKeyboard()And InitMouse() And UsePNGImageDecoder()
;
EndIf
;}
;**************************************************************
;{ openwindow
;**************************************************************
If OpenWindow(0,0,0,800,600,"particule",#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget)
If OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)
EndIf
EndIf
;}
;**************************************************************
;{ loading
;**************************************************************
LoadSprite(0,"part02.png",#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
CreateSprite3D(0,0)
;}
;**************************************************************
;{ Loop - repeat..
;**************************************************************
createParticleSystem(300,300,30,1,120,10,15)
Repeat
If (ElapsedMilliseconds() > CheckTime + 1000 / #FPS_LIMIT)
CheckTime = ElapsedMilliseconds()
ClearScreen(RGB(125,125,125))
drawParticuleSysteme(10)
Else
Delay(16)
EndIf
event = WindowEvent()
main()
gestion_souris()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or event = #PB_Event_CloseWindow
End
;}
;**************************************************************
;{ procedures
;**************************************************************
Procedure gestion_souris()
; by netmaestro !!
mx = WindowMouseX(0):my = WindowMouseY(0)
If inscreen = 1
If mx> WindowWidth(0)-2 Or my> WindowHeight(0)-2 Or mx<1 Or my<1
inscreen = 0
ReleaseMouse(1) ; on libère la souris
EndIf
ElseIf mx <WindowWidth(0)-1 And my < WindowHeight(0)-1 And mx > 0 And my > 0
ReleaseMouse(0)
MouseLocate(mx,my)
inscreen = 1
EndIf
EndProcedure
Procedure main()
If ExamineMouse()
EndIf
If ExamineKeyboard()
EndIf
EndProcedure
Procedure createParticleSystem(pos_x,pos_y,life.i=30,vitesse.i = 2,randpos.i=3,nb.i=10,size.i=1)
ReDim particule(nb)
For i = 1 To nb
With particule(i)
\size = 1/(1+Random(size))
\position_x = pos_x + Random(randpos) - Random(randpos)
\position_y = pos_y + Random(randpos) - Random(randpos)
\life = life
\vitesse =vitesse
EndWith
Next i
EndProcedure
Procedure drawParticuleSysteme(nb.i)
For i=1 To nb
With particule(i)
\life -1
;If \life >1
\position_x + (Random(\vitesse) - Random(\vitesse)) *Random(2)
\position_y + (Random(\vitesse) - Random(\vitesse)) *Random(2)
EndWith
Next i
Start3D()
Sprite3DBlendingMode(5,7);5,7 - 7,2
For i=1 To nb
With particule(i)
;ZoomSprite3D(0,0.5*SpriteWidth(0)*\size,0.5*SpriteHeight(0)*\size)
DisplaySprite3D(0,\position_x,\position_y,50);+Random(50))
;ZoomSprite3D(0,SpriteWidth(0),SpriteHeight(0))
EndWith
Next i
Sprite3DBlendingMode(5,6)
Stop3D()
EndProcedure
;}
Ppour le code Fire, j'ai essayé de créer plusieurs systèmes de particules, mais je n'ai pas réussi à le faire

.
Si vous avez une idée pour ça, ça m'intéresse

.
N'hésitez pas à faire des tests, corriger mon code (sans doute pas terrible), ajouter des trucs ou en modifier et poster vos exemples, ce serait vraiment classe un sujet regroupant des codes liés aux particules et effets de ce genre

.