[2D] particules

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: [2D] particules

Message par Huitbit »

Hello,

Tu pouvais utiliser les coordonnées polaires (x=Rx*cos(a) et y=Ry*sin(a)) pour tracer la spirale, ça ne change rien aux calculs tout dépend de tes besoins.
Tu peux même précalculer les cos et les sin.

La spécifité du code c'était surtout l'inclinaison des ellipses :wink:

La méthode d'Euler permet d'effectuer un grand nombre de calculs, pour les particules, ça pourrait être utile :
(un autre code réactualisé (j'ai remplacé UseBuffer() par un GrabSprite (Merci G-Rom !) A l'époque, j'avais cherché une méthode pour tester ma pseudo carte graphique (comparer avec ou sans débugger)!!!)
http://www.purebasic.fr/french/viewtopi ... echistique
(Il y des fautes d'orthographes :oops: baListique, flèche :oops: )
(Diminue le nombre de flèches(600 par exemple) pour avoir un effet plus esthétique (Façon Léonidas de "300" :lol: ))

Code : Tout sélectionner

;trajectoires de projectiles
;auteur Huitbit
;pb v4.60;*********************************
#largeur_ecran=1024
#hauteur_ecran=768

;de 0 à 23, sprites de la flèche en rotation
#spr_fleche=24

#x_fleche_initial=#largeur_ecran/2
#y_fleche_initial=#hauteur_ecran/2

;-nombre de flèches
n.w=6000

Structure fleche
  x.w
  y.w
  vx.w
  vy.w
EndStructure

;-pas du calcul
dt.b=1

;-initialisation
;-précalcul du numéro du sprite à afficher
*MemoireID_numero_sprite = AllocateMemory(10200); 
For vx=-50 To 50 ;vitesse maximale 50
  If vx<>0
    For vy=-50 To 50
      numero_sprite= Int(180*ATan(vy/vx)/#PI/15) ; valeurs possibles de l'arctangente / 15 car 24 ( c'est à dire 360/15) flêches
      If vx<0 
        numero_sprite=12+numero_sprite
      ElseIf  vx>0 And vy<0
        numero_sprite=24+numero_sprite
      EndIf
      
      PokeB(*MemoireID_numero_sprite +(vx+50)*100+vy+50, numero_sprite)
      
    Next vy
  EndIf
Next vx

Dim fleche.fleche(n)
For i=0 To n
  fleche(i)\x=#x_fleche_initial
  fleche(i)\y=#y_fleche_initial
  fleche(i)\vx=-30+Random(60)
  fleche(i)\vy=-30+Random(60)
  If fleche(i)\vx=0
    fleche(i)\vx=1
  EndIf
Next i

;-PROGRAMME PRINCIPAL
InitSprite()
InitSprite3D()
InitKeyboard()
OpenWindow(0,0,0,#largeur_ecran,#hauteur_ecran,"Projectile",#PB_Window_ScreenCentered|#PB_Window_SystemMenu  )
OpenWindowedScreen(WindowID(0),0,0,#largeur_ecran,#hauteur_ecran,0,0,0)

;-dessin de la flêche
CreateSprite(#spr_fleche,32,32,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(#spr_fleche))
Ellipse(24,16,8,4,RGB(100,100,255))
Box(18,8,4,16,RGB(0,0,0))
Box(0,11,7,10,RGB(0,0,255))
Box(7,12,2,8,RGB(0,0,200))
Box(0,14,24,4,RGB(190, 127, 11))
StopDrawing()
CreateSprite3D(#spr_fleche,#spr_fleche)

;-dessin de la flèche dans toutes les positions
index_sprite=0
Start3D()
For angle=0 To 345 Step 15
  RotateSprite3D(#spr_fleche,angle,0)
  DisplaySprite3D(#spr_fleche,index_sprite*32,0)
  index_sprite=index_sprite+1
Next angle
Stop3D()
For i=0 To 23
GrabSprite(i,i*32,0,32,32) ;découpage du sprite en 24 sprites
Next i

;-BOUCLE PRINCIPALE
Repeat
  
  Repeat
    Event = WindowEvent()      
    If  Event = #PB_Event_CloseWindow
      End 
    EndIf
  Until Event = 0
  
  ClearScreen(RGB(0,0,0))
  For i=0 To n
    If  fleche(i)\x<#largeur_ecran And fleche(i)\x>0 And  fleche(i)\y<#hauteur_ecran And fleche(i)\y>0
      fleche(i)\vy= fleche(i)\vy+dt
;       fleche(i)\x= fleche(i)\x+ fleche(i)\vx*dt 
;       fleche(i)\y= fleche(i)\y+ fleche(i)\vy*dt
;Ici on choisi dt=1
      fleche(i)\x= fleche(i)\x+ fleche(i)\vx
      fleche(i)\y= fleche(i)\y+ fleche(i)\vy

      
      DisplayTransparentSprite(PeekB(*MemoireID_numero_sprite +(fleche(i)\vx+50)*100+fleche(i)\vy+50), fleche(i)\x, fleche(i)\y)
      
    Else
      fleche(i)\x=#x_fleche_initial
      fleche(i)\y=#y_fleche_initial
      fleche(i)\vx=-30+Random(60)
      fleche(i)\vy=-30+Random(60)
      If fleche(i)\vx=0
        fleche(i)\vx=1
      EndIf
      
    EndIf
  Next i
  
  ;-calcul du fps
  If Second < ElapsedMilliseconds() 
    Second = ElapsedMilliseconds()+1000
    fps = Frame_Counter 
    Frame_Counter = 0 
  Else 
    Frame_Counter + 1 
  EndIf     
  StartDrawing(ScreenOutput()) 
  DrawText(16,16,"FPS : "+Str(fps)) 
  DrawText(16,32,"Nombre de flèches : "+Str(n)) 
  StopDrawing() 
  
  Delay(1)
  FlipBuffers() 
ForEver
Hasta la vista !
Elevé au MSX !
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [2D] particules

Message par blendman »

Pas mal aussi celui-ci, on peut en faire un geyser, une fontaine, voir une explosion en modifiant certains paramètres :D
Merci ;)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [2D] particules

Message par blendman »

salut

Voici un nouveau système de particules, utilisant cette fois-ci les listes, c'est plus intéressant, car du coup, on peut créer autant de feu que l'on veut :).

Par exemple, en cliquant sur un sprite particulier, on pourra allumer une torche dans une grotte par exemple.

le code :

Code : Tout sélectionner

;{  informations
; particule system :
; blendman 2011/04
; date : 29/04/2011 -- 03/06/2011
; pb 4.60

;}

;{  variable
ShowCursor_(1) ; pour montrer le curseur
Global inscreen.b=1 ; variable globale pour vérifier si la souris est dans la fenêtre
Global CheckTime ; variable globale pour vérifier qu'on a fait une "boucle" complète
Global clicked.b = 0
#FPS_LIMIT = 60 ; constante qui "fixe" plus ou moins un fps maximum
;}

;{  structure, array
; DirectX9
; on a besoin de structure liée à directX 9, pour faire des
; transformations de sprites3D (changer de couleur par exemple)
Structure D3DTLVERTEX
   x.f:y.f:z.f
   rhw.f:Color.l
   tu.f:tv.f
EndStructure

Structure PB_DX9Sprite3D
   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
 
 ; puis, on crée une structure pour nos systèmes de particules 
 Structure particule
   id.l
   sprite.b
   size.f ; la taille de la particule
   position_x.f ; la position de la particule en x
   position_y.f ; la position de la particule en x
   life.i ; la vie de la particule
   vitesse.l  ; la vitesse de déplacement
   create.b ; variable pour savoir si elle a déjà été créée
   alpha.f ; pour la transparence de la particule
   color.l ; pour la couleur
 EndStructure
 
 Structure partsystem
   position_x.f
   position_y.f
 EndStructure
 
 
 Global NewList particule1.particule()
 Global NewList partsystem.partsystem()
 
; on créé un tableau pour notre système de particules
; le tableau est global pour pouvoir s'en servir dans les procédures, mais on aurait pu utiliser un pointeur pour ça.
;}

;{  declare
Declare gestion_souris()
Declare setcolor(Sprite3D, Color.l)
Declare main() ; la procédure principale
Declare createParticleSystem(id.i,pos_x,pos_y,color.i,sprite,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)
LoadSprite(1,"star1.png",#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
CreateSprite3D(1,1)
;}

;{  Loop - repeat..
Repeat  
  If (ElapsedMilliseconds() > CheckTime + 1000 / #FPS_LIMIT)
    CheckTime = ElapsedMilliseconds() 
    ClearScreen(RGB(125,125,125))
    ;createParticleSystem(0,400,450,RGB(49,155,235),20,2,20,20,3,150)
    createParticleSystem(0,MouseX()-32,MouseY()-32,RGB(49,155,235),0,20,2,20,20,3,150)
    If MouseButton(#PB_MouseButton_Left)=1 And clicked = 0
      clicked = 1 
      AddElement(partsystem())
      partsystem()\position_x = MouseX()-32
      partsystem()\position_y = MouseY()-32
      
    ElseIf MouseButton(#PB_MouseButton_Left) = 0 
      clicked = 0
    EndIf
    ; ceci est un feu magique
    createParticleSystem(0,400,500,RGB(49,155,235),0,20,2,20,20,3,150)
    createParticleSystem(0,400,500,RGB(255,125,169),1,10,3,20,20,3,150)
    createParticleSystem(1,400,550,RGB(255,125,169),0,20,2,20,20,3,150)
    
    If ListSize(partsystem())
      ForEach partsystem()
        createParticleSystem(0,partsystem()\position_x,partsystem()\position_y,RGB(49,155,235),0,20,2,20,20,3,150)
      Next 
    EndIf
       
      
    drawParticuleSysteme(0,20)
    
  Else
    Delay(16)
  EndIf  
    event = WindowEvent() 
    main() 
    gestion_souris()   
    ;createParticleSystem(400,400,RGB(255,125,250),10,2,40,60,3)  
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 SetColor(Sprite3D, Color.l)
   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

Procedure createParticleSystem(id.i,pos_x,pos_y,color.i,sprite,life.i=30,vitesse.i = 2,randpos.i=3,nb.i=10,size.i=1,alpha.i=50)
  
  AddElement(particule1())  
  With particule1()
    If \create = 0
      \create = 1
      \sprite = sprite
        \id = i
        \size = 1/(1+Random(size))
        \position_x = pos_x + Random(randpos)
        \position_y = pos_y + Random(randpos)/2
        \life = Random(life)
        \vitesse = 1+Random(vitesse)
        \alpha = Random(85)+ alpha
        \color = color
      EndIf      
    EndWith  
    
EndProcedure

Procedure drawParticuleSysteme(id.i,nb.i)
  
  ForEach particule1();i=1 To ListSize(particule1())
    With particule1()
      \life -Random(2)
      ;If \life > - 10
        \position_x + Random(\vitesse) - Random(\vitesse)
        \position_y -2*\vitesse;- Random(\vitesse)   
        ;Else
        If \life < 0
          \alpha -5
        EndIf
        
      If \life <= - Random(200)
          
      DeleteElement(particule1(),1)
      EndIf        
    EndWith
  Next 
  
  
  Start3D()
  ;5,7 - 7,2
  ForEach particule1()
    With particule1() 
      
      If \alpha >1
        If \id = 0
          Sprite3DBlendingMode(5,7)
          SetColor(0, \color)
          ZoomSprite3D(1,SpriteWidth(0)*\size,SpriteHeight(0)*\size)
          DisplaySprite3D(\sprite,\position_x,\position_y,\alpha);+Random(50))
          ;SetColor(0, RGB(255,125,169)) violet
           ZoomSprite3D(1,SpriteWidth(0),SpriteHeight(0))
          SetColor(0, \color) 
          Sprite3DBlendingMode(5,6)
        ElseIf \id = 1
          DisplaySprite3D(\sprite,\position_x,\position_y,\alpha);+Random(50))
          ;SetColor(0, RGB(255,125,169)) violet
           ;ZoomSprite3D(0,SpriteWidth(0),SpriteHeight(0))
          SetColor(0, \color) 
        EndIf     
      EndIf    
    EndWith
  Next 
  
  Stop3D() 
  
  StartDrawing(ScreenOutput())
  DrawingMode(#PB_2DDrawing_Transparent)
  If ListSize(particule1()) <> 0
    DrawText(50,50,Str(ListSize(particule1())))  
  EndIf
  StopDrawing()
  
  EndProcedure

  ;}
les images :
Image
Image

voiloutch :)
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: [2D] particules

Message par Huitbit »

Hello,

Ca marche pô :cry: [EDIT] car je suis une buse(voir plus loin) ! [EDIT]

Ecran gris avec le nbre de particules uniquement.
Système:
Microsoft Windows XP
Version 2002
Service Pack 3

Fabricant et support technique:
Hewlett-Packard Company
HP Pavilion
Intel(R)
Celeron(R) D CPU 3.20GHz
3.20 GHz, 960 Mo de RAM
ATI RADEON XPRESS200
Hasta la vista !
Dernière modification par Huitbit le dim. 05/juin/2011 17:39, modifié 2 fois.
Elevé au MSX !
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [2D] particules

Message par G-Rom »

@Huitbit , texture qui n'est pas puissance de 2 dans sa taille, ex 16x16 , 32x32 , 128x128 , etc...
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: [2D] particules

Message par Huitbit »

@G-Rom
C'est pourtant du 64*64 pour les deux Png
Elevé au MSX !
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: [2D] particules

Message par Thyphoon »

ça marche super !! :o)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [2D] particules

Message par G-Rom »

je croyais que c'était une seule image ^^
essaye de changer la résolution peut être.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [2D] particules

Message par blendman »

peut être le setcolor() ?

Sinon, je ne sais pas pourquoi ça ne marche pas chez toi, c'est bizarre.
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: [2D] particules

Message par Huitbit »

Ca marche nickel,
J'avais laissé traîner un directx7 dans les options du compilateur :oops:
Désolé !
Elevé au MSX !
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [2D] particules

Message par blendman »

roh.... :D

ben content que ça marche ;)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: [2D] particules

Message par djes »

Très joli! Pratique les listes, hein ;)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [2D] particules

Message par blendman »

djes a écrit :Très joli! Pratique les listes, hein ;)
carrément, je m'en sers pour beaucoup de choses : mobs, autres joueurs, drop, etc.. :D
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [2D] particules

Message par Ar-S »

Je détère un peu,
Salut blendman, as tu fais une version 5.31 de ton dernier code sur les patricles ; (date : 29/04/2011 -- 03/06/2011 ; pb 4.60)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: [2D] particules

Message par Mesa »

C'est une base.
Il ne reste plus qu'à gérer la transparence.

Code : Tout sélectionner

;{  informations
; particule system :
; blendman 2011/04
; date : 29/04/2011 -- 03/06/2011
; pb 4.60

;}

;{  variable
ShowCursor_(1) ; pour montrer le curseur
Global inscreen.b=1 ; variable globale pour vérifier si la souris est dans la fenêtre
Global CheckTime ; variable globale pour vérifier qu'on a fait une "boucle" complète
Global clicked.b = 0
#FPS_LIMIT = 60 ; constante qui "fixe" plus ou moins un fps maximum
;}

;{  structure, array
; DirectX9
; on a besoin de structure liée à directX 9, pour faire des
; transformations de sprites3D (changer de couleur par exemple)
Structure D3DTLVERTEX
		x.f:y.f:z.f
		rhw.f:Color.l
		tu.f:tv.f
EndStructure

Structure PB_DX9Sprite3D
		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

; puis, on crée une structure pour nos systèmes de particules 
Structure particule
		id.l
		sprite.b
		size.f ; la taille de la particule
		position_x.f ; la position de la particule en x
		position_y.f ; la position de la particule en x
		life.i ; la vie de la particule
		vitesse.l  ; la vitesse de déplacement
		create.b ; variable pour savoir si elle a déjà été créée
		alpha.f ; pour la transparence de la particule
		color.l ; pour la couleur
EndStructure

Structure partsystem
		position_x.f
		position_y.f
EndStructure


Global NewList particule1.particule()
Global NewList partsystem.partsystem()

; on créé un tableau pour notre système de particules
; le tableau est global pour pouvoir s'en servir dans les procédures, mais on aurait pu utiliser un pointeur pour ça.
;}

;{  declare
Declare gestion_souris()
Declare setcolor(Sprite3D, Color.l)
Declare main() ; la procédure principale
Declare createParticleSystem(id.i,pos_x,pos_y,color.i,sprite,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 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_AlphaBlending)

LoadSprite(1,"star1.png",#PB_Sprite_AlphaBlending)  

; TransparentSpriteColor(0, Couleur);TODO 
; TransparentSpriteColor(1, Couleur);TODO 


;}

;{  Loop - repeat..
Repeat  
	If (ElapsedMilliseconds() > CheckTime + 1000 / #FPS_LIMIT)
		CheckTime = ElapsedMilliseconds() 
		ClearScreen(RGB(125,125,125))
		;createParticleSystem(0,400,450,RGB(49,155,235),20,2,20,20,3,150)
		createParticleSystem(0,MouseX()-32,MouseY()-32,RGB(49,155,235),0,20,2,20,20,3,150)
		If MouseButton(#PB_MouseButton_Left)=1 And clicked = 0
			clicked = 1 
			AddElement(partsystem())
			partsystem()\position_x = MouseX()-32
			partsystem()\position_y = MouseY()-32
			
		ElseIf MouseButton(#PB_MouseButton_Left) = 0 
			clicked = 0
		EndIf
		; ceci est un feu magique
		createParticleSystem(0,400,500,RGB(49,155,235),0,20,2,20,20,3,150)
		createParticleSystem(0,400,500,RGB(255,125,169),1,10,3,20,20,3,150)
		createParticleSystem(1,400,550,RGB(255,125,169),0,20,2,20,20,3,150)
		
		If ListSize(partsystem())
			ForEach partsystem()
				createParticleSystem(0,partsystem()\position_x,partsystem()\position_y,RGB(49,155,235),0,20,2,20,20,3,150)
			Next 
		EndIf
				
			
		drawParticuleSysteme(0,20)
		
	Else
		Delay(16)
	EndIf  
		event = WindowEvent() 
		main() 
		gestion_souris()   
		;createParticleSystem(400,400,RGB(255,125,250),10,2,40,60,3)  
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 SetColor(Sprite3D, Color.l)
		Protected *Sprite3D.PB_DX9Sprite3D = IsSprite(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

Procedure createParticleSystem(id.i,pos_x,pos_y,color.i,sprite,life.i=30,vitesse.i = 2,randpos.i=3,nb.i=10,size.i=1,alpha.i=50)
	
	AddElement(particule1())  
	With particule1()
		If \create = 0
			\create = 1
			\sprite = sprite
				\id = i
				\size = 1/(1+Random(size))
				\position_x = pos_x + Random(randpos)
				\position_y = pos_y + Random(randpos)/2
				\life = Random(life)
				\vitesse = 1+Random(vitesse)
				\alpha = Random(85)+ alpha
				\color = color
			EndIf      
		EndWith  
		
EndProcedure

Procedure drawParticuleSysteme(id.i,nb.i)
	
	ForEach particule1();i=1 To ListSize(particule1())
		With particule1()
			\life -Random(2)
			;If \life > - 10
				\position_x + Random(\vitesse) - Random(\vitesse)
				\position_y -2*\vitesse;- Random(\vitesse)   
				;Else
				If \life < 0
					\alpha -5
				EndIf
				
			If \life <= - Random(200)
					
			DeleteElement(particule1(),1)
			EndIf        
		EndWith
	Next 
	


	;Start3D()
	;5,7 - 7,2
	ForEach particule1()
		With particule1() 
			
			If \alpha >1
				If \id = 0
					SpriteBlendingMode(5,7)
					SetColor(0, \color)
; 					TransparentSpriteColor(0, \alpha);TODO 
;           TransparentSpriteColor(1, \alpha);TODO 


					ZoomSprite(1,SpriteWidth(0)*\size,SpriteHeight(0)*\size)
					DisplayTransparentSprite(\sprite,\position_x,\position_y,\alpha);+Random(50))
					;SetColor(0, RGB(255,125,169)) violet
						ZoomSprite(1,SpriteWidth(0),SpriteHeight(0))
					SetColor(0, \color) 
					SpriteBlendingMode(5,6)
				ElseIf \id = 1
					DisplayTransparentSprite(\sprite,\position_x,\position_y,\alpha);+Random(50))
					;SetColor(0, RGB(255,125,169)) violet
						;ZoomSprite(0,SpriteWidth(0),SpriteHeight(0))
					SetColor(0, \color) 
				EndIf     
			EndIf    
		EndWith
	Next 
	
	;Stop3D() 
	
	StartDrawing(ScreenOutput())
	DrawingMode(#PB_2DDrawing_Transparent)
	If ListSize(particule1()) <> 0
		DrawText(50,50,Str(ListSize(particule1())))  
	EndIf
	StopDrawing()
	
	EndProcedure

	;}


M.
Répondre